|
|
@@ -1,4 +1,4 @@
|
|
|
-From af96fb92052c307818eefa4b687f964f1e3f542e Mon Sep 17 00:00:00 2001
|
|
|
+From f9a0d6d4395d5377bd1c41bebbd2190e0971beb9 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
|
|
|
@@ -30,28 +30,30 @@ Signed-off-by: Bernd Kuhls <bernd@kuhls.net>
|
|
|
[Bernd:
|
|
|
Updated to incorporate changes by Matthias Klose <doko@debian.org>
|
|
|
on 2024-03-13 that fix Debian bug https://bugs.debian.org/1065375]
|
|
|
+[dario: update patch for 1.08.2]
|
|
|
+Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.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(-)
|
|
|
+ bc/util.c | 15 +++++++++++++--
|
|
|
+ dc/dc.c | 4 ++++
|
|
|
+ dc/eval.c | 2 ++
|
|
|
+ dc/misc.c | 3 +++
|
|
|
+ dc/numeric.c | 5 +++++
|
|
|
+ dc/stack.c | 2 ++
|
|
|
+ dc/string.c | 3 +++
|
|
|
+ h/number.h | 10 ++++++----
|
|
|
+ lib/number.c | 24 ++++++++++++++++++++++++
|
|
|
+ 14 files changed, 81 insertions(+), 7 deletions(-)
|
|
|
|
|
|
diff --git a/bc/execute.c b/bc/execute.c
|
|
|
-index 256e4b7..50eac49 100644
|
|
|
+index e653a9d75979..3374a38e5fb6 100644
|
|
|
--- a/bc/execute.c
|
|
|
+++ b/bc/execute.c
|
|
|
-@@ -104,6 +104,7 @@ execute (void)
|
|
|
+@@ -105,6 +105,7 @@ execute (void)
|
|
|
}
|
|
|
out_char ('\n');
|
|
|
}
|
|
|
@@ -59,7 +61,7 @@ index 256e4b7..50eac49 100644
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-@@ -224,6 +225,7 @@ execute (void)
|
|
|
+@@ -225,6 +226,7 @@ execute (void)
|
|
|
}
|
|
|
}
|
|
|
fflush (stdout);
|
|
|
@@ -67,7 +69,7 @@ index 256e4b7..50eac49 100644
|
|
|
break;
|
|
|
|
|
|
case 'R' : /* Return from function */
|
|
|
-@@ -259,6 +261,7 @@ execute (void)
|
|
|
+@@ -260,6 +262,7 @@ execute (void)
|
|
|
if (inst == 'W') out_char ('\n');
|
|
|
store_var (4); /* Special variable "last". */
|
|
|
fflush (stdout);
|
|
|
@@ -75,7 +77,7 @@ index 256e4b7..50eac49 100644
|
|
|
pop ();
|
|
|
break;
|
|
|
|
|
|
-@@ -342,6 +345,7 @@ execute (void)
|
|
|
+@@ -343,6 +346,7 @@ execute (void)
|
|
|
case 'w' : /* Write a string to the output. */
|
|
|
while ((ch = byte(&pc)) != '"') out_schar (ch);
|
|
|
fflush (stdout);
|
|
|
@@ -83,7 +85,7 @@ index 256e4b7..50eac49 100644
|
|
|
break;
|
|
|
|
|
|
case 'x' : /* Exchange Top of Stack with the one under the tos. */
|
|
|
-@@ -549,7 +553,10 @@ execute (void)
|
|
|
+@@ -550,7 +554,10 @@ execute (void)
|
|
|
{
|
|
|
signal (SIGINT, use_quit);
|
|
|
if (had_sigint)
|
|
|
@@ -95,7 +97,7 @@ index 256e4b7..50eac49 100644
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-@@ -584,6 +591,7 @@ input_char (void)
|
|
|
+@@ -585,6 +592,7 @@ input_char (void)
|
|
|
out_col = 0; /* Saw a new line */
|
|
|
}
|
|
|
}
|
|
|
@@ -104,10 +106,10 @@ index 256e4b7..50eac49 100644
|
|
|
/* Classify and preprocess the input character. */
|
|
|
if (isdigit(in_ch))
|
|
|
diff --git a/bc/main.c b/bc/main.c
|
|
|
-index 012075c..c96207b 100644
|
|
|
+index b388e17b55bf..ab662dd10fc7 100644
|
|
|
--- a/bc/main.c
|
|
|
+++ b/bc/main.c
|
|
|
-@@ -353,6 +353,9 @@ use_quit (int sig)
|
|
|
+@@ -358,6 +358,9 @@ use_quit (int sig)
|
|
|
errno = save;
|
|
|
#else
|
|
|
write (1, "\n(interrupt) Exiting bc.\n", 26);
|
|
|
@@ -118,7 +120,7 @@ index 012075c..c96207b 100644
|
|
|
#endif
|
|
|
}
|
|
|
diff --git a/bc/sbc.y b/bc/sbc.y
|
|
|
-index 586686b..921ab1e 100644
|
|
|
+index 586686b4b71f..921ab1e13144 100644
|
|
|
--- a/bc/sbc.y
|
|
|
+++ b/bc/sbc.y
|
|
|
@@ -86,7 +86,9 @@ program : /* empty */
|
|
|
@@ -132,10 +134,10 @@ index 586686b..921ab1e 100644
|
|
|
}
|
|
|
| program input_item
|
|
|
diff --git a/bc/scan.c b/bc/scan.c
|
|
|
-index b237f55..8dee4e9 100644
|
|
|
+index e208c8e7b3ba..5ac4c80fd732 100644
|
|
|
--- a/bc/scan.c
|
|
|
+++ b/bc/scan.c
|
|
|
-@@ -791,6 +791,7 @@ bcel_input (char *buf, yy_size_t *result, int max)
|
|
|
+@@ -776,6 +776,7 @@ bcel_input (char *buf, int *result, int max)
|
|
|
if (bcel_len != 0)
|
|
|
history (hist, &histev, H_ENTER, bcel_line);
|
|
|
fflush (stdout);
|
|
|
@@ -143,7 +145,7 @@ index b237f55..8dee4e9 100644
|
|
|
}
|
|
|
|
|
|
if (bcel_len <= max)
|
|
|
-@@ -863,6 +864,7 @@ rl_input (char *buf, int *result, int max)
|
|
|
+@@ -848,6 +849,7 @@ rl_input (char *buf, int *result, int max)
|
|
|
add_history (rl_line);
|
|
|
rl_line[rl_len-1] = '\n';
|
|
|
fflush (stdout);
|
|
|
@@ -152,10 +154,10 @@ index b237f55..8dee4e9 100644
|
|
|
|
|
|
if (rl_len <= max)
|
|
|
diff --git a/bc/scan.l b/bc/scan.l
|
|
|
-index eb2e2dd..79186bb 100644
|
|
|
+index 958538d6fed0..009f8b196a5e 100644
|
|
|
--- a/bc/scan.l
|
|
|
+++ b/bc/scan.l
|
|
|
-@@ -99,6 +99,7 @@ bcel_input (char *buf, yy_size_t *result, int max)
|
|
|
+@@ -100,6 +100,7 @@ bcel_input (char *buf, int *result, int max)
|
|
|
if (bcel_len != 0)
|
|
|
history (hist, &histev, H_ENTER, bcel_line);
|
|
|
fflush (stdout);
|
|
|
@@ -163,7 +165,7 @@ index eb2e2dd..79186bb 100644
|
|
|
}
|
|
|
|
|
|
if (bcel_len <= max)
|
|
|
-@@ -171,6 +172,7 @@ rl_input (char *buf, int *result, int max)
|
|
|
+@@ -172,6 +173,7 @@ rl_input (char *buf, int *result, int max)
|
|
|
add_history (rl_line);
|
|
|
rl_line[rl_len-1] = '\n';
|
|
|
fflush (stdout);
|
|
|
@@ -171,7 +173,7 @@ index eb2e2dd..79186bb 100644
|
|
|
}
|
|
|
|
|
|
if (rl_len <= max)
|
|
|
-@@ -295,6 +297,7 @@ limits return(Limits);
|
|
|
+@@ -296,6 +298,7 @@ limits return(Limits);
|
|
|
if (c == EOF)
|
|
|
{
|
|
|
fprintf (stderr,"EOF encountered in a comment.\n");
|
|
|
@@ -180,10 +182,10 @@ index eb2e2dd..79186bb 100644
|
|
|
}
|
|
|
}
|
|
|
diff --git a/bc/util.c b/bc/util.c
|
|
|
-index 8eba093..cacd796 100644
|
|
|
+index 7abc2a0af309..ce7cc404fb0b 100644
|
|
|
--- a/bc/util.c
|
|
|
+++ b/bc/util.c
|
|
|
-@@ -247,9 +247,10 @@ init_gen (void)
|
|
|
+@@ -248,9 +248,10 @@ init_gen (void)
|
|
|
continue_label = 0;
|
|
|
next_label = 1;
|
|
|
out_count = 2;
|
|
|
@@ -196,7 +198,7 @@ index 8eba093..cacd796 100644
|
|
|
init_load ();
|
|
|
had_error = FALSE;
|
|
|
did_gen = FALSE;
|
|
|
-@@ -272,6 +273,7 @@ generate (const char *str)
|
|
|
+@@ -273,6 +274,7 @@ generate (const char *str)
|
|
|
printf ("\n");
|
|
|
out_count = 0;
|
|
|
}
|
|
|
@@ -204,7 +206,7 @@ index 8eba093..cacd796 100644
|
|
|
}
|
|
|
else
|
|
|
load_code (str);
|
|
|
-@@ -289,6 +291,7 @@ run_code(void)
|
|
|
+@@ -290,6 +292,7 @@ run_code(void)
|
|
|
if (compile_only)
|
|
|
{
|
|
|
printf ("@r\n");
|
|
|
@@ -212,7 +214,7 @@ index 8eba093..cacd796 100644
|
|
|
out_count = 0;
|
|
|
}
|
|
|
else
|
|
|
-@@ -326,6 +329,7 @@ out_char (int ch)
|
|
|
+@@ -327,6 +330,7 @@ out_char (int ch)
|
|
|
}
|
|
|
putchar (ch);
|
|
|
}
|
|
|
@@ -220,7 +222,7 @@ index 8eba093..cacd796 100644
|
|
|
}
|
|
|
|
|
|
/* Output routines: Write a character CH to the standard output.
|
|
|
-@@ -355,6 +359,7 @@ out_schar (int ch)
|
|
|
+@@ -356,6 +360,7 @@ out_schar (int ch)
|
|
|
}
|
|
|
putchar (ch);
|
|
|
}
|
|
|
@@ -228,7 +230,7 @@ index 8eba093..cacd796 100644
|
|
|
}
|
|
|
|
|
|
|
|
|
-@@ -639,6 +644,7 @@ limits(void)
|
|
|
+@@ -640,6 +645,7 @@ limits(void)
|
|
|
#ifdef OLD_EQ_OP
|
|
|
printf ("Old assignment operatiors are valid. (=-, =+, ...)\n");
|
|
|
#endif
|
|
|
@@ -236,7 +238,7 @@ index 8eba093..cacd796 100644
|
|
|
}
|
|
|
|
|
|
/* bc_malloc will check the return value so all other places do not
|
|
|
-@@ -703,6 +709,7 @@ yyerror (str, va_alist)
|
|
|
+@@ -704,6 +710,7 @@ yyerror (str, va_alist)
|
|
|
fprintf (stderr,"%s %d: ",name,line_no);
|
|
|
vfprintf (stderr, str, args);
|
|
|
fprintf (stderr, "\n");
|
|
|
@@ -244,7 +246,7 @@ index 8eba093..cacd796 100644
|
|
|
had_error = TRUE;
|
|
|
va_end (args);
|
|
|
}
|
|
|
-@@ -743,6 +750,7 @@ ct_warn (mesg, va_alist)
|
|
|
+@@ -744,6 +751,7 @@ ct_warn (mesg, va_alist)
|
|
|
fprintf (stderr,"%s %d: Error: ",name,line_no);
|
|
|
vfprintf (stderr, mesg, args);
|
|
|
fprintf (stderr, "\n");
|
|
|
@@ -252,7 +254,7 @@ index 8eba093..cacd796 100644
|
|
|
had_error = TRUE;
|
|
|
}
|
|
|
else
|
|
|
-@@ -755,6 +763,7 @@ ct_warn (mesg, va_alist)
|
|
|
+@@ -756,6 +764,7 @@ ct_warn (mesg, va_alist)
|
|
|
fprintf (stderr,"%s %d: (Warning) ",name,line_no);
|
|
|
vfprintf (stderr, mesg, args);
|
|
|
fprintf (stderr, "\n");
|
|
|
@@ -260,7 +262,7 @@ index 8eba093..cacd796 100644
|
|
|
}
|
|
|
va_end (args);
|
|
|
}
|
|
|
-@@ -789,6 +798,7 @@ rt_error (mesg, va_alist)
|
|
|
+@@ -790,6 +799,7 @@ rt_error (mesg, va_alist)
|
|
|
va_end (args);
|
|
|
|
|
|
fprintf (stderr, "\n");
|
|
|
@@ -268,7 +270,7 @@ index 8eba093..cacd796 100644
|
|
|
runtime_error = TRUE;
|
|
|
}
|
|
|
|
|
|
-@@ -823,6 +833,7 @@ rt_warn (const char *mesg)
|
|
|
+@@ -824,6 +834,7 @@ rt_warn (const char *mesg)
|
|
|
va_end (args);
|
|
|
|
|
|
fprintf (stderr, "\n");
|
|
|
@@ -277,26 +279,26 @@ index 8eba093..cacd796 100644
|
|
|
|
|
|
/* bc_exit: Make sure to reset the edit state. */
|
|
|
diff --git a/dc/dc.c b/dc/dc.c
|
|
|
-index 6a2bb26..ccdb1c2 100644
|
|
|
+index 92a843cbdcdc..c5ea5753c91e 100644
|
|
|
--- a/dc/dc.c
|
|
|
+++ b/dc/dc.c
|
|
|
-@@ -45,6 +45,7 @@
|
|
|
- #include <getopt.h>
|
|
|
+@@ -36,6 +36,7 @@
|
|
|
+ #endif
|
|
|
+ #include "../h/getopt.h"
|
|
|
#include "dc.h"
|
|
|
- #include "dc-proto.h"
|
|
|
-+#include "number.h"
|
|
|
++#include "../h/number.h"
|
|
|
|
|
|
- #ifndef EXIT_SUCCESS /* C89 <stdlib.h> */
|
|
|
- # define EXIT_SUCCESS 0
|
|
|
-@@ -59,6 +59,7 @@ static void
|
|
|
- bug_report_info DC_DECLVOID()
|
|
|
+ const char *progname; /* basename of program invocation */
|
|
|
+ unsigned int max_recursion_depth=0;
|
|
|
+@@ -44,6 +45,7 @@ static void
|
|
|
+ bug_report_info(void)
|
|
|
{
|
|
|
printf("Email bug reports to: bug-dc@gnu.org .\n");
|
|
|
+ checkferror_output(stdout);
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-@@ -69,6 +70,7 @@ show_version DC_DECLVOID()
|
|
|
+@@ -54,6 +56,7 @@ show_version(void)
|
|
|
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);
|
|
|
@@ -304,243 +306,54 @@ index 6a2bb26..ccdb1c2 100644
|
|
|
}
|
|
|
|
|
|
/* your generic usage function */
|
|
|
-@@ -85,6 +87,7 @@ Usage: %s [OPTION] [file ...]\n\
|
|
|
+@@ -71,6 +74,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,
|
|
|
+ /* returns a pointer to one past the last occurrence of c in s,
|
|
|
diff --git a/dc/eval.c b/dc/eval.c
|
|
|
-index 05a3d9e..6c54e61 100644
|
|
|
+index 30d0a20381d1..26e6d21256f9 100644
|
|
|
--- a/dc/eval.c
|
|
|
+++ b/dc/eval.c
|
|
|
-@@ -41,6 +41,7 @@
|
|
|
+@@ -33,6 +33,7 @@
|
|
|
+ # include <unistd.h> /* isatty */
|
|
|
#endif
|
|
|
#include "dc.h"
|
|
|
- #include "dc-proto.h"
|
|
|
-+#include "number.h"
|
|
|
-
|
|
|
- typedef enum {DC_FALSE, DC_TRUE} dc_boolean;
|
|
|
-
|
|
|
-@@ -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);
|
|
|
++#include "../h/number.h"
|
|
|
+
|
|
|
+ typedef enum {
|
|
|
+ DC_OKAY, //no further intervention needed for this command
|
|
|
+@@ -421,6 +422,7 @@ dc_nextcmd(void)
|
|
|
+ || tmpint < 2 || DC_IBASE_MAX < tmpint) {
|
|
|
+ fprintf(stderr, "%s: input base must be a number "
|
|
|
+ "between 2 and %d (inclusive)\n", progname, DC_IBASE_MAX);
|
|
|
+ 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:
|
|
|
+ }
|
|
|
+ dc_discard_TOS();
|
|
|
diff --git a/dc/misc.c b/dc/misc.c
|
|
|
-index cd23602..cd910b8 100644
|
|
|
+index e64f62aca1e9..17e337792a84 100644
|
|
|
--- a/dc/misc.c
|
|
|
+++ b/dc/misc.c
|
|
|
-@@ -47,6 +47,7 @@
|
|
|
- #include <getopt.h>
|
|
|
+@@ -31,12 +31,14 @@
|
|
|
+ #include <ctype.h>
|
|
|
#include "dc.h"
|
|
|
- #include "dc-proto.h"
|
|
|
-+#include "number.h"
|
|
|
+ #include "../config.h"
|
|
|
++#include "../h/number.h"
|
|
|
+
|
|
|
+ /* print a simple warning message */
|
|
|
+ void
|
|
|
+ dc_warn(const char *msg)
|
|
|
+ {
|
|
|
+ fprintf(stderr, "%s: %s\n", progname, msg);
|
|
|
++ checkferror_output(stderr);
|
|
|
+ }
|
|
|
|
|
|
- #ifndef EXIT_FAILURE /* C89 <stdlib.h> */
|
|
|
- # define EXIT_FAILURE 1
|
|
|
-@@ -89,6 +89,7 @@ dc_show_id DC_DECLARG((fp, id, suffix))
|
|
|
+ /* print an "out of memory" diagnostic and exit program */
|
|
|
+@@ -71,6 +73,7 @@ dc_show_id(FILE *fp, int id, const char *suffix)
|
|
|
fprintf(fp, "'%c' (%#o)%s", (unsigned int) id, id, suffix);
|
|
|
else
|
|
|
fprintf(fp, "%#o%s", (unsigned int) id, suffix);
|
|
|
@@ -549,42 +362,10 @@ index cd23602..cd910b8 100644
|
|
|
|
|
|
|
|
|
diff --git a/dc/numeric.c b/dc/numeric.c
|
|
|
-index 37759de..60cfb85 100644
|
|
|
+index 556c5bd6478f..887688b0d64f 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))
|
|
|
+@@ -408,6 +408,7 @@ dc_dump_num(dc_num dcvalue)
|
|
|
|
|
|
for (cur=top_of_stack; cur; cur=next) {
|
|
|
putchar(cur->digit);
|
|
|
@@ -592,7 +373,7 @@ index 37759de..60cfb85 100644
|
|
|
next = cur->link;
|
|
|
free(cur);
|
|
|
}
|
|
|
-@@ -587,6 +592,8 @@ out_char (ch)
|
|
|
+@@ -493,6 +494,8 @@ out_char (int ch)
|
|
|
out_col = 1;
|
|
|
}
|
|
|
putchar(ch);
|
|
|
@@ -601,119 +382,72 @@ index 37759de..60cfb85 100644
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-@@ -626,6 +633,7 @@ rt_error (mesg, va_alist)
|
|
|
- vfprintf (stderr, mesg, args);
|
|
|
- va_end (args);
|
|
|
- fprintf (stderr, "\n");
|
|
|
+@@ -516,6 +519,7 @@ rt_error(const char *mesg, ...)
|
|
|
+ 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");
|
|
|
+@@ -533,6 +537,7 @@ rt_warn(const char *mesg, ...)
|
|
|
+ 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
|
|
|
+index 35f8ee7cc876..36755e42a87d 100644
|
|
|
--- a/dc/stack.c
|
|
|
+++ b/dc/stack.c
|
|
|
-@@ -33,9 +33,13 @@
|
|
|
+@@ -28,6 +28,7 @@
|
|
|
+ #include <stdlib.h>
|
|
|
#include "dc.h"
|
|
|
- #include "dc-proto.h"
|
|
|
#include "dc-regdef.h"
|
|
|
-+#include "number.h"
|
|
|
++#include "../h/number.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))
|
|
|
+ #define Empty_Stack dc_warn("stack empty")
|
|
|
+@@ -388,6 +389,7 @@ dc_register_pop(int stackid, dc_data *result)
|
|
|
r = dc_register[stackid];
|
|
|
- if (r==NULL || r->value.dc_type==DC_UNINITIALIZED){
|
|
|
+ if (!r || 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
|
|
|
+index 41b578c130d2..bc8cac8248df 100644
|
|
|
--- a/dc/string.c
|
|
|
+++ b/dc/string.c
|
|
|
-@@ -45,6 +45,7 @@
|
|
|
- #endif
|
|
|
+@@ -26,6 +26,7 @@
|
|
|
+ #include <stdlib.h>
|
|
|
+ #include <string.h> /* memcpy */
|
|
|
#include "dc.h"
|
|
|
- #include "dc-proto.h"
|
|
|
-+#include "number.h"
|
|
|
++#include "../h/number.h"
|
|
|
|
|
|
/* here is the completion of the dc_string type: */
|
|
|
struct dc_string {
|
|
|
-@@ -94,6 +94,7 @@ dc_out_str DC_DECLARG((value, discard_flag))
|
|
|
- dc_discard discard_flag DC_DECLEND
|
|
|
+@@ -71,6 +72,7 @@ void
|
|
|
+ dc_out_str(dc_str value, dc_discard discard_flag)
|
|
|
{
|
|
|
fwrite(value->s_ptr, value->s_len, sizeof *value->s_ptr, stdout);
|
|
|
-+ checkferror_output(stdout);
|
|
|
++ checkferror_output(stdout);
|
|
|
if (discard_flag == DC_TOSS)
|
|
|
dc_free_str(&value);
|
|
|
}
|
|
|
-@@ -169,6 +170,7 @@ dc_readstring DC_DECLARG((fp, ldelim, rdelim))
|
|
|
+@@ -155,6 +157,7 @@ dc_readstring(int (*input)(void), int ldelim, int rdelim, const char *augment)
|
|
|
}
|
|
|
*p++ = c;
|
|
|
}
|
|
|
-+ checkferror_input(fp);
|
|
|
- return dc_makestring(line_buf, (size_t)(p-line_buf));
|
|
|
- }
|
|
|
-
|
|
|
++
|
|
|
+ if (c==EOF && p==line_buf)
|
|
|
+ return dc_makestring(NULL, 0, NULL);
|
|
|
+ return dc_makestring(line_buf, (size_t)(p-line_buf), augment);
|
|
|
diff --git a/h/number.h b/h/number.h
|
|
|
-index abf6332..1983ab4 100644
|
|
|
+index b2d9f9eae46a..f6fc880de920 100644
|
|
|
--- a/h/number.h
|
|
|
+++ b/h/number.h
|
|
|
@@ -23,10 +23,10 @@
|
|
|
@@ -731,19 +465,20 @@ index abf6332..1983ab4 100644
|
|
|
*************************************************************************/
|
|
|
|
|
|
#ifndef _NUMBER_H_
|
|
|
-@@ -140,4 +140,7 @@ void bc_out_num (bc_num num, int o_base, void (* out_char)(int),
|
|
|
- int leading_zero);
|
|
|
-
|
|
|
+@@ -142,6 +142,8 @@ void bc_out_num (bc_num num, int o_base, void (* out_char)(int),
|
|
|
void bc_out_long (long val, int size, int space, void (*out_char)(int));
|
|
|
-+
|
|
|
+
|
|
|
+
|
|
|
+void checkferror_input (FILE*);
|
|
|
+void checkferror_output (FILE*);
|
|
|
- #endif
|
|
|
+
|
|
|
+ /* function prototypes for callbacks from the library which
|
|
|
+ * need to be provided by the application
|
|
|
diff --git a/lib/number.c b/lib/number.c
|
|
|
-index f394e92..80b33e3 100644
|
|
|
+index f84f4fc87336..9d4553a14b37 100644
|
|
|
--- a/lib/number.c
|
|
|
+++ b/lib/number.c
|
|
|
-@@ -1713,6 +1713,7 @@ static void
|
|
|
+@@ -1714,6 +1714,7 @@ static void
|
|
|
out_char (int c)
|
|
|
{
|
|
|
putchar(c);
|
|
|
@@ -751,7 +486,7 @@ index f394e92..80b33e3 100644
|
|
|
}
|
|
|
|
|
|
|
|
|
-@@ -1721,6 +1722,7 @@ pn (bc_num num)
|
|
|
+@@ -1722,6 +1723,7 @@ pn (bc_num num)
|
|
|
{
|
|
|
bc_out_num (num, 10, out_char, 0);
|
|
|
out_char ('\n');
|
|
|
@@ -759,7 +494,7 @@ index f394e92..80b33e3 100644
|
|
|
}
|
|
|
|
|
|
|
|
|
-@@ -1732,6 +1734,28 @@ pv (char *name, unsigned char *num, int len)
|
|
|
+@@ -1733,6 +1735,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");
|
|
|
@@ -789,5 +524,5 @@ index f394e92..80b33e3 100644
|
|
|
+ }
|
|
|
+}
|
|
|
--
|
|
|
-2.17.1
|
|
|
+2.43.0
|
|
|
|