123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754 |
- From af96fb92052c307818eefa4b687f964f1e3f542e Mon Sep 17 00:00:00 2001
- From: Matt Weber <matthew.weber@rockwellcollins.com>
- Date: Thu, 12 Sep 2019 15:04:35 -0500
- Subject: [PATCH] notice read and write errors on input and output
- Quoting from the bug report:
- bc (1.06-19ubuntu1) dapper; urgency=low
- * Make dc notice read and write errors on its input and output.
- I grepped for mentions of the strings `putc', `print', `getc',
- `FILE', `stdin', `stdout' and `stderr' and added calls to new
- error-checking functions unless it was clear from the
- immediately-surrounding code that the program was exiting
- nonzero, or would exit nonzero if the call failed. I ignored
- hits in lib/getopt*, which seems to pervasively ignore write
- errors when printing usage messages, in the hope that these
- were correct. I _think_ I got them all. -iwj.
- -- Ian Jackson <iwj@ubuntu.com> Tue, 4 Apr 2006 17:21:02 +0100
- Upsteam:
- https://sources.debian.org/patches/bc/1.07.1-2/05_notice_read_write_errors.diff/
- [Reformatted to GIT for 1.0.7.1 by Matt W]
- Updated by Ryan Kavanagh <rak@debian.org> for 1.0.7.1 on 26 July 2017.
- Author: Ian Jackson <iwj@ubuntu.com>
- Origin: other
- Bug-Debian: http://bugs.debian.org/488735
- Signed-off-by: Matthew Weber <matthew.weber@rockwellcollins.com>
- ---
- bc/execute.c | 10 +++++++++-
- bc/main.c | 3 +++
- bc/sbc.y | 2 ++
- bc/scan.c | 2 ++
- bc/scan.l | 3 +++
- bc/util.c | 15 ++++++++++++--
- dc/dc.c | 3 +++
- dc/eval.c | 55 +++++++++++++++++++++++++++++++++++++++-------------
- dc/misc.c | 1 +
- dc/numeric.c | 9 +++++++++
- dc/stack.c | 11 ++++++++++-
- dc/string.c | 2 ++
- h/number.h | 11 +++++++----
- lib/number.c | 24 +++++++++++++++++++++++
- 14 files changed, 129 insertions(+), 22 deletions(-)
- diff --git a/bc/execute.c b/bc/execute.c
- index 256e4b7..50eac49 100644
- --- a/bc/execute.c
- +++ b/bc/execute.c
- @@ -104,6 +104,7 @@ execute (void)
- }
- out_char ('\n');
- }
- + checkferror_output(stdout);
- }
- #endif
-
- @@ -224,6 +225,7 @@ execute (void)
- }
- }
- fflush (stdout);
- + checkferror_output(stdout);
- break;
-
- case 'R' : /* Return from function */
- @@ -259,6 +261,7 @@ execute (void)
- if (inst == 'W') out_char ('\n');
- store_var (4); /* Special variable "last". */
- fflush (stdout);
- + checkferror_output(stdout);
- pop ();
- break;
-
- @@ -342,6 +345,7 @@ execute (void)
- case 'w' : /* Write a string to the output. */
- while ((ch = byte(&pc)) != '"') out_schar (ch);
- fflush (stdout);
- + checkferror_output(stdout);
- break;
-
- case 'x' : /* Exchange Top of Stack with the one under the tos. */
- @@ -549,7 +553,10 @@ execute (void)
- {
- signal (SIGINT, use_quit);
- if (had_sigint)
- - printf ("\ninterrupted execution.\n");
- + {
- + printf ("\ninterrupted execution.\n");
- + checkferror_output(stdout);
- + }
- }
- }
-
- @@ -584,6 +591,7 @@ input_char (void)
- out_col = 0; /* Saw a new line */
- }
- }
- + checkferror_input(stdin);
-
- /* Classify and preprocess the input character. */
- if (isdigit(in_ch))
- diff --git a/bc/main.c b/bc/main.c
- index 012075c..c96207b 100644
- --- a/bc/main.c
- +++ b/bc/main.c
- @@ -353,6 +353,9 @@ use_quit (int sig)
- errno = save;
- #else
- write (1, "\n(interrupt) Exiting bc.\n", 26);
- +#ifdef READLINE
- + rl_initialize (); /* Clear readline buffer */
- +#endif
- bc_exit(0);
- #endif
- }
- diff --git a/bc/sbc.y b/bc/sbc.y
- index 586686b..921ab1e 100644
- --- a/bc/sbc.y
- +++ b/bc/sbc.y
- @@ -86,7 +86,9 @@ program : /* empty */
- if (interactive && !quiet)
- {
- show_bc_version ();
- + checkferror_output(stdout);
- welcome ();
- + checkferror_output(stdout);
- }
- }
- | program input_item
- diff --git a/bc/scan.c b/bc/scan.c
- index b237f55..8dee4e9 100644
- --- a/bc/scan.c
- +++ b/bc/scan.c
- @@ -791,6 +791,7 @@ bcel_input (char *buf, yy_size_t *result, int max)
- if (bcel_len != 0)
- history (hist, &histev, H_ENTER, bcel_line);
- fflush (stdout);
- + checkferror_output(stdout);
- }
-
- if (bcel_len <= max)
- @@ -863,6 +864,7 @@ rl_input (char *buf, int *result, int max)
- add_history (rl_line);
- rl_line[rl_len-1] = '\n';
- fflush (stdout);
- + checkferror_output(stdout);
- }
-
- if (rl_len <= max)
- diff --git a/bc/scan.l b/bc/scan.l
- index eb2e2dd..79186bb 100644
- --- a/bc/scan.l
- +++ b/bc/scan.l
- @@ -99,6 +99,7 @@ bcel_input (char *buf, yy_size_t *result, int max)
- if (bcel_len != 0)
- history (hist, &histev, H_ENTER, bcel_line);
- fflush (stdout);
- + checkferror_output(stdout);
- }
-
- if (bcel_len <= max)
- @@ -171,6 +172,7 @@ rl_input (char *buf, int *result, int max)
- add_history (rl_line);
- rl_line[rl_len-1] = '\n';
- fflush (stdout);
- + checkferror_output(stdout);
- }
-
- if (rl_len <= max)
- @@ -295,6 +297,7 @@ limits return(Limits);
- if (c == EOF)
- {
- fprintf (stderr,"EOF encountered in a comment.\n");
- + checkferror_output(stderr);
- break;
- }
- }
- diff --git a/bc/util.c b/bc/util.c
- index 8eba093..cacd796 100644
- --- a/bc/util.c
- +++ b/bc/util.c
- @@ -247,9 +247,10 @@ init_gen (void)
- continue_label = 0;
- next_label = 1;
- out_count = 2;
- - if (compile_only)
- + if (compile_only) {
- printf ("@i");
- - else
- + checkferror_output(stdout);
- + } else
- init_load ();
- had_error = FALSE;
- did_gen = FALSE;
- @@ -272,6 +273,7 @@ generate (const char *str)
- printf ("\n");
- out_count = 0;
- }
- + checkferror_output(stdout);
- }
- else
- load_code (str);
- @@ -289,6 +291,7 @@ run_code(void)
- if (compile_only)
- {
- printf ("@r\n");
- + checkferror_output(stdout);
- out_count = 0;
- }
- else
- @@ -326,6 +329,7 @@ out_char (int ch)
- }
- putchar (ch);
- }
- + checkferror_output(stdout);
- }
-
- /* Output routines: Write a character CH to the standard output.
- @@ -355,6 +359,7 @@ out_schar (int ch)
- }
- putchar (ch);
- }
- + checkferror_output(stdout);
- }
-
-
- @@ -639,6 +644,7 @@ limits(void)
- #ifdef OLD_EQ_OP
- printf ("Old assignment operatiors are valid. (=-, =+, ...)\n");
- #endif
- + checkferror_output(stdout);
- }
-
- /* bc_malloc will check the return value so all other places do not
- @@ -703,6 +709,7 @@ yyerror (str, va_alist)
- fprintf (stderr,"%s %d: ",name,line_no);
- vfprintf (stderr, str, args);
- fprintf (stderr, "\n");
- + checkferror_output(stderr);
- had_error = TRUE;
- va_end (args);
- }
- @@ -743,6 +750,7 @@ ct_warn (mesg, va_alist)
- fprintf (stderr,"%s %d: Error: ",name,line_no);
- vfprintf (stderr, mesg, args);
- fprintf (stderr, "\n");
- + checkferror_output(stderr);
- had_error = TRUE;
- }
- else
- @@ -755,6 +763,7 @@ ct_warn (mesg, va_alist)
- fprintf (stderr,"%s %d: (Warning) ",name,line_no);
- vfprintf (stderr, mesg, args);
- fprintf (stderr, "\n");
- + checkferror_output(stderr);
- }
- va_end (args);
- }
- @@ -789,6 +798,7 @@ rt_error (mesg, va_alist)
- va_end (args);
-
- fprintf (stderr, "\n");
- + checkferror_output(stderr);
- runtime_error = TRUE;
- }
-
- @@ -823,6 +833,7 @@ rt_warn (const char *mesg)
- va_end (args);
-
- fprintf (stderr, "\n");
- + checkferror_output(stderr);
- }
-
- /* bc_exit: Make sure to reset the edit state. */
- diff --git a/dc/dc.c b/dc/dc.c
- index 6a2bb26..ccdb1c2 100644
- --- a/dc/dc.c
- +++ b/dc/dc.c
- @@ -59,6 +59,7 @@ static void
- bug_report_info DC_DECLVOID()
- {
- printf("Email bug reports to: bug-dc@gnu.org .\n");
- + checkferror_output(stdout);
- }
-
- static void
- @@ -69,6 +70,7 @@ show_version DC_DECLVOID()
- This is free software; see the source for copying conditions. There is NO\n\
- warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n\
- to the extent permitted by law.\n", DC_COPYRIGHT);
- + checkferror_output(stdout);
- }
-
- /* your generic usage function */
- @@ -85,6 +87,7 @@ Usage: %s [OPTION] [file ...]\n\
- \n\
- ", progname);
- bug_report_info();
- + checkferror_output(f);
- }
-
- /* returns a pointer to one past the last occurance of c in s,
- diff --git a/dc/eval.c b/dc/eval.c
- index 05a3d9e..6c54e61 100644
- --- a/dc/eval.c
- +++ b/dc/eval.c
- @@ -97,12 +97,15 @@ static int input_pushback;
- static int
- input_fil DC_DECLVOID()
- {
- + int c;
- if (input_pushback != EOF){
- - int c = input_pushback;
- + c = input_pushback;
- input_pushback = EOF;
- return c;
- }
- - return getc(input_fil_fp);
- + c = getc(input_fil_fp);
- + checkferror_input(input_fil_fp);
- + return c;
- }
-
- /* passed as an argument to dc_getnum */
- @@ -301,11 +304,13 @@ dc_func DC_DECLARG((c, peekc, negcmp))
- tmpint = dc_num2int(datum.v.number, DC_TOSS);
- if (2 <= tmpint && tmpint <= DC_IBASE_MAX)
- dc_ibase = tmpint;
- - else
- + else {
- fprintf(stderr,
- "%s: input base must be a number \
- between 2 and %d (inclusive)\n",
- progname, DC_IBASE_MAX);
- + checkferror_output(stderr);
- + }
- }
- break;
- case 'k': /* set scale to value on top of stack */
- @@ -313,11 +318,12 @@ between 2 and %d (inclusive)\n",
- tmpint = -1;
- if (datum.dc_type == DC_NUMBER)
- tmpint = dc_num2int(datum.v.number, DC_TOSS);
- - if ( ! (tmpint >= 0) )
- + if ( ! (tmpint >= 0) ) {
- fprintf(stderr,
- "%s: scale must be a nonnegative number\n",
- progname);
- - else
- + checkferror_output(stderr);
- + } else
- dc_scale = tmpint;
- }
- break;
- @@ -341,11 +347,12 @@ between 2 and %d (inclusive)\n",
- tmpint = 0;
- if (datum.dc_type == DC_NUMBER)
- tmpint = dc_num2int(datum.v.number, DC_TOSS);
- - if ( ! (tmpint > 1) )
- + if ( ! (tmpint > 1) ) {
- fprintf(stderr,
- "%s: output base must be a number greater than 1\n",
- progname);
- - else
- + checkferror_output(stderr);
- + } else
- dc_obase = tmpint;
- }
- break;
- @@ -378,6 +385,7 @@ between 2 and %d (inclusive)\n",
- fprintf(stderr,
- "%s: square root of nonnumeric attempted\n",
- progname);
- + checkferror_output(stderr);
- }else if (dc_sqrt(datum.v.number, dc_scale, &tmpnum) == DC_SUCCESS){
- dc_free_num(&datum.v.number);
- datum.v.number = tmpnum;
- @@ -424,6 +432,7 @@ between 2 and %d (inclusive)\n",
- dc_garbage("at top of stack", -1);
- }
- fflush(stdout);
- + checkferror_output(stdout);
- break;
- case 'Q': /* quit out of top-of-stack nested evals;
- * pops value from stack;
- @@ -440,6 +449,7 @@ between 2 and %d (inclusive)\n",
- fprintf(stderr,
- "%s: Q command requires a number >= 1\n",
- progname);
- + checkferror_output(stderr);
- }
- break;
- case 'R': /* pop a value off of the evaluation stack,;
- @@ -483,11 +493,12 @@ between 2 and %d (inclusive)\n",
- if (datum.dc_type == DC_NUMBER)
- tmpint = dc_num2int(datum.v.number, DC_TOSS);
- if (dc_pop(&datum) == DC_SUCCESS){
- - if (tmpint < 0)
- + if (tmpint < 0) {
- fprintf(stderr,
- "%s: array index must be a nonnegative integer\n",
- progname);
- - else
- + checkferror_output(stderr);
- + } else
- dc_array_set(peekc, tmpint, datum);
- }
- }
- @@ -499,18 +510,21 @@ between 2 and %d (inclusive)\n",
- tmpint = -1;
- if (datum.dc_type == DC_NUMBER)
- tmpint = dc_num2int(datum.v.number, DC_TOSS);
- - if (tmpint < 0)
- + if (tmpint < 0) {
- fprintf(stderr,
- "%s: array index must be a nonnegative integer\n",
- progname);
- - else
- + checkferror_output(stderr);
- + } else
- dc_push(dc_array_get(peekc, tmpint));
- }
- return DC_EATONE;
-
- default: /* What did that user mean? */
- fprintf(stderr, "%s: ", progname);
- + checkferror_output(stderr);
- dc_show_id(stdout, c, " unimplemented\n");
- + checkferror_output(stdout);
- break;
- }
- return DC_OKAY;
- @@ -538,6 +552,7 @@ evalstr DC_DECLARG((string))
- fprintf(stderr,
- "%s: eval called with non-string argument\n",
- progname);
- + checkferror_output(stderr);
- return DC_OKAY;
- }
- interrupt_seen = 0;
- @@ -635,6 +650,7 @@ evalstr DC_DECLARG((string))
- return DC_FAIL;
- }
- fprintf(stderr, "%s: unexpected EOS\n", progname);
- + checkferror_output(stderr);
- return DC_OKAY;
- }
- }
- @@ -692,6 +708,7 @@ dc_evalfile DC_DECLARG((fp))
- stdin_lookahead = EOF;
- for (c=getc(fp); c!=EOF; c=peekc){
- peekc = getc(fp);
- + checkferror_input(stdin);
- /*
- * The following if() is the only place where ``stdin_lookahead''
- * might be set to other than EOF:
- @@ -717,24 +734,30 @@ dc_evalfile DC_DECLARG((fp))
- signal(SIGINT, sigint_handler);
- switch (dc_func(c, peekc, negcmp)){
- case DC_OKAY:
- - if (stdin_lookahead != peekc && fp == stdin)
- + if (stdin_lookahead != peekc && fp == stdin) {
- peekc = getc(fp);
- + checkferror_input(stdin);
- + }
- break;
- case DC_EATONE:
- peekc = getc(fp);
- + checkferror_input(fp);
- break;
- case DC_EVALREG:
- /*commands which send us here shall guarantee that peekc!=EOF*/
- c = peekc;
- peekc = getc(fp);
- + checkferror_input(fp);
- stdin_lookahead = peekc;
- if (dc_register_get(c, &datum) != DC_SUCCESS)
- break;
- dc_push(datum);
- /*@fallthrough@*/
- case DC_EVALTOS:
- - if (stdin_lookahead != peekc && fp == stdin)
- + if (stdin_lookahead != peekc && fp == stdin) {
- peekc = getc(fp);
- + checkferror_input(stdin);
- + }
- if (dc_pop(&datum) == DC_SUCCESS){
- if (datum.dc_type == DC_NUMBER){
- dc_push(datum);
- @@ -744,6 +767,7 @@ dc_evalfile DC_DECLARG((fp))
- goto reset_and_exit_quit;
- fprintf(stderr, "%s: Q command argument exceeded \
- string execution depth\n", progname);
- + checkferror_output(stderr);
- }
- }else{
- dc_garbage("at top of stack", -1);
- @@ -756,8 +780,11 @@ string execution depth\n", progname);
- fprintf(stderr,
- "%s: Q command argument exceeded string execution depth\n",
- progname);
- - if (stdin_lookahead != peekc && fp == stdin)
- + checkferror_output(stderr);
- + if (stdin_lookahead != peekc && fp == stdin) {
- peekc = getc(fp);
- + checkferror_input(stdin);
- + }
- break;
-
- case DC_INT:
- diff --git a/dc/misc.c b/dc/misc.c
- index cd23602..cd910b8 100644
- --- a/dc/misc.c
- +++ b/dc/misc.c
- @@ -89,6 +89,7 @@ dc_show_id DC_DECLARG((fp, id, suffix))
- fprintf(fp, "'%c' (%#o)%s", (unsigned int) id, id, suffix);
- else
- fprintf(fp, "%#o%s", (unsigned int) id, suffix);
- + checkferror_output(fp);
- }
-
-
- diff --git a/dc/numeric.c b/dc/numeric.c
- index 37759de..60cfb85 100644
- --- a/dc/numeric.c
- +++ b/dc/numeric.c
- @@ -133,6 +133,7 @@ dc_div DC_DECLARG((a, b, kscale, result))
- bc_init_num(CastNumPtr(result));
- if (bc_divide(CastNum(a), CastNum(b), CastNumPtr(result), kscale)){
- fprintf(stderr, "%s: divide by zero\n", progname);
- + checkferror_output(stderr);
- return DC_DOMAIN_ERROR;
- }
- return DC_SUCCESS;
- @@ -155,6 +156,7 @@ dc_divrem DC_DECLARG((a, b, kscale, quotient, remainder))
- if (bc_divmod(CastNum(a), CastNum(b),
- CastNumPtr(quotient), CastNumPtr(remainder), kscale)){
- fprintf(stderr, "%s: divide by zero\n", progname);
- + checkferror_output(stderr);
- return DC_DOMAIN_ERROR;
- }
- return DC_SUCCESS;
- @@ -173,6 +175,7 @@ dc_rem DC_DECLARG((a, b, kscale, result))
- bc_init_num(CastNumPtr(result));
- if (bc_modulo(CastNum(a), CastNum(b), CastNumPtr(result), kscale)){
- fprintf(stderr, "%s: remainder by zero\n", progname);
- + checkferror_output(stderr);
- return DC_DOMAIN_ERROR;
- }
- return DC_SUCCESS;
- @@ -225,6 +228,7 @@ dc_sqrt DC_DECLARG((value, kscale, result))
- tmp = bc_copy_num(CastNum(value));
- if (!bc_sqrt(&tmp, kscale)){
- fprintf(stderr, "%s: square root of negative number\n", progname);
- + checkferror_output(stderr);
- bc_free_num(&tmp);
- return DC_DOMAIN_ERROR;
- }
- @@ -470,6 +474,7 @@ dc_dump_num DC_DECLARG((dcvalue, discard_p))
-
- for (cur=top_of_stack; cur; cur=next) {
- putchar(cur->digit);
- + checkferror_output(stdout);
- next = cur->link;
- free(cur);
- }
- @@ -587,6 +592,8 @@ out_char (ch)
- out_col = 1;
- }
- putchar(ch);
- + checkferror_output(stdout);
- + checkferror_output(stderr);
- }
- }
-
- @@ -626,6 +633,7 @@ rt_error (mesg, va_alist)
- vfprintf (stderr, mesg, args);
- va_end (args);
- fprintf (stderr, "\n");
- + checkferror_output(stderr);
- }
-
-
- @@ -659,6 +667,7 @@ rt_warn (mesg, va_alist)
- vfprintf (stderr, mesg, args);
- va_end (args);
- fprintf (stderr, "\n");
- + checkferror_output(stderr);
- }
-
-
- diff --git a/dc/stack.c b/dc/stack.c
- index 49422df..174411d 100644
- --- a/dc/stack.c
- +++ b/dc/stack.c
- @@ -35,7 +35,10 @@
- #include "dc-regdef.h"
-
- /* an oft-used error message: */
- -#define Empty_Stack fprintf(stderr, "%s: stack empty\n", progname)
- +#define Empty_Stack do{ \
- + fprintf(stderr, "%s: stack empty\n", progname); \
- + checkferror_output(stderr); \
- + }while(0)
-
-
- /* simple linked-list implementation suffices: */
- @@ -91,6 +94,7 @@ dc_binop DC_DECLARG((op, kscale))
- if (dc_stack->value.dc_type!=DC_NUMBER
- || dc_stack->link->value.dc_type!=DC_NUMBER){
- fprintf(stderr, "%s: non-numeric value\n", progname);
- + checkferror_output(stderr);
- return;
- }
- (void)dc_pop(&b);
- @@ -131,6 +135,7 @@ dc_binop2 DC_DECLARG((op, kscale))
- if (dc_stack->value.dc_type!=DC_NUMBER
- || dc_stack->link->value.dc_type!=DC_NUMBER){
- fprintf(stderr, "%s: non-numeric value\n", progname);
- + checkferror_output(stderr);
- return;
- }
- (void)dc_pop(&b);
- @@ -169,6 +174,7 @@ dc_cmpop DC_DECLVOID()
- if (dc_stack->value.dc_type!=DC_NUMBER
- || dc_stack->link->value.dc_type!=DC_NUMBER){
- fprintf(stderr, "%s: non-numeric value\n", progname);
- + checkferror_output(stderr);
- return 0;
- }
- (void)dc_pop(&b);
- @@ -206,6 +212,7 @@ dc_triop DC_DECLARG((op, kscale))
- || dc_stack->link->value.dc_type!=DC_NUMBER
- || dc_stack->link->link->value.dc_type!=DC_NUMBER){
- fprintf(stderr, "%s: non-numeric value\n", progname);
- + checkferror_output(stderr);
- return;
- }
- (void)dc_pop(&c);
- @@ -327,6 +334,7 @@ dc_register_get DC_DECLARG((regid, result))
- *result = dc_int2data(0);
- }else if (r->value.dc_type==DC_UNINITIALIZED){
- fprintf(stderr, "%s: BUG: register ", progname);
- + checkferror_output(stderr);
- dc_show_id(stderr, regid, " exists but is uninitialized?\n");
- return DC_FAIL;
- }else{
- @@ -402,6 +410,7 @@ dc_register_pop DC_DECLARG((stackid, result))
- r = dc_register[stackid];
- if (r==NULL || r->value.dc_type==DC_UNINITIALIZED){
- fprintf(stderr, "%s: stack register ", progname);
- + checkferror_output(stderr);
- dc_show_id(stderr, stackid, " is empty\n");
- return DC_FAIL;
- }
- diff --git a/dc/string.c b/dc/string.c
- index dee9169..389d899 100644
- --- a/dc/string.c
- +++ b/dc/string.c
- @@ -94,6 +94,7 @@ dc_out_str DC_DECLARG((value, discard_flag))
- dc_discard discard_flag DC_DECLEND
- {
- fwrite(value->s_ptr, value->s_len, sizeof *value->s_ptr, stdout);
- + checkferror_output(stdout);
- if (discard_flag == DC_TOSS)
- dc_free_str(&value);
- }
- @@ -169,6 +170,7 @@ dc_readstring DC_DECLARG((fp, ldelim, rdelim))
- }
- *p++ = c;
- }
- + checkferror_input(fp);
- return dc_makestring(line_buf, (size_t)(p-line_buf));
- }
-
- diff --git a/h/number.h b/h/number.h
- index abf6332..1983ab4 100644
- --- a/h/number.h
- +++ b/h/number.h
- @@ -23,10 +23,10 @@
- You may contact the author by:
- e-mail: philnelson@acm.org
- us-mail: Philip A. Nelson
- - Computer Science Department, 9062
- - Western Washington University
- - Bellingham, WA 98226-9062
- -
- + Computer Science Department, 9062
- + Western Washington University
- + Bellingham, WA 98226-9062
- +
- *************************************************************************/
-
- #ifndef _NUMBER_H_
- @@ -140,4 +140,7 @@ void bc_out_num (bc_num num, int o_base, void (* out_char)(int),
- int leading_zero);
-
- void bc_out_long (long val, int size, int space, void (*out_char)(int));
- +
- +void checkferror_input (FILE*);
- +void checkferror_output (FILE*);
- #endif
- diff --git a/lib/number.c b/lib/number.c
- index f394e92..80b33e3 100644
- --- a/lib/number.c
- +++ b/lib/number.c
- @@ -1713,6 +1713,7 @@ static void
- out_char (int c)
- {
- putchar(c);
- + checkferror_output(stdout);
- }
-
-
- @@ -1721,6 +1722,7 @@ pn (bc_num num)
- {
- bc_out_num (num, 10, out_char, 0);
- out_char ('\n');
- + checkferror_output(stdout);
- }
-
-
- @@ -1732,6 +1734,28 @@ pv (char *name, unsigned char *num, int len)
- printf ("%s=", name);
- for (i=0; i<len; i++) printf ("%c",BCD_CHAR(num[i]));
- printf ("\n");
- + checkferror_output(stdout);
- }
-
- #endif
- +
- +/* check ferror() status and if so die */
- +void
- +checkferror_input (fp)
- + FILE *fp;
- +{
- + if (ferror(fp)) {
- + perror("dc: could not read input file");
- + exit(EXIT_FAILURE);
- + }
- +}
- +
- +void
- +checkferror_output (fp)
- + FILE *fp;
- +{
- + if (ferror(fp)) {
- + perror("dc: could not write output file");
- + exit(EXIT_FAILURE);
- + }
- +}
- --
- 2.17.1
|