Mercurial > hg > octave-nkf > gnulib-hg
annotate lib/closeout.c @ 1772:69f2bf72fbe3
fix comments
add FIXME
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Sun, 04 Apr 1999 14:30:30 +0000 |
parents | 096732ffc839 |
children | be6bb70a4fea |
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. |
1772 | 46 If a program writes *anything* to stdout, that program should `fflush' |
47 stdout and make sure that it succeeds before exiting. Otherwise, | |
48 suppose that you go to the extreme of checking the return status | |
49 of every function that does an explicit write to stdout. The last | |
50 printf can succeed in writing to the internal stream buffer, and yet | |
51 the fclose(stdout) could still fail (due e.g., to a disk full error) | |
52 when it tries to write out that buffered data. Thus, you would be | |
53 left with an incomplete output file and the offending program would | |
54 exit successfully. | |
55 | |
56 FIXME: note the fflush suggested above is implicit in the fclose | |
57 we actually do below. Consider doing only the fflush and/or using | |
58 setvbuf to inhibit buffering. | |
1662 | 59 |
60 Besides, it's wasteful to check the return value from every call | |
61 that writes to stdout -- just let the internal stream state record | |
62 the failure. That's what the ferror test is checking below. | |
63 | |
64 It's important to detect such failures and exit nonzero because many | |
65 tools (most notably `make' and other build-management systems) depend | |
66 on being able to detect failure in other tools via their exit status. */ | |
1197 | 67 void |
68 close_stdout_status (int status) | |
69 { | |
70 if (ferror (stdout)) | |
71 error (status, 0, _("write error")); | |
72 if (fclose (stdout) != 0) | |
73 error (status, errno, _("write error")); | |
74 } | |
75 | |
76 /* Close standard output, exiting with status EXIT_FAILURE on failure. */ | |
77 void | |
78 close_stdout (void) | |
79 { | |
80 close_stdout_status (EXIT_FAILURE); | |
81 } |