1*4882a593SmuzhiyunFrom af96fb92052c307818eefa4b687f964f1e3f542e Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Matt Weber <matthew.weber@rockwellcollins.com>
3*4882a593SmuzhiyunDate: Thu, 12 Sep 2019 15:04:35 -0500
4*4882a593SmuzhiyunSubject: [PATCH] notice read and write errors on input and output
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunQuoting from the bug report:
7*4882a593Smuzhiyun   bc (1.06-19ubuntu1) dapper; urgency=low
8*4882a593Smuzhiyun   * Make dc notice read and write errors on its input and output.
9*4882a593Smuzhiyun     I grepped for mentions of the strings `putc', `print', `getc',
10*4882a593Smuzhiyun     `FILE', `stdin', `stdout' and `stderr' and added calls to new
11*4882a593Smuzhiyun     error-checking functions unless it was clear from the
12*4882a593Smuzhiyun     immediately-surrounding code that the program was exiting
13*4882a593Smuzhiyun     nonzero, or would exit nonzero if the call failed.  I ignored
14*4882a593Smuzhiyun     hits in lib/getopt*, which seems to pervasively ignore write
15*4882a593Smuzhiyun     errors when printing usage messages, in the hope that these
16*4882a593Smuzhiyun     were correct.  I _think_ I got them all.  -iwj.
17*4882a593Smuzhiyun     -- Ian Jackson <iwj@ubuntu.com>  Tue,  4 Apr 2006 17:21:02 +0100
18*4882a593Smuzhiyun
19*4882a593SmuzhiyunUpsteam:
20*4882a593Smuzhiyunhttps://sources.debian.org/patches/bc/1.07.1-2/05_notice_read_write_errors.diff/
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun[Reformatted to GIT for 1.0.7.1 by Matt W]
23*4882a593SmuzhiyunUpdated by Ryan Kavanagh <rak@debian.org> for 1.0.7.1 on 26 July 2017.
24*4882a593SmuzhiyunAuthor: Ian Jackson <iwj@ubuntu.com>
25*4882a593SmuzhiyunOrigin: other
26*4882a593SmuzhiyunBug-Debian: http://bugs.debian.org/488735
27*4882a593Smuzhiyun
28*4882a593SmuzhiyunSigned-off-by: Matthew Weber <matthew.weber@rockwellcollins.com>
29*4882a593Smuzhiyun---
30*4882a593Smuzhiyun bc/execute.c | 10 +++++++++-
31*4882a593Smuzhiyun bc/main.c    |  3 +++
32*4882a593Smuzhiyun bc/sbc.y     |  2 ++
33*4882a593Smuzhiyun bc/scan.c    |  2 ++
34*4882a593Smuzhiyun bc/scan.l    |  3 +++
35*4882a593Smuzhiyun bc/util.c    | 15 ++++++++++++--
36*4882a593Smuzhiyun dc/dc.c      |  3 +++
37*4882a593Smuzhiyun dc/eval.c    | 55 +++++++++++++++++++++++++++++++++++++++-------------
38*4882a593Smuzhiyun dc/misc.c    |  1 +
39*4882a593Smuzhiyun dc/numeric.c |  9 +++++++++
40*4882a593Smuzhiyun dc/stack.c   | 11 ++++++++++-
41*4882a593Smuzhiyun dc/string.c  |  2 ++
42*4882a593Smuzhiyun h/number.h   | 11 +++++++----
43*4882a593Smuzhiyun lib/number.c | 24 +++++++++++++++++++++++
44*4882a593Smuzhiyun 14 files changed, 129 insertions(+), 22 deletions(-)
45*4882a593Smuzhiyun
46*4882a593Smuzhiyundiff --git a/bc/execute.c b/bc/execute.c
47*4882a593Smuzhiyunindex 256e4b7..50eac49 100644
48*4882a593Smuzhiyun--- a/bc/execute.c
49*4882a593Smuzhiyun+++ b/bc/execute.c
50*4882a593Smuzhiyun@@ -104,6 +104,7 @@ execute (void)
51*4882a593Smuzhiyun 	      }
52*4882a593Smuzhiyun 	    out_char ('\n');
53*4882a593Smuzhiyun 	  }
54*4882a593Smuzhiyun+	checkferror_output(stdout);
55*4882a593Smuzhiyun       }
56*4882a593Smuzhiyun #endif
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun@@ -224,6 +225,7 @@ execute (void)
59*4882a593Smuzhiyun 		}
60*4882a593Smuzhiyun 	    }
61*4882a593Smuzhiyun 	fflush (stdout);
62*4882a593Smuzhiyun+	checkferror_output(stdout);
63*4882a593Smuzhiyun 	break;
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun       case 'R' : /* Return from function */
66*4882a593Smuzhiyun@@ -259,6 +261,7 @@ execute (void)
67*4882a593Smuzhiyun 	if (inst == 'W') out_char ('\n');
68*4882a593Smuzhiyun 	store_var (4);  /* Special variable "last". */
69*4882a593Smuzhiyun 	fflush (stdout);
70*4882a593Smuzhiyun+	checkferror_output(stdout);
71*4882a593Smuzhiyun 	pop ();
72*4882a593Smuzhiyun 	break;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun@@ -342,6 +345,7 @@ execute (void)
75*4882a593Smuzhiyun       case 'w' : /* Write a string to the output. */
76*4882a593Smuzhiyun 	while ((ch = byte(&pc)) != '"') out_schar (ch);
77*4882a593Smuzhiyun 	fflush (stdout);
78*4882a593Smuzhiyun+	checkferror_output(stdout);
79*4882a593Smuzhiyun 	break;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun       case 'x' : /* Exchange Top of Stack with the one under the tos. */
82*4882a593Smuzhiyun@@ -549,7 +553,10 @@ execute (void)
83*4882a593Smuzhiyun     {
84*4882a593Smuzhiyun       signal (SIGINT, use_quit);
85*4882a593Smuzhiyun       if (had_sigint)
86*4882a593Smuzhiyun-	printf ("\ninterrupted execution.\n");
87*4882a593Smuzhiyun+	{
88*4882a593Smuzhiyun+	  printf ("\ninterrupted execution.\n");
89*4882a593Smuzhiyun+	  checkferror_output(stdout);
90*4882a593Smuzhiyun+	}
91*4882a593Smuzhiyun     }
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun@@ -584,6 +591,7 @@ input_char (void)
95*4882a593Smuzhiyun 	  out_col = 0;  /* Saw a new line */
96*4882a593Smuzhiyun 	}
97*4882a593Smuzhiyun     }
98*4882a593Smuzhiyun+  checkferror_input(stdin);
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun   /* Classify and preprocess the input character. */
101*4882a593Smuzhiyun   if (isdigit(in_ch))
102*4882a593Smuzhiyundiff --git a/bc/main.c b/bc/main.c
103*4882a593Smuzhiyunindex 012075c..c96207b 100644
104*4882a593Smuzhiyun--- a/bc/main.c
105*4882a593Smuzhiyun+++ b/bc/main.c
106*4882a593Smuzhiyun@@ -353,6 +353,9 @@ use_quit (int sig)
107*4882a593Smuzhiyun   errno = save;
108*4882a593Smuzhiyun #else
109*4882a593Smuzhiyun   write (1, "\n(interrupt) Exiting bc.\n", 26);
110*4882a593Smuzhiyun+#ifdef READLINE
111*4882a593Smuzhiyun+  rl_initialize (); /* Clear readline buffer */
112*4882a593Smuzhiyun+#endif
113*4882a593Smuzhiyun   bc_exit(0);
114*4882a593Smuzhiyun #endif
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyundiff --git a/bc/sbc.y b/bc/sbc.y
117*4882a593Smuzhiyunindex 586686b..921ab1e 100644
118*4882a593Smuzhiyun--- a/bc/sbc.y
119*4882a593Smuzhiyun+++ b/bc/sbc.y
120*4882a593Smuzhiyun@@ -86,7 +86,9 @@ program			: /* empty */
121*4882a593Smuzhiyun 			      if (interactive && !quiet)
122*4882a593Smuzhiyun 				{
123*4882a593Smuzhiyun 				  show_bc_version ();
124*4882a593Smuzhiyun+				  checkferror_output(stdout);
125*4882a593Smuzhiyun 				  welcome ();
126*4882a593Smuzhiyun+				  checkferror_output(stdout);
127*4882a593Smuzhiyun 				}
128*4882a593Smuzhiyun 			    }
129*4882a593Smuzhiyun 			| program input_item
130*4882a593Smuzhiyundiff --git a/bc/scan.c b/bc/scan.c
131*4882a593Smuzhiyunindex b237f55..8dee4e9 100644
132*4882a593Smuzhiyun--- a/bc/scan.c
133*4882a593Smuzhiyun+++ b/bc/scan.c
134*4882a593Smuzhiyun@@ -791,6 +791,7 @@ bcel_input (char *buf, yy_size_t  *result, int max)
135*4882a593Smuzhiyun       if (bcel_len != 0)
136*4882a593Smuzhiyun 	history (hist, &histev, H_ENTER, bcel_line);
137*4882a593Smuzhiyun       fflush (stdout);
138*4882a593Smuzhiyun+      checkferror_output(stdout);
139*4882a593Smuzhiyun     }
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun   if (bcel_len <= max)
142*4882a593Smuzhiyun@@ -863,6 +864,7 @@ rl_input (char *buf, int *result, int max)
143*4882a593Smuzhiyun 	add_history (rl_line);
144*4882a593Smuzhiyun       rl_line[rl_len-1] = '\n';
145*4882a593Smuzhiyun       fflush (stdout);
146*4882a593Smuzhiyun+      checkferror_output(stdout);
147*4882a593Smuzhiyun     }
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun   if (rl_len <= max)
150*4882a593Smuzhiyundiff --git a/bc/scan.l b/bc/scan.l
151*4882a593Smuzhiyunindex eb2e2dd..79186bb 100644
152*4882a593Smuzhiyun--- a/bc/scan.l
153*4882a593Smuzhiyun+++ b/bc/scan.l
154*4882a593Smuzhiyun@@ -99,6 +99,7 @@ bcel_input (char *buf, yy_size_t  *result, int max)
155*4882a593Smuzhiyun       if (bcel_len != 0)
156*4882a593Smuzhiyun 	history (hist, &histev, H_ENTER, bcel_line);
157*4882a593Smuzhiyun       fflush (stdout);
158*4882a593Smuzhiyun+      checkferror_output(stdout);
159*4882a593Smuzhiyun     }
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun   if (bcel_len <= max)
162*4882a593Smuzhiyun@@ -171,6 +172,7 @@ rl_input (char *buf, int *result, int max)
163*4882a593Smuzhiyun 	add_history (rl_line);
164*4882a593Smuzhiyun       rl_line[rl_len-1] = '\n';
165*4882a593Smuzhiyun       fflush (stdout);
166*4882a593Smuzhiyun+      checkferror_output(stdout);
167*4882a593Smuzhiyun     }
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun   if (rl_len <= max)
170*4882a593Smuzhiyun@@ -295,6 +297,7 @@ limits return(Limits);
171*4882a593Smuzhiyun 	    if (c == EOF)
172*4882a593Smuzhiyun 	      {
173*4882a593Smuzhiyun 		fprintf (stderr,"EOF encountered in a comment.\n");
174*4882a593Smuzhiyun+                checkferror_output(stderr);
175*4882a593Smuzhiyun 		break;
176*4882a593Smuzhiyun 	      }
177*4882a593Smuzhiyun 	  }
178*4882a593Smuzhiyundiff --git a/bc/util.c b/bc/util.c
179*4882a593Smuzhiyunindex 8eba093..cacd796 100644
180*4882a593Smuzhiyun--- a/bc/util.c
181*4882a593Smuzhiyun+++ b/bc/util.c
182*4882a593Smuzhiyun@@ -247,9 +247,10 @@ init_gen (void)
183*4882a593Smuzhiyun   continue_label = 0;
184*4882a593Smuzhiyun   next_label  = 1;
185*4882a593Smuzhiyun   out_count = 2;
186*4882a593Smuzhiyun-  if (compile_only)
187*4882a593Smuzhiyun+  if (compile_only) {
188*4882a593Smuzhiyun     printf ("@i");
189*4882a593Smuzhiyun-  else
190*4882a593Smuzhiyun+    checkferror_output(stdout);
191*4882a593Smuzhiyun+  } else
192*4882a593Smuzhiyun     init_load ();
193*4882a593Smuzhiyun   had_error = FALSE;
194*4882a593Smuzhiyun   did_gen = FALSE;
195*4882a593Smuzhiyun@@ -272,6 +273,7 @@ generate (const char *str)
196*4882a593Smuzhiyun 	  printf ("\n");
197*4882a593Smuzhiyun 	  out_count = 0;
198*4882a593Smuzhiyun 	}
199*4882a593Smuzhiyun+      checkferror_output(stdout);
200*4882a593Smuzhiyun     }
201*4882a593Smuzhiyun   else
202*4882a593Smuzhiyun     load_code (str);
203*4882a593Smuzhiyun@@ -289,6 +291,7 @@ run_code(void)
204*4882a593Smuzhiyun       if (compile_only)
205*4882a593Smuzhiyun 	{
206*4882a593Smuzhiyun 	  printf ("@r\n");
207*4882a593Smuzhiyun+	  checkferror_output(stdout);
208*4882a593Smuzhiyun 	  out_count = 0;
209*4882a593Smuzhiyun 	}
210*4882a593Smuzhiyun       else
211*4882a593Smuzhiyun@@ -326,6 +329,7 @@ out_char (int ch)
212*4882a593Smuzhiyun 	}
213*4882a593Smuzhiyun       putchar (ch);
214*4882a593Smuzhiyun     }
215*4882a593Smuzhiyun+  checkferror_output(stdout);
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun /* Output routines: Write a character CH to the standard output.
219*4882a593Smuzhiyun@@ -355,6 +359,7 @@ out_schar (int ch)
220*4882a593Smuzhiyun 	}
221*4882a593Smuzhiyun       putchar (ch);
222*4882a593Smuzhiyun     }
223*4882a593Smuzhiyun+  checkferror_output(stdout);
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun@@ -639,6 +644,7 @@ limits(void)
228*4882a593Smuzhiyun #ifdef OLD_EQ_OP
229*4882a593Smuzhiyun   printf ("Old assignment operatiors are valid. (=-, =+, ...)\n");
230*4882a593Smuzhiyun #endif
231*4882a593Smuzhiyun+  checkferror_output(stdout);
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun /* bc_malloc will check the return value so all other places do not
235*4882a593Smuzhiyun@@ -703,6 +709,7 @@ yyerror (str, va_alist)
236*4882a593Smuzhiyun   fprintf (stderr,"%s %d: ",name,line_no);
237*4882a593Smuzhiyun   vfprintf (stderr, str, args);
238*4882a593Smuzhiyun   fprintf (stderr, "\n");
239*4882a593Smuzhiyun+  checkferror_output(stderr);
240*4882a593Smuzhiyun   had_error = TRUE;
241*4882a593Smuzhiyun   va_end (args);
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun@@ -743,6 +750,7 @@ ct_warn (mesg, va_alist)
244*4882a593Smuzhiyun       fprintf (stderr,"%s %d: Error: ",name,line_no);
245*4882a593Smuzhiyun       vfprintf (stderr, mesg, args);
246*4882a593Smuzhiyun       fprintf (stderr, "\n");
247*4882a593Smuzhiyun+      checkferror_output(stderr);
248*4882a593Smuzhiyun       had_error = TRUE;
249*4882a593Smuzhiyun     }
250*4882a593Smuzhiyun   else
251*4882a593Smuzhiyun@@ -755,6 +763,7 @@ ct_warn (mesg, va_alist)
252*4882a593Smuzhiyun 	fprintf (stderr,"%s %d: (Warning) ",name,line_no);
253*4882a593Smuzhiyun 	vfprintf (stderr, mesg, args);
254*4882a593Smuzhiyun 	fprintf (stderr, "\n");
255*4882a593Smuzhiyun+	checkferror_output(stderr);
256*4882a593Smuzhiyun       }
257*4882a593Smuzhiyun   va_end (args);
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun@@ -789,6 +798,7 @@ rt_error (mesg, va_alist)
260*4882a593Smuzhiyun   va_end (args);
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun   fprintf (stderr, "\n");
263*4882a593Smuzhiyun+  checkferror_output(stderr);
264*4882a593Smuzhiyun   runtime_error = TRUE;
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun@@ -823,6 +833,7 @@ rt_warn (const char *mesg)
268*4882a593Smuzhiyun   va_end (args);
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun   fprintf (stderr, "\n");
271*4882a593Smuzhiyun+  checkferror_output(stderr);
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun /* bc_exit: Make sure to reset the edit state. */
275*4882a593Smuzhiyundiff --git a/dc/dc.c b/dc/dc.c
276*4882a593Smuzhiyunindex 6a2bb26..ccdb1c2 100644
277*4882a593Smuzhiyun--- a/dc/dc.c
278*4882a593Smuzhiyun+++ b/dc/dc.c
279*4882a593Smuzhiyun@@ -59,6 +59,7 @@ static void
280*4882a593Smuzhiyun bug_report_info DC_DECLVOID()
281*4882a593Smuzhiyun {
282*4882a593Smuzhiyun 	printf("Email bug reports to:  bug-dc@gnu.org .\n");
283*4882a593Smuzhiyun+	checkferror_output(stdout);
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun static void
287*4882a593Smuzhiyun@@ -69,6 +70,7 @@ show_version DC_DECLVOID()
288*4882a593Smuzhiyun This is free software; see the source for copying conditions.  There is NO\n\
289*4882a593Smuzhiyun warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n\
290*4882a593Smuzhiyun to the extent permitted by law.\n", DC_COPYRIGHT);
291*4882a593Smuzhiyun+	checkferror_output(stdout);
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun /* your generic usage function */
295*4882a593Smuzhiyun@@ -85,6 +87,7 @@ Usage: %s [OPTION] [file ...]\n\
296*4882a593Smuzhiyun \n\
297*4882a593Smuzhiyun ", progname);
298*4882a593Smuzhiyun 	bug_report_info();
299*4882a593Smuzhiyun+	checkferror_output(f);
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun /* returns a pointer to one past the last occurance of c in s,
303*4882a593Smuzhiyundiff --git a/dc/eval.c b/dc/eval.c
304*4882a593Smuzhiyunindex 05a3d9e..6c54e61 100644
305*4882a593Smuzhiyun--- a/dc/eval.c
306*4882a593Smuzhiyun+++ b/dc/eval.c
307*4882a593Smuzhiyun@@ -97,12 +97,15 @@ static int input_pushback;
308*4882a593Smuzhiyun static int
309*4882a593Smuzhiyun input_fil DC_DECLVOID()
310*4882a593Smuzhiyun {
311*4882a593Smuzhiyun+		int c;
312*4882a593Smuzhiyun 	if (input_pushback != EOF){
313*4882a593Smuzhiyun-		int c = input_pushback;
314*4882a593Smuzhiyun+		c = input_pushback;
315*4882a593Smuzhiyun 		input_pushback = EOF;
316*4882a593Smuzhiyun 		return c;
317*4882a593Smuzhiyun 	}
318*4882a593Smuzhiyun-	return getc(input_fil_fp);
319*4882a593Smuzhiyun+	c = getc(input_fil_fp);
320*4882a593Smuzhiyun+	checkferror_input(input_fil_fp);
321*4882a593Smuzhiyun+	return c;
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun /* passed as an argument to dc_getnum */
325*4882a593Smuzhiyun@@ -301,11 +304,13 @@ dc_func DC_DECLARG((c, peekc, negcmp))
326*4882a593Smuzhiyun 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
327*4882a593Smuzhiyun 			if (2 <= tmpint  &&  tmpint <= DC_IBASE_MAX)
328*4882a593Smuzhiyun 				dc_ibase = tmpint;
329*4882a593Smuzhiyun-			else
330*4882a593Smuzhiyun+			else {
331*4882a593Smuzhiyun 				fprintf(stderr,
332*4882a593Smuzhiyun 						"%s: input base must be a number \
333*4882a593Smuzhiyun between 2 and %d (inclusive)\n",
334*4882a593Smuzhiyun 						progname, DC_IBASE_MAX);
335*4882a593Smuzhiyun+				checkferror_output(stderr);
336*4882a593Smuzhiyun+			}
337*4882a593Smuzhiyun 		}
338*4882a593Smuzhiyun 		break;
339*4882a593Smuzhiyun 	case 'k':	/* set scale to value on top of stack */
340*4882a593Smuzhiyun@@ -313,11 +318,12 @@ between 2 and %d (inclusive)\n",
341*4882a593Smuzhiyun 			tmpint = -1;
342*4882a593Smuzhiyun 			if (datum.dc_type == DC_NUMBER)
343*4882a593Smuzhiyun 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
344*4882a593Smuzhiyun-			if ( ! (tmpint >= 0) )
345*4882a593Smuzhiyun+			if ( ! (tmpint >= 0) ) {
346*4882a593Smuzhiyun 				fprintf(stderr,
347*4882a593Smuzhiyun 						"%s: scale must be a nonnegative number\n",
348*4882a593Smuzhiyun 						progname);
349*4882a593Smuzhiyun-			else
350*4882a593Smuzhiyun+				checkferror_output(stderr);
351*4882a593Smuzhiyun+			} else
352*4882a593Smuzhiyun 				dc_scale = tmpint;
353*4882a593Smuzhiyun 		}
354*4882a593Smuzhiyun 		break;
355*4882a593Smuzhiyun@@ -341,11 +347,12 @@ between 2 and %d (inclusive)\n",
356*4882a593Smuzhiyun 			tmpint = 0;
357*4882a593Smuzhiyun 			if (datum.dc_type == DC_NUMBER)
358*4882a593Smuzhiyun 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
359*4882a593Smuzhiyun-			if ( ! (tmpint > 1) )
360*4882a593Smuzhiyun+			if ( ! (tmpint > 1) ) {
361*4882a593Smuzhiyun 				fprintf(stderr,
362*4882a593Smuzhiyun 						"%s: output base must be a number greater than 1\n",
363*4882a593Smuzhiyun 						progname);
364*4882a593Smuzhiyun-			else
365*4882a593Smuzhiyun+				checkferror_output(stderr);
366*4882a593Smuzhiyun+			} else
367*4882a593Smuzhiyun 				dc_obase = tmpint;
368*4882a593Smuzhiyun 		}
369*4882a593Smuzhiyun 		break;
370*4882a593Smuzhiyun@@ -378,6 +385,7 @@ between 2 and %d (inclusive)\n",
371*4882a593Smuzhiyun 				fprintf(stderr,
372*4882a593Smuzhiyun 						"%s: square root of nonnumeric attempted\n",
373*4882a593Smuzhiyun 						progname);
374*4882a593Smuzhiyun+				checkferror_output(stderr);
375*4882a593Smuzhiyun 			}else if (dc_sqrt(datum.v.number, dc_scale, &tmpnum) == DC_SUCCESS){
376*4882a593Smuzhiyun 				dc_free_num(&datum.v.number);
377*4882a593Smuzhiyun 				datum.v.number = tmpnum;
378*4882a593Smuzhiyun@@ -424,6 +432,7 @@ between 2 and %d (inclusive)\n",
379*4882a593Smuzhiyun 				dc_garbage("at top of stack", -1);
380*4882a593Smuzhiyun 		}
381*4882a593Smuzhiyun 		fflush(stdout);
382*4882a593Smuzhiyun+		checkferror_output(stdout);
383*4882a593Smuzhiyun 		break;
384*4882a593Smuzhiyun 	case 'Q':	/* quit out of top-of-stack nested evals;
385*4882a593Smuzhiyun 				 * pops value from stack;
386*4882a593Smuzhiyun@@ -440,6 +449,7 @@ between 2 and %d (inclusive)\n",
387*4882a593Smuzhiyun 			fprintf(stderr,
388*4882a593Smuzhiyun 					"%s: Q command requires a number >= 1\n",
389*4882a593Smuzhiyun 					progname);
390*4882a593Smuzhiyun+			checkferror_output(stderr);
391*4882a593Smuzhiyun 		}
392*4882a593Smuzhiyun 		break;
393*4882a593Smuzhiyun 	case 'R':	/* pop a value off of the evaluation stack,;
394*4882a593Smuzhiyun@@ -483,11 +493,12 @@ between 2 and %d (inclusive)\n",
395*4882a593Smuzhiyun 			if (datum.dc_type == DC_NUMBER)
396*4882a593Smuzhiyun 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
397*4882a593Smuzhiyun 			if (dc_pop(&datum) == DC_SUCCESS){
398*4882a593Smuzhiyun-				if (tmpint < 0)
399*4882a593Smuzhiyun+				if (tmpint < 0) {
400*4882a593Smuzhiyun 					fprintf(stderr,
401*4882a593Smuzhiyun 							"%s: array index must be a nonnegative integer\n",
402*4882a593Smuzhiyun 							progname);
403*4882a593Smuzhiyun-				else
404*4882a593Smuzhiyun+					checkferror_output(stderr);
405*4882a593Smuzhiyun+				} else
406*4882a593Smuzhiyun 					dc_array_set(peekc, tmpint, datum);
407*4882a593Smuzhiyun 			}
408*4882a593Smuzhiyun 		}
409*4882a593Smuzhiyun@@ -499,18 +510,21 @@ between 2 and %d (inclusive)\n",
410*4882a593Smuzhiyun 			tmpint = -1;
411*4882a593Smuzhiyun 			if (datum.dc_type == DC_NUMBER)
412*4882a593Smuzhiyun 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
413*4882a593Smuzhiyun-			if (tmpint < 0)
414*4882a593Smuzhiyun+			if (tmpint < 0) {
415*4882a593Smuzhiyun 				fprintf(stderr,
416*4882a593Smuzhiyun 						"%s: array index must be a nonnegative integer\n",
417*4882a593Smuzhiyun 						progname);
418*4882a593Smuzhiyun-			else
419*4882a593Smuzhiyun+				checkferror_output(stderr);
420*4882a593Smuzhiyun+			} else
421*4882a593Smuzhiyun 				dc_push(dc_array_get(peekc, tmpint));
422*4882a593Smuzhiyun 		}
423*4882a593Smuzhiyun 		return DC_EATONE;
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun 	default:	/* What did that user mean? */
426*4882a593Smuzhiyun 		fprintf(stderr, "%s: ", progname);
427*4882a593Smuzhiyun+		checkferror_output(stderr);
428*4882a593Smuzhiyun 		dc_show_id(stdout, c, " unimplemented\n");
429*4882a593Smuzhiyun+		checkferror_output(stdout);
430*4882a593Smuzhiyun 		break;
431*4882a593Smuzhiyun 	}
432*4882a593Smuzhiyun 	return DC_OKAY;
433*4882a593Smuzhiyun@@ -538,6 +552,7 @@ evalstr DC_DECLARG((string))
434*4882a593Smuzhiyun 		fprintf(stderr,
435*4882a593Smuzhiyun 				"%s: eval called with non-string argument\n",
436*4882a593Smuzhiyun 				progname);
437*4882a593Smuzhiyun+		checkferror_output(stderr);
438*4882a593Smuzhiyun 		return DC_OKAY;
439*4882a593Smuzhiyun 	}
440*4882a593Smuzhiyun 	interrupt_seen = 0;
441*4882a593Smuzhiyun@@ -635,6 +650,7 @@ evalstr DC_DECLARG((string))
442*4882a593Smuzhiyun 				return DC_FAIL;
443*4882a593Smuzhiyun 			}
444*4882a593Smuzhiyun 			fprintf(stderr, "%s: unexpected EOS\n", progname);
445*4882a593Smuzhiyun+			checkferror_output(stderr);
446*4882a593Smuzhiyun 			return DC_OKAY;
447*4882a593Smuzhiyun 		}
448*4882a593Smuzhiyun 	}
449*4882a593Smuzhiyun@@ -692,6 +708,7 @@ dc_evalfile DC_DECLARG((fp))
450*4882a593Smuzhiyun 	stdin_lookahead = EOF;
451*4882a593Smuzhiyun 	for (c=getc(fp); c!=EOF; c=peekc){
452*4882a593Smuzhiyun 		peekc = getc(fp);
453*4882a593Smuzhiyun+		checkferror_input(stdin);
454*4882a593Smuzhiyun 		/*
455*4882a593Smuzhiyun 		 * The following if() is the only place where ``stdin_lookahead''
456*4882a593Smuzhiyun 		 * might be set to other than EOF:
457*4882a593Smuzhiyun@@ -717,24 +734,30 @@ dc_evalfile DC_DECLARG((fp))
458*4882a593Smuzhiyun 		signal(SIGINT, sigint_handler);
459*4882a593Smuzhiyun 		switch (dc_func(c, peekc, negcmp)){
460*4882a593Smuzhiyun 		case DC_OKAY:
461*4882a593Smuzhiyun-			if (stdin_lookahead != peekc  &&  fp == stdin)
462*4882a593Smuzhiyun+			if (stdin_lookahead != peekc  &&  fp == stdin) {
463*4882a593Smuzhiyun 				peekc = getc(fp);
464*4882a593Smuzhiyun+				checkferror_input(stdin);
465*4882a593Smuzhiyun+			}
466*4882a593Smuzhiyun 			break;
467*4882a593Smuzhiyun 		case DC_EATONE:
468*4882a593Smuzhiyun 			peekc = getc(fp);
469*4882a593Smuzhiyun+			checkferror_input(fp);
470*4882a593Smuzhiyun 			break;
471*4882a593Smuzhiyun 		case DC_EVALREG:
472*4882a593Smuzhiyun 			/*commands which send us here shall guarantee that peekc!=EOF*/
473*4882a593Smuzhiyun 			c = peekc;
474*4882a593Smuzhiyun 			peekc = getc(fp);
475*4882a593Smuzhiyun+			checkferror_input(fp);
476*4882a593Smuzhiyun 			stdin_lookahead = peekc;
477*4882a593Smuzhiyun 			if (dc_register_get(c, &datum) != DC_SUCCESS)
478*4882a593Smuzhiyun 				break;
479*4882a593Smuzhiyun 			dc_push(datum);
480*4882a593Smuzhiyun 			/*@fallthrough@*/
481*4882a593Smuzhiyun 		case DC_EVALTOS:
482*4882a593Smuzhiyun-			if (stdin_lookahead != peekc  &&  fp == stdin)
483*4882a593Smuzhiyun+			if (stdin_lookahead != peekc  &&  fp == stdin) {
484*4882a593Smuzhiyun 				peekc = getc(fp);
485*4882a593Smuzhiyun+				checkferror_input(stdin);
486*4882a593Smuzhiyun+			}
487*4882a593Smuzhiyun 			if (dc_pop(&datum) == DC_SUCCESS){
488*4882a593Smuzhiyun 				if (datum.dc_type == DC_NUMBER){
489*4882a593Smuzhiyun 					dc_push(datum);
490*4882a593Smuzhiyun@@ -744,6 +767,7 @@ dc_evalfile DC_DECLARG((fp))
491*4882a593Smuzhiyun 							goto reset_and_exit_quit;
492*4882a593Smuzhiyun 						fprintf(stderr, "%s: Q command argument exceeded \
493*4882a593Smuzhiyun string execution depth\n", progname);
494*4882a593Smuzhiyun+						checkferror_output(stderr);
495*4882a593Smuzhiyun 					}
496*4882a593Smuzhiyun 				}else{
497*4882a593Smuzhiyun 					dc_garbage("at top of stack", -1);
498*4882a593Smuzhiyun@@ -756,8 +780,11 @@ string execution depth\n", progname);
499*4882a593Smuzhiyun 			fprintf(stderr,
500*4882a593Smuzhiyun 					"%s: Q command argument exceeded string execution depth\n",
501*4882a593Smuzhiyun 					progname);
502*4882a593Smuzhiyun-			if (stdin_lookahead != peekc  &&  fp == stdin)
503*4882a593Smuzhiyun+			checkferror_output(stderr);
504*4882a593Smuzhiyun+			if (stdin_lookahead != peekc  &&  fp == stdin) {
505*4882a593Smuzhiyun 				peekc = getc(fp);
506*4882a593Smuzhiyun+				checkferror_input(stdin);
507*4882a593Smuzhiyun+			}
508*4882a593Smuzhiyun 			break;
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun 		case DC_INT:
511*4882a593Smuzhiyundiff --git a/dc/misc.c b/dc/misc.c
512*4882a593Smuzhiyunindex cd23602..cd910b8 100644
513*4882a593Smuzhiyun--- a/dc/misc.c
514*4882a593Smuzhiyun+++ b/dc/misc.c
515*4882a593Smuzhiyun@@ -89,6 +89,7 @@ dc_show_id DC_DECLARG((fp, id, suffix))
516*4882a593Smuzhiyun 		fprintf(fp, "'%c' (%#o)%s", (unsigned int) id, id, suffix);
517*4882a593Smuzhiyun 	else
518*4882a593Smuzhiyun 		fprintf(fp, "%#o%s", (unsigned int) id, suffix);
519*4882a593Smuzhiyun+	checkferror_output(fp);
520*4882a593Smuzhiyun }
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun
523*4882a593Smuzhiyundiff --git a/dc/numeric.c b/dc/numeric.c
524*4882a593Smuzhiyunindex 37759de..60cfb85 100644
525*4882a593Smuzhiyun--- a/dc/numeric.c
526*4882a593Smuzhiyun+++ b/dc/numeric.c
527*4882a593Smuzhiyun@@ -133,6 +133,7 @@ dc_div DC_DECLARG((a, b, kscale, result))
528*4882a593Smuzhiyun 	bc_init_num(CastNumPtr(result));
529*4882a593Smuzhiyun 	if (bc_divide(CastNum(a), CastNum(b), CastNumPtr(result), kscale)){
530*4882a593Smuzhiyun 		fprintf(stderr, "%s: divide by zero\n", progname);
531*4882a593Smuzhiyun+		checkferror_output(stderr);
532*4882a593Smuzhiyun 		return DC_DOMAIN_ERROR;
533*4882a593Smuzhiyun 	}
534*4882a593Smuzhiyun 	return DC_SUCCESS;
535*4882a593Smuzhiyun@@ -155,6 +156,7 @@ dc_divrem DC_DECLARG((a, b, kscale, quotient, remainder))
536*4882a593Smuzhiyun 	if (bc_divmod(CastNum(a), CastNum(b),
537*4882a593Smuzhiyun 						CastNumPtr(quotient), CastNumPtr(remainder), kscale)){
538*4882a593Smuzhiyun 		fprintf(stderr, "%s: divide by zero\n", progname);
539*4882a593Smuzhiyun+		checkferror_output(stderr);
540*4882a593Smuzhiyun 		return DC_DOMAIN_ERROR;
541*4882a593Smuzhiyun 	}
542*4882a593Smuzhiyun 	return DC_SUCCESS;
543*4882a593Smuzhiyun@@ -173,6 +175,7 @@ dc_rem DC_DECLARG((a, b, kscale, result))
544*4882a593Smuzhiyun 	bc_init_num(CastNumPtr(result));
545*4882a593Smuzhiyun 	if (bc_modulo(CastNum(a), CastNum(b), CastNumPtr(result), kscale)){
546*4882a593Smuzhiyun 		fprintf(stderr, "%s: remainder by zero\n", progname);
547*4882a593Smuzhiyun+		checkferror_output(stderr);
548*4882a593Smuzhiyun 		return DC_DOMAIN_ERROR;
549*4882a593Smuzhiyun 	}
550*4882a593Smuzhiyun 	return DC_SUCCESS;
551*4882a593Smuzhiyun@@ -225,6 +228,7 @@ dc_sqrt DC_DECLARG((value, kscale, result))
552*4882a593Smuzhiyun 	tmp = bc_copy_num(CastNum(value));
553*4882a593Smuzhiyun 	if (!bc_sqrt(&tmp, kscale)){
554*4882a593Smuzhiyun 		fprintf(stderr, "%s: square root of negative number\n", progname);
555*4882a593Smuzhiyun+		checkferror_output(stderr);
556*4882a593Smuzhiyun 		bc_free_num(&tmp);
557*4882a593Smuzhiyun 		return DC_DOMAIN_ERROR;
558*4882a593Smuzhiyun 	}
559*4882a593Smuzhiyun@@ -470,6 +474,7 @@ dc_dump_num DC_DECLARG((dcvalue, discard_p))
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun 	for (cur=top_of_stack; cur; cur=next) {
562*4882a593Smuzhiyun 		putchar(cur->digit);
563*4882a593Smuzhiyun+		checkferror_output(stdout);
564*4882a593Smuzhiyun 		next = cur->link;
565*4882a593Smuzhiyun 		free(cur);
566*4882a593Smuzhiyun 	}
567*4882a593Smuzhiyun@@ -587,6 +592,8 @@ out_char (ch)
568*4882a593Smuzhiyun 			out_col = 1;
569*4882a593Smuzhiyun 		}
570*4882a593Smuzhiyun 		putchar(ch);
571*4882a593Smuzhiyun+                checkferror_output(stdout);
572*4882a593Smuzhiyun+		checkferror_output(stderr);
573*4882a593Smuzhiyun 	}
574*4882a593Smuzhiyun }
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun@@ -626,6 +633,7 @@ rt_error (mesg, va_alist)
577*4882a593Smuzhiyun 	vfprintf (stderr, mesg, args);
578*4882a593Smuzhiyun 	va_end (args);
579*4882a593Smuzhiyun 	fprintf (stderr, "\n");
580*4882a593Smuzhiyun+	checkferror_output(stderr);
581*4882a593Smuzhiyun }
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun@@ -659,6 +667,7 @@ rt_warn (mesg, va_alist)
585*4882a593Smuzhiyun 	vfprintf (stderr, mesg, args);
586*4882a593Smuzhiyun 	va_end (args);
587*4882a593Smuzhiyun 	fprintf (stderr, "\n");
588*4882a593Smuzhiyun+	checkferror_output(stderr);
589*4882a593Smuzhiyun }
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun
592*4882a593Smuzhiyundiff --git a/dc/stack.c b/dc/stack.c
593*4882a593Smuzhiyunindex 49422df..174411d 100644
594*4882a593Smuzhiyun--- a/dc/stack.c
595*4882a593Smuzhiyun+++ b/dc/stack.c
596*4882a593Smuzhiyun@@ -35,7 +35,10 @@
597*4882a593Smuzhiyun #include "dc-regdef.h"
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun /* an oft-used error message: */
600*4882a593Smuzhiyun-#define Empty_Stack	fprintf(stderr, "%s: stack empty\n", progname)
601*4882a593Smuzhiyun+#define Empty_Stack do{					\
602*4882a593Smuzhiyun+    fprintf(stderr, "%s: stack empty\n", progname);	\
603*4882a593Smuzhiyun+    checkferror_output(stderr);				\
604*4882a593Smuzhiyun+  }while(0)
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun
607*4882a593Smuzhiyun /* simple linked-list implementation suffices: */
608*4882a593Smuzhiyun@@ -91,6 +94,7 @@ dc_binop DC_DECLARG((op, kscale))
609*4882a593Smuzhiyun 	if (dc_stack->value.dc_type!=DC_NUMBER
610*4882a593Smuzhiyun 			|| dc_stack->link->value.dc_type!=DC_NUMBER){
611*4882a593Smuzhiyun 		fprintf(stderr, "%s: non-numeric value\n", progname);
612*4882a593Smuzhiyun+		checkferror_output(stderr);
613*4882a593Smuzhiyun 		return;
614*4882a593Smuzhiyun 	}
615*4882a593Smuzhiyun 	(void)dc_pop(&b);
616*4882a593Smuzhiyun@@ -131,6 +135,7 @@ dc_binop2 DC_DECLARG((op, kscale))
617*4882a593Smuzhiyun 	if (dc_stack->value.dc_type!=DC_NUMBER
618*4882a593Smuzhiyun 			|| dc_stack->link->value.dc_type!=DC_NUMBER){
619*4882a593Smuzhiyun 		fprintf(stderr, "%s: non-numeric value\n", progname);
620*4882a593Smuzhiyun+		checkferror_output(stderr);
621*4882a593Smuzhiyun 		return;
622*4882a593Smuzhiyun 	}
623*4882a593Smuzhiyun 	(void)dc_pop(&b);
624*4882a593Smuzhiyun@@ -169,6 +174,7 @@ dc_cmpop DC_DECLVOID()
625*4882a593Smuzhiyun 	if (dc_stack->value.dc_type!=DC_NUMBER
626*4882a593Smuzhiyun 			|| dc_stack->link->value.dc_type!=DC_NUMBER){
627*4882a593Smuzhiyun 		fprintf(stderr, "%s: non-numeric value\n", progname);
628*4882a593Smuzhiyun+		checkferror_output(stderr);
629*4882a593Smuzhiyun 		return 0;
630*4882a593Smuzhiyun 	}
631*4882a593Smuzhiyun 	(void)dc_pop(&b);
632*4882a593Smuzhiyun@@ -206,6 +212,7 @@ dc_triop DC_DECLARG((op, kscale))
633*4882a593Smuzhiyun 			|| dc_stack->link->value.dc_type!=DC_NUMBER
634*4882a593Smuzhiyun 			|| dc_stack->link->link->value.dc_type!=DC_NUMBER){
635*4882a593Smuzhiyun 		fprintf(stderr, "%s: non-numeric value\n", progname);
636*4882a593Smuzhiyun+		checkferror_output(stderr);
637*4882a593Smuzhiyun 		return;
638*4882a593Smuzhiyun 	}
639*4882a593Smuzhiyun 	(void)dc_pop(&c);
640*4882a593Smuzhiyun@@ -327,6 +334,7 @@ dc_register_get DC_DECLARG((regid, result))
641*4882a593Smuzhiyun 		*result = dc_int2data(0);
642*4882a593Smuzhiyun 	}else if (r->value.dc_type==DC_UNINITIALIZED){
643*4882a593Smuzhiyun 		fprintf(stderr, "%s: BUG: register ", progname);
644*4882a593Smuzhiyun+		checkferror_output(stderr);
645*4882a593Smuzhiyun 		dc_show_id(stderr, regid, " exists but is uninitialized?\n");
646*4882a593Smuzhiyun 		return DC_FAIL;
647*4882a593Smuzhiyun 	}else{
648*4882a593Smuzhiyun@@ -402,6 +410,7 @@ dc_register_pop DC_DECLARG((stackid, result))
649*4882a593Smuzhiyun 	r = dc_register[stackid];
650*4882a593Smuzhiyun 	if (r==NULL || r->value.dc_type==DC_UNINITIALIZED){
651*4882a593Smuzhiyun 		fprintf(stderr, "%s: stack register ", progname);
652*4882a593Smuzhiyun+		checkferror_output(stderr);
653*4882a593Smuzhiyun 		dc_show_id(stderr, stackid, " is empty\n");
654*4882a593Smuzhiyun 		return DC_FAIL;
655*4882a593Smuzhiyun 	}
656*4882a593Smuzhiyundiff --git a/dc/string.c b/dc/string.c
657*4882a593Smuzhiyunindex dee9169..389d899 100644
658*4882a593Smuzhiyun--- a/dc/string.c
659*4882a593Smuzhiyun+++ b/dc/string.c
660*4882a593Smuzhiyun@@ -94,6 +94,7 @@ dc_out_str DC_DECLARG((value, discard_flag))
661*4882a593Smuzhiyun 	dc_discard discard_flag DC_DECLEND
662*4882a593Smuzhiyun {
663*4882a593Smuzhiyun 	fwrite(value->s_ptr, value->s_len, sizeof *value->s_ptr, stdout);
664*4882a593Smuzhiyun+        checkferror_output(stdout);
665*4882a593Smuzhiyun 	if (discard_flag == DC_TOSS)
666*4882a593Smuzhiyun 		dc_free_str(&value);
667*4882a593Smuzhiyun }
668*4882a593Smuzhiyun@@ -169,6 +170,7 @@ dc_readstring DC_DECLARG((fp, ldelim, rdelim))
669*4882a593Smuzhiyun 		}
670*4882a593Smuzhiyun 		*p++ = c;
671*4882a593Smuzhiyun 	}
672*4882a593Smuzhiyun+	checkferror_input(fp);
673*4882a593Smuzhiyun 	return dc_makestring(line_buf, (size_t)(p-line_buf));
674*4882a593Smuzhiyun }
675*4882a593Smuzhiyun
676*4882a593Smuzhiyundiff --git a/h/number.h b/h/number.h
677*4882a593Smuzhiyunindex abf6332..1983ab4 100644
678*4882a593Smuzhiyun--- a/h/number.h
679*4882a593Smuzhiyun+++ b/h/number.h
680*4882a593Smuzhiyun@@ -23,10 +23,10 @@
681*4882a593Smuzhiyun     You may contact the author by:
682*4882a593Smuzhiyun        e-mail:  philnelson@acm.org
683*4882a593Smuzhiyun       us-mail:  Philip A. Nelson
684*4882a593Smuzhiyun-                Computer Science Department, 9062
685*4882a593Smuzhiyun-                Western Washington University
686*4882a593Smuzhiyun-                Bellingham, WA 98226-9062
687*4882a593Smuzhiyun-
688*4882a593Smuzhiyun+		Computer Science Department, 9062
689*4882a593Smuzhiyun+		Western Washington University
690*4882a593Smuzhiyun+		Bellingham, WA 98226-9062
691*4882a593Smuzhiyun+
692*4882a593Smuzhiyun *************************************************************************/
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun #ifndef _NUMBER_H_
695*4882a593Smuzhiyun@@ -140,4 +140,7 @@ void bc_out_num (bc_num num, int o_base, void (* out_char)(int),
696*4882a593Smuzhiyun 			     int leading_zero);
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun void bc_out_long (long val, int size, int space, void (*out_char)(int));
699*4882a593Smuzhiyun+
700*4882a593Smuzhiyun+void checkferror_input (FILE*);
701*4882a593Smuzhiyun+void checkferror_output (FILE*);
702*4882a593Smuzhiyun #endif
703*4882a593Smuzhiyundiff --git a/lib/number.c b/lib/number.c
704*4882a593Smuzhiyunindex f394e92..80b33e3 100644
705*4882a593Smuzhiyun--- a/lib/number.c
706*4882a593Smuzhiyun+++ b/lib/number.c
707*4882a593Smuzhiyun@@ -1713,6 +1713,7 @@ static void
708*4882a593Smuzhiyun out_char (int c)
709*4882a593Smuzhiyun {
710*4882a593Smuzhiyun   putchar(c);
711*4882a593Smuzhiyun+  checkferror_output(stdout);
712*4882a593Smuzhiyun }
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun@@ -1721,6 +1722,7 @@ pn (bc_num num)
716*4882a593Smuzhiyun {
717*4882a593Smuzhiyun   bc_out_num (num, 10, out_char, 0);
718*4882a593Smuzhiyun   out_char ('\n');
719*4882a593Smuzhiyun+  checkferror_output(stdout);
720*4882a593Smuzhiyun }
721*4882a593Smuzhiyun
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun@@ -1732,6 +1734,28 @@ pv (char *name, unsigned char *num, int len)
724*4882a593Smuzhiyun   printf ("%s=", name);
725*4882a593Smuzhiyun   for (i=0; i<len; i++) printf ("%c",BCD_CHAR(num[i]));
726*4882a593Smuzhiyun   printf ("\n");
727*4882a593Smuzhiyun+  checkferror_output(stdout);
728*4882a593Smuzhiyun }
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun #endif
731*4882a593Smuzhiyun+
732*4882a593Smuzhiyun+/* check ferror() status and if so die */
733*4882a593Smuzhiyun+void
734*4882a593Smuzhiyun+checkferror_input (fp)
735*4882a593Smuzhiyun+	FILE *fp;
736*4882a593Smuzhiyun+{
737*4882a593Smuzhiyun+	if (ferror(fp)) {
738*4882a593Smuzhiyun+		perror("dc: could not read input file");
739*4882a593Smuzhiyun+		exit(EXIT_FAILURE);
740*4882a593Smuzhiyun+	}
741*4882a593Smuzhiyun+}
742*4882a593Smuzhiyun+
743*4882a593Smuzhiyun+void
744*4882a593Smuzhiyun+checkferror_output (fp)
745*4882a593Smuzhiyun+	FILE *fp;
746*4882a593Smuzhiyun+{
747*4882a593Smuzhiyun+	if (ferror(fp)) {
748*4882a593Smuzhiyun+		perror("dc: could not write output file");
749*4882a593Smuzhiyun+		exit(EXIT_FAILURE);
750*4882a593Smuzhiyun+	}
751*4882a593Smuzhiyun+}
752*4882a593Smuzhiyun--
753*4882a593Smuzhiyun2.17.1
754*4882a593Smuzhiyun
755