Mercurial > hg > octave-nkf > gnulib-hg
annotate lib/closeout.c @ 1662:096732ffc839
Add comments.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Mon, 25 Jan 1999 00:13:36 +0000 |
parents | 9ad625a30b7d |
children | 69f2bf72fbe3 |
rev | line source |
---|---|
1197 | 1 /* closeout.c - close standard output |
1662 | 2 Copyright (C) 1998, 1999 Free Software Foundation, Inc. |
1197 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software Foundation, | |
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
17 | |
18 #if HAVE_CONFIG_H | |
19 # include <config.h> | |
20 #endif | |
21 | |
22 #if ENABLE_NLS | |
23 # include <libintl.h> | |
24 # define _(Text) gettext (Text) | |
25 #else | |
26 # define _(Text) Text | |
27 #endif | |
28 | |
1278
9ad625a30b7d
Use #if, not #ifdef with HAVE_ macros
Jim Meyering <jim@meyering.net>
parents:
1197
diff
changeset
|
29 #if HAVE_STDLIB_H |
1197 | 30 # include <stdlib.h> |
31 #endif | |
32 #ifndef EXIT_FAILURE | |
33 # define EXIT_FAILURE 1 | |
34 #endif | |
35 | |
36 #include <errno.h> | |
37 #ifndef errno | |
38 extern int errno; | |
39 #endif | |
40 | |
41 #include <stdio.h> | |
42 #include "closeout.h" | |
43 #include "error.h" | |
44 | |
1662 | 45 /* Close standard output, exiting with status STATUS on failure. |
46 If a program writes *anything* to stdout, that program should close | |
47 stdout and make sure that the close succeeds. Otherwise, suppose that | |
48 you go to the extreme of checking the return status of every function | |
49 that does an explicit write to stdout. The last printf can succeed in | |
50 writing to the internal stream buffer, and yet the fclose(stdout) could | |
51 still fail (due e.g., to a disk full error) when it tries to write | |
52 out that buffered data. Thus, you would be left with an incomplete | |
53 output file and the offending program would exit successfully. | |
54 | |
55 Besides, it's wasteful to check the return value from every call | |
56 that writes to stdout -- just let the internal stream state record | |
57 the failure. That's what the ferror test is checking below. | |
58 | |
59 It's important to detect such failures and exit nonzero because many | |
60 tools (most notably `make' and other build-management systems) depend | |
61 on being able to detect failure in other tools via their exit status. */ | |
1197 | 62 void |
63 close_stdout_status (int status) | |
64 { | |
65 if (ferror (stdout)) | |
66 error (status, 0, _("write error")); | |
67 if (fclose (stdout) != 0) | |
68 error (status, errno, _("write error")); | |
69 } | |
70 | |
71 /* Close standard output, exiting with status EXIT_FAILURE on failure. */ | |
72 void | |
73 close_stdout (void) | |
74 { | |
75 close_stdout_status (EXIT_FAILURE); | |
76 } |