From 9204d2fb8cac01c15c0e652f4cdf036e2d704848 Mon Sep 17 00:00:00 2001 From: Landon Curt Noll Date: Fri, 15 Oct 1999 11:48:41 -0700 Subject: [PATCH] Release calc version 2.11.0t7.2 --- BUGS | 12 -- CHANGES | 17 ++ calc.c | 96 ++++------ calc.h | 42 ++++- calc.man | 535 +++++++++++++++++++++++++++++++++++------------------ help/usage | 76 ++++++-- input.c | 6 +- lib_calc.c | 21 ++- token.c | 4 + version.c | 2 +- 10 files changed, 536 insertions(+), 275 deletions(-) diff --git a/BUGS b/BUGS index 0ef8e99..e888b66 100644 --- a/BUGS +++ b/BUGS @@ -77,15 +77,3 @@ Known problems or mis-features: * There is some places in the source with obscure variable names and not much in the way of comments. We need some major cleanup and documentation. - - * On a Dec Alpha, using the Dec Alpha cc (not gcc) make check for - version 2.11.0t5.1 fails in the regression test: - - From vandermj@molbio.sbphrd.com Tue Oct 5 04:06:52 1999 - Subject: Re: oops, try calc version 2.10.0t5.1 - Date: Tue, 05 Oct 1999 07:06:30 -0400 - - Regular cc on Dec alpha, 'make check' dies with: - - 1804: surd_value(a) == 2+3i - "": line 1706: Calling qfreenum with nozero links!!! diff --git a/CHANGES b/CHANGES index 31939b0..b12d24d 100644 --- a/CHANGES +++ b/CHANGES @@ -103,6 +103,23 @@ Following is the change from calc version 2.11.0t7 to date: n == 0 if -c, continue, without -c, stop n < 0 continue on error, even if -c was given on the command line + Calc compilation now stops at the first scanerror. + + Restored the feature where -p disables the printing of leading tabs + as of config("tab",0) had been executed. So using calc in a pipe: + + calc -p 2+17 | whey + + will write '19' instead of '\t17' to the whey command. + + Updated calc man page and help/usage file to reflect recent + command line changes. + + Converted start_done into a general calc run state enum called + run_state within the calc source. + + Misc calc man page fixes. + Following is the change from calc version 2.11.0t1 to 2.11.0t6.3: diff --git a/calc.c b/calc.c index b050010..47bd5a4 100644 --- a/calc.c +++ b/calc.c @@ -11,7 +11,6 @@ #include #include #include -#include #define CALC_C #include "calc.h" @@ -37,40 +36,13 @@ #include #endif - -/* - * external definitions and functions - */ -extern int abortlevel; /* current level of aborts */ -extern BOOL inputwait; /* TRUE if in a terminal input wait */ -extern jmp_buf jmpbuf; /* for errors */ -extern int isatty(int tty); /* TRUE if fd is a tty */ - -extern int p_flag; /* TRUE => pipe mode */ -extern int q_flag; /* TRUE => don't execute rc files */ -extern int u_flag; /* TRUE => unbuffer stdin and stdout */ -extern int d_flag; /* TRUE => disable heading, lib_debug == 0 */ -extern int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */ - -extern char *pager; /* $PAGER or default */ -extern int stdin_tty; /* TRUE if stdin is a tty */ -extern int interactive; /* TRUE if interactive session (no cmd args) */ -extern char *program; /* our name */ -extern char cmdbuf[]; /* command line expression */ - -extern char *version(void); /* return version string */ - - /* * static definitions and functions */ -static char *usage = "usage: %s [-C] [-e] [-h] [-i] [-m mode] [-n] [-p]\n" - "\t[-q] [-u] [-c] [-d] [[--] calc_cmd ...]\n"; +static char *usage = "usage: %s [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]\n" + "\t[-n] [-p] [-q] [-u] [-v] [[--] calc_cmd ...]\n"; static void intint(int arg); /* interrupt routine */ -static int havecommands; -static int c_flag; /* To permit continuation after error */ -static int i_flag; /* To go interactive if permitted */ /* * Top level calculator routine. @@ -163,8 +135,7 @@ main(int argc, char **argv) exit(1); } } - interactive = (optind >= argc); - havecommands = !interactive; + havecommands = (optind < argc); /* * look at the length of any trailing command args @@ -258,69 +229,73 @@ main(int argc, char **argv) post_init = TRUE; } + /* + * (re)establish the interrupt handler + */ (void) signal(SIGINT, intint); - if (start_done == 0) { + /* + * execute calc code based on the run state + */ + if (run_state == RUN_PRE_BEGIN) { if (!q_flag && allow_read) { - start_done = 1; + run_state = RUN_PRE_RCFILES; runrcfiles(); } - start_done = 2; + run_state = RUN_POST_RCFILES; } - if (start_done == 1) { + if (run_state == RUN_PRE_RCFILES) { fprintf(stderr, "Execution error in rcfiles\n"); if ((c_flag && !stoponerror) || stoponerror < 0) { getcommands(FALSE); - start_done = 2; + run_state = RUN_POST_RCFILES; } else { if ((havecommands && !i_flag) || !stdin_tty) - start_done = 7; + run_state = RUN_STOP_ON_ERROR; else if (havecommands) - start_done = 4; + run_state = RUN_POST_CMD_ARGS; else - start_done = 2; + run_state = RUN_POST_RCFILES; } } - if (start_done == 2) { + if (run_state == RUN_POST_RCFILES) { if (havecommands) { - start_done = 3; + run_state = RUN_PRE_CMD_ARGS; (void) openstring(cmdbuf); getcommands(FALSE); } - start_done = 4; + run_state = RUN_POST_CMD_ARGS; } - if (start_done == 3) { + if (run_state == RUN_PRE_CMD_ARGS) { fprintf(stderr, "Execution error in commands\n"); if ((c_flag && !stoponerror) || stoponerror < 0) { getcommands(FALSE); - start_done = 4; - } - else { + run_state = RUN_POST_CMD_ARGS; + } else { closeinput(); if (!stdin_tty || !i_flag) - start_done = 7; + run_state = RUN_STOP_ON_ERROR; else - start_done = 4; + run_state = RUN_POST_CMD_ARGS; } } - if (start_done == 4) { + if (run_state == RUN_POST_CMD_ARGS) { if (stdin_tty && ((havecommands && !i_flag) || p_flag)) - start_done = 6; + run_state = RUN_NOT_TOP_LEVEL; else openterminal(); - } - else if (start_done == 5) { - if (!stdin_tty && (!c_flag || stoponerror) && stoponerror >= 0) { - start_done = 7; - } - else if ((c_flag && !stoponerror) || stoponerror < 0) + } else if (run_state == RUN_TOP_LEVEL) { + if (!stdin_tty && (!c_flag || stoponerror) && + stoponerror >= 0) { + run_state = RUN_STOP_ON_ERROR; + } else if ((c_flag && !stoponerror) || stoponerror < 0) getcommands(FALSE); else reinitialize(); } - if (start_done < 6) { - start_done = 5; + if (run_state < RUN_NOT_TOP_LEVEL) { + run_state = RUN_TOP_LEVEL; getcommands(TRUE); } @@ -328,7 +303,8 @@ main(int argc, char **argv) * all done */ libcalc_call_me_last(); - return (start_done - 6) ? 1 : 0; + return (run_state == RUN_STOP_ON_ERROR || + run_state == RUN_UNKNOWN) ? 1 : 0; } diff --git a/calc.h b/calc.h index a7474be..6902f74 100644 --- a/calc.h +++ b/calc.h @@ -10,6 +10,7 @@ #if !defined(__CALC_H__) #define __CALC_H__ +#include #include "value.h" @@ -146,15 +147,34 @@ extern void showerrors(void); */ extern void initialize(void); extern void reinitialize(void); - +extern int isatty(int tty); /* TRUE if fd is a tty */ +extern char *version(void); /* return version string */ +extern int post_init; /* TRUE => setjmp for math_error is ready */ /* - * Global data definitions. + * global flags and definitions */ +extern int abortlevel; /* current level of aborts */ +extern BOOL inputwait; /* TRUE if in a terminal input wait */ +extern jmp_buf jmpbuf; /* for errors */ + +extern int p_flag; /* TRUE => pipe mode */ +extern int q_flag; /* TRUE => don't execute rc files */ +extern int u_flag; /* TRUE => unbuffer stdin and stdout */ +extern int d_flag; /* TRUE => disable heading, lib_debug == 0 */ +extern int c_flag; /* TRUE => continue after error if permitted */ +extern int i_flag; /* TRUE => try to go interactive after error */ +extern int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */ + +extern char *pager; /* $PAGER or default */ +extern int stdin_tty; /* TRUE if stdin is a tty */ +extern int havecommands; /* TRUE if have cmd args) */ +extern char *program; /* our name */ +extern char cmdbuf[]; /* command line expression */ + extern int abortlevel; /* current level of aborts */ extern BOOL inputwait; /* TRUE if in a terminal input wait */ extern VALUE *stack; /* execution stack */ -extern int start_done; /* TRUE => start up processing finished */ extern int dumpnames; /* TRUE => dump names rather than indices */ extern char *calcpath; /* $CALCPATH or default */ @@ -172,7 +192,21 @@ extern int allow_read; /* FALSE => may not open any files for reading */ extern int allow_write; /* FALSE => may not open any files for writing */ extern int allow_exec; /* FALSE => may not execute any commands */ -extern int post_init; /* TRUE => setjmp for math_error is ready */ +/* + * calc startup and run state + */ +typedef enum { + RUN_UNKNOWN = -1, /* unknown or unset start state */ + RUN_PRE_BEGIN = 0, /* pre-startup state, calc execution started */ + RUN_PRE_RCFILES = 1, /* rc files about to or are being evaluated */ + RUN_POST_RCFILES = 2, /* rc files have been evaluated */ + RUN_PRE_CMD_ARGS = 3, /* cmd_args about to or are being evaluated */ + RUN_POST_CMD_ARGS = 4, /* cmd_args have been evaluated */ + RUN_TOP_LEVEL = 5, /* running at the top interactive level */ + RUN_NOT_TOP_LEVEL = 6, /* running not at the top interactive level */ + RUN_STOP_ON_ERROR = 7 /* we need to stop due to errors */ +} run; +extern run run_state; /* diff --git a/calc.man b/calc.man index ae534d1..0f22b48 100644 --- a/calc.man +++ b/calc.man @@ -1,190 +1,356 @@ .\" -.\" Copyright (c) 1994 David I. Bell and Landon Curt Noll +.\" Copyright (c) 1993 David I. Bell and Landon Curt Noll +.\" Original man page dated 15nov93 +.\" Copyright (c) 1999 David I. Bell and Landon Curt Noll .\" Permission is granted to use, distribute, or modify this source, .\" provided that this copyright notice remains intact. .\" .\" calculator by David I. Bell .\" man page by Landon Noll -.TH calc 1 "^..^" "15nov93" +.TH calc 1 "^..^" "15Oct1999" .SH NAME calc \- arbitrary precision calculator .SH SYNOPSIS \fIcalc\fP -[\fI\-h\fP] -[\fI\-m mode\fP] -[\fI\-p\fP] -[\fI\-q\fP] -[\fI\-u\fP] -[\fI\-v\fP] -[\fIcalc_cmd \&.\|.\|.\fp] +.RB [ \-c ] +.RB [ \-C ] +.RB [ \-d ] +.RB [ \-e ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-m\ \&mode ] +.br +.in +5n +.RB [ \-n ] +.RB [ \-p ] +.RB [ \-q ] +.RB [ \-u ] +.RB [ \-v ] +.RB [ calc_cmd\ \&.\|.\|. ] +.in -5n .SH DESCRIPTION \& .br CALC COMMAND LINE .PP + .TP -\fI\-h\fP -Print a help message. -This option implies \fI \-q\fP. -This is equivalent to the calc command \fIhelp help\fP. -The help facility is disabled unless the \fImode\fP is 5 or 7. -See \fI\-m\fP below. -.sp -.TP -\fI\-m mode\fP -This flag sets the permission mode of calc. -It controls the ability for \fIcalc\fP to open files -and execute programs. -\fIMode\fP may be a number from 0 to 7. -.sp -The \fImode\fP value is interpreted in a way similar -to that of the \fRchmod(1)\fP octal mode: -.sp -.in +0.5i +.B \-c +Continue reading command lines even after an execution +error has caused the abandonment of a line. +.sp 1 +For example: +.sp 1 +.in +5n .nf -0 do not open any file, do not execute progs -1 do not open any file -2 do not open files for reading, do not execute progs -3 do not open files for reading -4 do not open files for writing, do not execute progs -5 do not open files for writing -6 do not execute any program -7 allow everything (default mode) +calc read many_errors.cal .fi -.in -0.5i -.sp -If one wished to run calc from a privledged user, one might -want to use \fI\-m 0\fP in an effort to make calc more secure. -.sp -\fIMode\fP bits for reading and writing apply only on an open. +.in -5n +.sp 1 +will cause +.B calc +to abort on the first error, whereas: +.sp 1 +.in +5n +.nf +calc -c read many_errors.cal +.fi +.in -5n +.sp 1 +will +cause +.B calc +to try to process each line being read +despite the errors that it encounters. + +.TP +.B \-C +Permit the execution of custom builtin functions. Without +this flag, calling the custom() builtin function will +simply generate an error. +.sp 1 +Use if this flag may cause +.B calc +to execute functions that +are non-standard and that are not portable. Custom builtin +functions are disabled by default for this reason. + +.TP +.B \-d +Disable the printing of the opening title. The printing +of library debug and informational messages is also disabled +as if \fBconfig("lib_debug", 0)\fP had been executed. +.sp 1 +For example: +.sp 1 +.in +5n +calc 'read qtime; qtime(2)' +.in -5n +.sp 1 +will output something like: +.sp 1 +.in +5n +.nf +qtime(utc_hr_offset) defined +It's nearly ten past six. +.fi +.in -5n +.sp 1 +whereas: +.sp 1 +.in +5n +.nf +calc -d 'read qtime; qtime(2)' +.fi +.in -5n +.sp 1 +will just say: +.sp 1 +.in +5n +.nf +It's nearly ten past six. +.fi +.in -5n +.sp 1 + +.TP +.B \-e +Ignore any environment variables on startup. +The getenv() builtin will still return values, however. + +.TP +.B \-h +Print a help message. This option implies +.BR \-q . +This +is equivalent to the +.B calc +command help help. +The help facility is disabled unless the mode is 5 or 7. +See +.BR \-m . + +.TP +.B \-i +Become interactive if possible. +Be default, if +.I calc_cmd +args are given, +.B calc +will execute them and exit. +This flag args are given, +.B calc +will execute them and exit. +This flag will cause +.B calc +to drop into interactive mode after the +commands are executed. +.sp 1 +For example: +.sp 1 +.in +5n +.nf +calc 2+5 +.fi +.in -5n +.sp 1 +will print the value 7 and exit whereas: +.sp 1 +.in +5n +.nf +calc -i 2+5 +.fi +.in -5n +.sp 1 +will print the value 7 and prompt the user for more +.B calc +commands. + +.TP +.BR \-m " mode" +This flag sets the permission mode of +.BR calc . +It controls the ability for +.B calc +to open files and execute programs. +Mode may be a number from 0 to 7. +.sp 1 +The mode value is interpreted in a way similar to that +of the +.BR chmod (1) +octal mode: +.sp 1 +.in +5n +.nf +0 do not open any file, do not execute progs +1 do not open any file +2 do not open files for reading, do not execute progs +3 do not open files for reading +4 do not open files for writing, do not execute progs +5 do not open files for writing +6 do not execute any program +7 allow everything (default mode) +.fi +.in -5n +.sp 1 +If one wished to run +.B calc +from a privileged user, one might want to use +.B \-m +0 in an effort to make +.B calc +somewhat more secure. +.sp 1 +Mode bits for reading and writing apply only on an +open. Files already open are not effected. -Thus if one wanted to use the \fI\-m 0\fP in an effort to make -\fIcalc\fP more secure, but still wanted to read and write a specific -file, one might want to do: -.sp -.in +0.5i +Thus if one wanted to use the +.B \-m +0 in an effort to make +.B calc +somewhat more secure, but still wanted to read and write a specific +file, one might want to do in +.BR sh (1), +.BR ksh (1), +.BR bash (1)-like +shells: +.sp 1 +.in +5n .nf -\fRcalc \-m 0 3 RUN_PRE_BEGIN) { fprintf(stderr, "open of %s mode %s - %s\n", name, mode, "open for read or write disallowed by -m\n"); @@ -319,7 +319,7 @@ f_open(char *name, char *mode) return NULL; } else if (!allow_read && strchr(mode, 'r') != NULL) { /* reading new files disallowed */ - if (start_done) { + if (run_state > RUN_PRE_BEGIN) { fprintf(stderr, "open of %s mode %s - %s\n", name, mode, "open for read disallowed by -m\n"); @@ -330,7 +330,7 @@ f_open(char *name, char *mode) strchr(mode, 'a') != NULL || strchr(mode, '+') != NULL)) { /* writing new files disallowed */ - if (start_done) { + if (run_state > RUN_PRE_BEGIN) { fprintf(stderr, "open of %s mode %s - %s\n", name, mode, "open for write disallowed by -m\n"); diff --git a/lib_calc.c b/lib_calc.c index e6b41c4..162492d 100644 --- a/lib_calc.c +++ b/lib_calc.c @@ -63,8 +63,8 @@ int new_std = FALSE; /* TRUE (-n) => use newstd configuration */ int abortlevel; /* current level of aborts */ BOOL inputwait; /* TRUE if in a terminal input wait */ jmp_buf jmpbuf; /* for errors */ -int start_done = FALSE; /* TRUE => start up processing finished */ -char *program = "calc"; /* our name */ +run run_state = RUN_UNKNOWN; /* calc startup and run state */ +char *program = "calc"; /* our name */ char cmdbuf[MAXCMD+1+1+1]; /* command line expression + "\n\0" + guard */ @@ -83,8 +83,8 @@ int p_flag = FALSE; /* TRUE => pipe mode */ int q_flag = FALSE; /* TRUE => don't execute rc files */ int u_flag = FALSE; /* TRUE => unbuffer stdin and stdout */ int d_flag = FALSE; /* TRUE => disable heading, lib_debug == 0 */ - -int stoponerror = FALSE; /* >0 => stop, <0 => continue on error */ +int c_flag = FALSE; /* TRUE => continue on error if permitted */ +int i_flag = FALSE; /* TRUE => go interactive if permitted */ /* * global values @@ -96,8 +96,9 @@ char *home; /* $HOME or default */ char *pager; /* $PAGER or default */ char *shell; /* $SHELL or default */ int stdin_tty = FALSE; /* TRUE if stdin is a tty */ -int interactive = FALSE; /* TRUE if interactive session (no cmd args) */ -int post_init = FALSE; /* TRUE setjmp for math_error is readready */ +int havecommands = FALSE; /* TRUE if have one or more cmd args */ +int stoponerror = FALSE; /* >0 => stop, <0 => continue on error */ +int post_init = FALSE; /* TRUE setjmp for math_error is ready */ int no_env = FALSE; /* TRUE (-e) => ignore env vars on startup */ int errmax = ERRMAX; /* if >= 0, maximum value for errcount */ @@ -164,6 +165,13 @@ libcalc_call_me_first(void) conf->lib_debug = 0; } + /* + * -p turns off tab + */ + if (p_flag) { + conf->tab_ok = 0; + } + /* * initialize */ @@ -172,6 +180,7 @@ libcalc_call_me_first(void) /* * ready to rock & roll .. */ + run_state = RUN_PRE_BEGIN; init_done = 1; return; } diff --git a/token.c b/token.c index fc8bc59..98ab8c7 100644 --- a/token.c +++ b/token.c @@ -643,6 +643,10 @@ scanerror(int skip, char *fmt, ...) va_end(ap); fprintf(stderr, "%s\n", buf); + /* bail out if continuation not permitted */ + if ((!c_flag && !stoponerror) || stoponerror > 0) + longjmp(jmpbuf, 1); + /* bail out if too many errors */ if (conf->maxscancount > 0 && errorcount > conf->maxscancount) { fputs("Too many scan errors, compilation aborted.\n", stderr); diff --git a/version.c b/version.c index 7f12936..9765d67 100644 --- a/version.c +++ b/version.c @@ -12,7 +12,7 @@ #define MAJOR_VER 2 /* major version */ #define MINOR_VER 11 /* minor version */ #define MAJOR_PATCH 0 /* patch level or 0 if no patch */ -#define MINOR_PATCH "7.1" /* test number or empty string if no patch */ +#define MINOR_PATCH "7.2" /* test number or empty string if no patch */ /* * calc version constants