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