diff --git a/BUGS b/BUGS index 874fce8..e9887bf 100644 --- a/BUGS +++ b/BUGS @@ -96,8 +96,8 @@ Known bugs: the terminal in a 'bad' state, as if stty -icanon -echo -echoe had been executed. - * Dec Alpha Linux compiling with gcc-2.95.1 and -O2 fails the - regression test with: + * Dec Alpha Linux compiling with gcc-2.95.1 (or gcc-2.95.2) and + -O2 fails the regression test with: make -s check 000: Beginning regression tests diff --git a/CHANGES b/CHANGES index c6ca8d2..224dd46 100644 --- a/CHANGES +++ b/CHANGES @@ -28,11 +28,10 @@ Following is the change from calc version 2.11.0t8.9.1 to date: The eval(str) builtin will return an error-value rather than cause an execution error str has a scan-error. - Declaration are permitted to end with EOF as well as a newline or ';'. + Declarations are permitted to end with EOF as well as a newline or ';'. - When prompt() occurs in reading a file, it will take inout from - the terminal rather than taking it from a file. For example, - this script, when read, now works: + When prompt() occurs while reading a file, it will take input from + the terminal rather than taking it from a file. For example: /* This demonstrates the use of prompt() and some other things */ config("verbose_quit", 0); @@ -52,17 +51,38 @@ Following is the change from calc version 2.11.0t8.9.1 to date: } print "Good bye"; - Comments entered at inputisterminal level may be spread over several + Comments entered at input terminal level may be spread over several lines. For example: /* - * These commands work given the file: comment.cal - * + * Assume that this calc script is called: comment.cal + * Then these commands now work: * cat comment.cal | calc * calc < comment.cal */ print "Hello"; + Added: + + -D calc_debug[:lib_debug:[user_debug]] + + to set the initial value of config("calc_debug"), config("lib_debug") + and config("user_debug"). + + The : separated strings of -D are interpreted as signed 32 bit values. + After an optional leading sign a leading zero indicates octal + conversion, and a leading ``0x'' or ``0X'' hexadecimal conversion. + Otherwise, decimal conversion is assumed. + + Reordered the config structure moving calc_debug ahead of lib_debug. + + Added bits 4 and 5 to config("calc_debug"): + + 4 Report on changes to the state of stdin as well as changes + to internal variables that control the setting and restoring + of stdin. + + 5 Report on changes to the run state of calc. Following is the change from calc version 2.11.0t8 to 2.11.0t8.9: diff --git a/calc.c b/calc.c index d35cfff..d55818c 100644 --- a/calc.c +++ b/calc.c @@ -40,6 +40,7 @@ * static definitions and functions */ static char *usage = "usage: %s [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]\n" + "\t[-D calc_debug[:lib_debug:[user_debug]]]\n" "\t[-n] [-p] [-q] [-u] [-v] [[--] calc_cmd ...]\n"; static void intint(int arg); /* interrupt routine */ @@ -55,13 +56,14 @@ main(int argc, char **argv) extern char *optarg; /* option argument */ extern int optind; /* option index */ int c; /* option */ + char *p; long i; /* * parse args */ program = argv[0]; - while ((c = getopt(argc, argv, "Cehim:npquvcd")) != -1) { + while ((c = getopt(argc, argv, "Cehim:npquvcdD:")) != -1) { switch (c) { case 'C': #if defined(CUSTOM) @@ -126,6 +128,26 @@ main(int argc, char **argv) */ printf("%s (version %s)\n", CALC_TITLE, version()); exit(0); + case 'D': + /* + * parse the -D optarg + * + * Could be calc_debug + * or calc_debug:lib_debug + * or calc_debug:lib_debug:user_debug + */ + calc_debug = optarg; + p = strchr(optarg, ':'); + if (p != NULL) { + *p = '\0'; + lib_debug = p+1; + p = strchr(lib_debug, ':'); + if (p != NULL) { + *p = '\0'; + user_debug = p+1; + } + } + break; default: /* * we are too early in processing to call @@ -185,6 +207,8 @@ main(int argc, char **argv) */ libcalc_call_me_first(); stdin_tty = isatty(0); /* assume stdin is on fd 0 */ + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: stdin_tty is %d\n", stdin_tty); if (want_defhelp) { givehelp(DEFAULTCALCHELP); libcalc_call_me_last(); @@ -239,9 +263,17 @@ main(int argc, char **argv) */ if (run_state == RUN_BEGIN) { if (!q_flag && allow_read) { + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_RCFILES)); run_state = RUN_RCFILES; runrcfiles(); } + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_PRE_CMD_ARGS)); run_state = RUN_PRE_CMD_ARGS; } @@ -252,25 +284,46 @@ main(int argc, char **argv) if (inputlevel() == 0) { closeinput(); runrcfiles(); + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_PRE_CMD_ARGS)); run_state = RUN_PRE_CMD_ARGS; } else { closeinput(); } } else { - if ((havecommands && !i_flag) || !stdin_tty) + if ((havecommands && !i_flag) || !stdin_tty) { + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_EXIT_WITH_ERROR)); run_state = RUN_EXIT_WITH_ERROR; - else + } else { + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_PRE_CMD_ARGS)); run_state = RUN_PRE_CMD_ARGS; + } } } if (run_state == RUN_PRE_CMD_ARGS) { if (havecommands) { + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_CMD_ARGS)); run_state = RUN_CMD_ARGS; (void) openstring(cmdbuf, (long) strlen(cmdbuf)); getcommands(FALSE); closeinput(); } + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_PRE_TOP_LEVEL)); run_state = RUN_PRE_TOP_LEVEL; } @@ -279,19 +332,36 @@ main(int argc, char **argv) if ((c_flag && !stoponerror) || stoponerror < 0) { getcommands(FALSE); if (inputlevel() == 0) + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_PRE_TOP_LEVEL)); run_state = RUN_PRE_TOP_LEVEL; closeinput(); } else { closeinput(); - if (!stdin_tty || !i_flag || p_flag) + if (!stdin_tty || !i_flag || p_flag) { + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_EXIT_WITH_ERROR)); run_state = RUN_EXIT_WITH_ERROR; - else + } else { + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_PRE_TOP_LEVEL)); run_state = RUN_PRE_TOP_LEVEL; + } } } if (run_state == RUN_PRE_TOP_LEVEL) { if (stdin_tty && ((havecommands && !i_flag) || p_flag)) { + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_EXIT)); run_state = RUN_EXIT; } else { if (stdin_tty) { @@ -300,6 +370,10 @@ main(int argc, char **argv) resetinput(); openterminal(); } + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_TOP_LEVEL)); run_state = RUN_TOP_LEVEL; getcommands(TRUE); } @@ -315,6 +389,10 @@ main(int argc, char **argv) reinitialize(); getcommands(TRUE); } else { + if (conf->calc_debug & CALCDBG_RUNSTATE) + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_EXIT_WITH_ERROR)); run_state = RUN_EXIT_WITH_ERROR; } } diff --git a/calc.h b/calc.h index 69a6795..266dc8f 100644 --- a/calc.h +++ b/calc.h @@ -208,6 +208,7 @@ typedef enum { RUN_EXIT_WITH_ERROR = 7 /* exit with error */ } run; extern run run_state; +extern char *run_state_name(run state); /* * calc version information diff --git a/calc.man b/calc.man index 0fe3673..561888e 100644 --- a/calc.man +++ b/calc.man @@ -15,17 +15,19 @@ calc \- arbitrary precision calculator .RB [ \-c ] .RB [ \-C ] .RB [ \-d ] +.RB [ -D\ \&calc_debug[:lib_debug:[user_debug]] ] +.br +.in +5n .RB [ \-e ] .RB [ \-h ] .RB [ \-i ] .RB [ \-m\ \&mode ] -.br -.in +5n .RB [ \-n ] .RB [ \-p ] .RB [ \-q ] .RB [ \-u ] .RB [ \-v ] +.br .RB [ calc_cmd\ \&.\|.\|. ] .in -5n .SH DESCRIPTION @@ -122,6 +124,34 @@ It's nearly ten past six. This flag disables the reporting of missing calc startup scripts ($CALCRC). +.TP +.BR -D " calc_debug[:lib_debug:[user_debug]]" +Force the initial value of config("calc_debug"), +config("lib_debug") and config("user_debug"). +.sp 1 +The : separated strings are interpreted as signed 32 bit values. +After an optional leading sign a leading zero indicates octal +conversion, and a leading ``0x'' or ``0X'' hexadecimal +conversion. Otherwise, decimal conversion is assumed. +.sp 1 +By default, +.I calc_debug +is 0, +.I lib_debug +is 3 and +.I lib_debug +is 0. +.sp 1 +For more information use the following +.B calc +command: +.sp 1 +.in +5n +.nf +help config +.fi +.in -5n + .TP .B \-e Ignore any environment variables on startup. @@ -182,7 +212,8 @@ This flag sets the permission mode of It controls the ability for .B calc to open files and execute programs. -Mode may be a number from 0 to 7. +.I Mode +may be a number from 0 to 7. .sp 1 The mode value is interpreted in a way similar to that of the @@ -205,8 +236,8 @@ octal mode: If one wished to run .B calc from a privileged user, one might want to use -.B \-m -0 in an effort to make +.BR \-m " 0" +in an effort to make .B calc somewhat more secure. .sp 1 @@ -214,8 +245,8 @@ Mode bits for reading and writing apply only on an open. Files already open are not effected. Thus if one wanted to use the -.B \-m -0 in an effort to make +.BR \-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 diff --git a/config.c b/config.c index ce2178c..77a0751 100644 --- a/config.c +++ b/config.c @@ -94,8 +94,8 @@ CONFIG oldstd = { /* backward compatible standard configuration */ FALSE, /* skip duplicate block output lines */ BLK_BASE_HEX, /* block octet print base */ BLK_FMT_HD_STYLE, /* block output format */ - 3, /* calc library debug level */ 0, /* internal calc debug level */ + 3, /* calc library debug level */ 0, /* user defined debug level */ TRUE /* print Quit or abort executed messages */ }; @@ -130,8 +130,8 @@ CONFIG newstd = { /* new non-backward compatible configuration */ FALSE, /* skip duplicate block output lines */ BLK_BASE_HEX, /* block octet print base */ BLK_FMT_HD_STYLE, /* block output format */ - 3, /* calc library debug level */ 0, /* internal calc debug level */ + 3, /* calc library debug level */ 0, /* user defined debug level */ TRUE /* print Quit or abort executed messages */ }; @@ -809,20 +809,6 @@ setconfig(int type, VALUE *vp) conf->blkfmt = temp; break; - case CONFIG_LIB_DEBUG: - if (vp->v_type != V_NUM) { - math_error("Non numeric for lib_debug"); - /*NOTREACHED*/ - } - q = vp->v_num; - temp = qtoi(q); - if (qisfrac(q) || !zistiny(q->num)) { - math_error("Illegal lib_debug parameter value"); - /*NOTREACHED*/ - } - conf->lib_debug = temp; - break; - case CONFIG_CALC_DEBUG: if (vp->v_type != V_NUM) { math_error("Non numeric for calc_debug"); @@ -837,6 +823,20 @@ setconfig(int type, VALUE *vp) conf->calc_debug = temp; break; + case CONFIG_LIB_DEBUG: + if (vp->v_type != V_NUM) { + math_error("Non numeric for lib_debug"); + /*NOTREACHED*/ + } + q = vp->v_num; + temp = qtoi(q); + if (qisfrac(q) || !zistiny(q->num)) { + math_error("Illegal lib_debug parameter value"); + /*NOTREACHED*/ + } + conf->lib_debug = temp; + break; + case CONFIG_USER_DEBUG: if (vp->v_type != V_NUM) { math_error("Non numeric for user_debug"); @@ -1125,14 +1125,14 @@ config_value(CONFIG *cfg, int type, VALUE *vp) i = cfg->blkfmt; break; - case CONFIG_LIB_DEBUG: - i = cfg->lib_debug; - break; - case CONFIG_CALC_DEBUG: i = cfg->calc_debug; break; + case CONFIG_LIB_DEBUG: + i = cfg->lib_debug; + break; + case CONFIG_USER_DEBUG: i = cfg->user_debug; break; @@ -1214,8 +1214,8 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2) cfg1->blkverbose != cfg2->blkverbose || cfg1->blkbase != cfg2->blkbase || cfg1->blkfmt != cfg2->blkfmt || - cfg1->lib_debug != cfg2->lib_debug || cfg1->calc_debug != cfg2->calc_debug || + cfg1->lib_debug != cfg2->lib_debug || cfg1->user_debug != cfg2->user_debug || cfg1->verbose_quit != cfg2->verbose_quit; } diff --git a/config.h b/config.h index 73442d0..6ff14fa 100644 --- a/config.h +++ b/config.h @@ -135,9 +135,9 @@ struct config { BOOL blkverbose; /* TRUE => print all lines if a block */ int blkbase; /* block output base */ int blkfmt; /* block output style */ - int lib_debug; /* library debug, see LIB_DEBUG_XXX below */ - int calc_debug; /* internal debug, see CALC_DEBUG_XXX below */ - int user_debug; /* user defined debug value: 0 default */ + long calc_debug; /* internal debug, see CALC_DEBUG_XXX below */ + long lib_debug; /* library debug, see LIB_DEBUG_XXX below */ + long user_debug; /* user defined debug value: 0 default */ BOOL verbose_quit; /* TRUE => print Quit or abort executed msg */ }; typedef struct config CONFIG; @@ -158,7 +158,9 @@ typedef struct config CONFIG; #define CALCDBG_FUNC_QUIT (0x00000002) /* active functions when quit */ #define CALCDBG_HASH_STATE (0x00000004) /* hash state details */ #define CALCDBG_BLOCK (0x00000008) /* block debug */ -#define CALCDBG_MASK (0x0000000f) +#define CALCDBG_TTY (0x00000010) /* report TTY state changes */ +#define CALCDBG_RUNSTATE (0x00000020) /* report run_state changes */ +#define CALCDBG_MASK (0x0000003f) /* @@ -167,6 +169,9 @@ typedef struct config CONFIG; extern CONFIG *conf; /* current configuration */ extern CONFIG oldstd; /* backward compatible standard configuration */ extern CONFIG newstd; /* new non-backward compatible configuration */ +extern char *calc_debug; /* !=NULL => value of config("calc_debug") */ +extern char *lib_debug; /* !=NULL => value of config("lib_debug") */ +extern char *user_debug; /* !=NULL => value of config("user_debug") */ /* diff --git a/help/config b/help/config index eda40ae..f692876 100644 --- a/help/config +++ b/help/config @@ -40,8 +40,8 @@ Configuration parameters "blkverbose" TRUE=>print all lines, FALSE=>skip duplicates "blkbase" block output base "blkfmt" block output format - "lib_debug" controls library script debug information "calc_debug" controls internal calc debug information + "lib_debug" controls library script debug information "user_debug" for user defined debug information "verbose_quit" TRUE=>print message on empty quit or abort @@ -317,29 +317,6 @@ Configuration parameters The default "blkfmt" is "hd". - The "lib_debug" parameter is intended for controlling the possible - display of special information relating to functions, objects, and - other structures created by instructions in calc scripts. - Zero value of config("lib_debug") means that no such information - is displayed. For other values, the non-zero bits which currently - have meanings are as follows: - - n Meaning of bit n of config("lib_debug") - - 0 When a function is defined, redefined or undefined at - interactive level, a message saying what has been done - is displayed. - - 1 When a function is defined, redefined or undefined during - the reading of a file, a message saying what has been done - is displayed. - - The value for config("lib_debug") in both oldstd and newstd is 3, - but if calc is invoked with the -d flag, its initial value is zero. - Thus, if calc is started without the -d flag, until config("lib_debug") - is changed, a message will be output when a function is defined - either interactively or during the reading of a file. - The "calc_debug" is intended for controlling internal calc routines that test its operation, or collect or display information that might be useful for debug purposes. Much of the output from these @@ -364,7 +341,42 @@ Configuration parameters block is not NULL, and that its "length" is not negative. A failure will result in a runtime error. - Bits >= 4 are reserved for future use and should not be used at this time. + 4 Report on changes to the state of stdin as well as changes + to internal variables that control the setting and restoring + of stdin. + + 5 Report on changes to the run state of calc. + + Bits >= 6 are reserved for future use and should not be used at this time. + + By default, "calc_debug" is 0. The initial value may be overridden + by the -D command line option. + + The "lib_debug" parameter is intended for controlling the possible + display of special information relating to functions, objects, and + other structures created by instructions in calc scripts. + Zero value of config("lib_debug") means that no such information + is displayed. For other values, the non-zero bits which currently + have meanings are as follows: + + n Meaning of bit n of config("lib_debug") + + 0 When a function is defined, redefined or undefined at + interactive level, a message saying what has been done + is displayed. + + 1 When a function is defined, redefined or undefined during + the reading of a file, a message saying what has been done + is displayed. + + The value for config("lib_debug") in both oldstd and newstd is 3, + but if calc is invoked with the -d flag, its initial value is zero. + Thus, if calc is started without the -d flag, until config("lib_debug") + is changed, a message will be output when a function is defined + either interactively or during the reading of a file. + + By default, "lib_debug" is 3. The -d flag changes this default to 0. + The initial value may be overridden by the -D command line option. The "user_debug" is provided for use by users. Calc ignores this value other than to set it to 0 by default (for both "oldstd" and "newstd"). @@ -376,6 +388,9 @@ Configuration parameters slower operation or more memory usage, and a particular value (like -1 or 0) corresponding to "no tests". + By default, "user_debug" is 0. The initial value may be overridden + by the -D command line option. + The "verbose_quit" controls the print of the message: Quit or abort executed diff --git a/help/usage b/help/usage index 9e1af58..e73117f 100644 --- a/help/usage +++ b/help/usage @@ -2,8 +2,8 @@ Calc command line Calc has the following command line: - calc [-c] [-C] [-d] [-e] [-h] [-i] [-m mode] - [-n] [-p] [-q] [-u] [-v] [calc_cmd ...] + calc [-c] [-C] [-d] [-D calc_debug[:lib_debug:[user_debug]]] + [-e] [-h] [-i] [-m mode] [-n] [-p] [-q] [-u] [-v] [calc_cmd ...] -c Continue reading command lines even after an execution error has caused the abandonment of a line. @@ -55,6 +55,22 @@ Calc command line This flag disables the reporting of missing calc startup scripts ($CALCRC). + -D calc_debug[:lib_debug:[user_debug]] + + Force the initial value of config("calc_debug"), + config("lib_debug") and config("user_debug"). + + The : separated strings are interpreted as signed 32 bit values. + After an optional leading sign a leading zero indicates octal + conversion, and a leading ``0x'' or ``0X'' hexadecimal + conversion. Otherwise, decimal conversion is assumed. + + By default, calc_debug is 0, lib_debug is 3 and lib_debug is 0. + + For more information use the following calc command: + + help config + -e Ignore any environment variables on startup. The getenv() builtin will still return values, however. diff --git a/hist.c b/hist.c index b23e9f7..ce09c53 100644 --- a/hist.c +++ b/hist.c @@ -283,11 +283,16 @@ hist_init(char *filename) { TTYSTRUCT newtty; - if (inited) + if (inited) { + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: inited already set in hist_init\n"); return HIST_INITED; + } inited = 1; canedit = 0; + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: Set inited, cleared canedit in hist_init\n"); /* * open the bindings file @@ -309,20 +314,31 @@ hist_init(char *filename) closeinput(); #ifdef USE_SGTTY - if (ioctl(STDIN, TIOCGETP, &oldtty) < 0) + if (ioctl(STDIN, TIOCGETP, &oldtty) < 0) { + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: Cannot TIOCGETP stdin in hist_init\n"); return HIST_NOTTY; + } newtty = oldtty; newtty.sg_flags &= ~ECHO; newtty.sg_flags |= CBREAK; - if (ioctl(STDIN, TIOCSETP, &newtty) < 0) + if (ioctl(STDIN, TIOCSETP, &newtty) < 0) { + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: Cannot TIOCSETP stdin in hist_init\n"); return HIST_NOTTY; + } + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: stty -ECHO +CBREAK in hist_init\n"); #endif #ifdef USE_TERMIO - if (ioctl(STDIN, TCGETA, &oldtty) < 0) + if (ioctl(STDIN, TCGETA, &oldtty) < 0) { + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: Cannot TCGETA stdin in hist_init\n"); return HIST_NOTTY; + } newtty = oldtty; newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK); @@ -331,13 +347,22 @@ hist_init(char *filename) newtty.c_cc[VMIN] = 1; newtty.c_cc[VTIME] = 0; - if (ioctl(STDIN, TCSETAW, &newtty) < 0) + if (ioctl(STDIN, TCSETAW, &newtty) < 0) { + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: Cannot TCSETAW stdin in hist_init\n"); return HIST_NOTTY; + } + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: stty -ECHO -ECHOE -ECHOK -ICANON +ISTRIP " + "VMIN=1 VTIME=0 in hist_init\n"); #endif #ifdef USE_TERMIOS - if (tcgetattr(STDIN, &oldtty) < 0) + if (tcgetattr(STDIN, &oldtty) < 0) { + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: Cannot tcgetattr stdin in hist_init\n"); return HIST_NOTTY; + } newtty = oldtty; newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK); @@ -346,11 +371,19 @@ hist_init(char *filename) newtty.c_cc[VMIN] = 1; newtty.c_cc[VTIME] = 0; - if (tcsetattr(STDIN, TCSANOW, &newtty) < 0) + if (tcsetattr(STDIN, TCSANOW, &newtty) < 0) { + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: Cannot tcsetattr stdin in hist_init\n"); return HIST_NOTTY; + } + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: stty -ECHO -ECHOE -ECHOK -ICANON +ISTRIP " + "VMIN=1 VTIME=0 in hist_init\n"); #endif canedit = 1; + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: Set canedit in hist_init\n"); return HIST_SUCCESS; } @@ -363,20 +396,36 @@ void hist_term(void) { if (!inited || !canedit) { + if (conf->calc_debug & CALCDBG_TTY) { + if (!inited) + printf("DEBUG: inited already cleared " + "in hist_term\n"); + if (!canedit) + printf("DEBUG: canedit already cleared " + "in hist_term\n"); + } inited = 0; + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: Cleared inited in hist_term\n"); return; } #ifdef USE_SGTTY (void) ioctl(STDIN, TIOCSETP, &oldtty); + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: TIOCSETP restored stdin in hist_term\n"); #endif #ifdef USE_TERMIO (void) ioctl(STDIN, TCSETAW, &oldtty); + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: TCSETAW restored stdin in hist_term\n"); #endif #ifdef USE_TERMIOS (void) tcsetattr(STDIN, TCSANOW, &oldtty); + if (conf->calc_debug & CALCDBG_TTY) + printf("DEBUG: TCSANOW restored stdin in hist_term\n"); #endif } diff --git a/lib/regress.cal b/lib/regress.cal index 90cc137..a71d44c 100644 --- a/lib/regress.cal +++ b/lib/regress.cal @@ -292,7 +292,7 @@ define test_arithmetic() vrfy(8/4==2, '404: 8 / 4 == 2'); vrfy(2^3==8, '405: 2 ^ 3 == 8'); vrfy(9-4-2==3, '406: 9-4-2 == 3'); - vrfy(9-4+2==7, '407: 9-4+2 == 6'); + vrfy(9-4+2==7, '407: 9-4+2 == 7'); vrfy(-5+2==-3, '408: -5+2 == -3'); vrfy(2*3+1==7, '409: 2*3+1 == 7'); vrfy(1+2*3==7, '410: 1+2*3 == 7'); diff --git a/lib_calc.c b/lib_calc.c index 9dc4c7c..c008250 100644 --- a/lib_calc.c +++ b/lib_calc.c @@ -63,9 +63,9 @@ 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 */ -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 */ +run run_state = RUN_UNKNOWN; /* calc startup and run state */ /* @@ -86,6 +86,7 @@ int d_flag = FALSE; /* TRUE => disable heading, lib_debug == 0 */ int c_flag = FALSE; /* TRUE => continue on error if permitted */ int i_flag = FALSE; /* TRUE => go interactive if permitted */ + /* * global values */ @@ -106,6 +107,10 @@ int errmax = ERRMAX; /* if >= 0, maximum value for errcount */ NUMBER *epsilon_default; /* default allowed error for float calcs */ +char *calc_debug = NULL; /* !=NULL => value of config("calc_debug") */ +char *lib_debug = NULL; /* !=NULL => value of config("lib_debug") */ +char *user_debug = NULL; /* !=NULL => value of config("user_debug") */ + /* * initialization functions @@ -173,6 +178,19 @@ libcalc_call_me_first(void) conf->tab_ok = 0; } + /* + * -D flags can change calc_debug, lib_debug of user_debug + */ + if (calc_debug) { + conf->calc_debug = strtol(calc_debug, NULL, 0); + } + if (lib_debug) { + conf->lib_debug = strtol(lib_debug, NULL, 0); + } + if (user_debug) { + conf->user_debug = strtol(user_debug, NULL, 0); + } + /* * initialize */ @@ -181,6 +199,11 @@ libcalc_call_me_first(void) /* * ready to rock & roll .. */ + if (conf->calc_debug & CALCDBG_RUNSTATE) { + printf("DEBUG: run_state from %s to %s\n", + run_state_name(run_state), + run_state_name(RUN_BEGIN)); + } run_state = RUN_BEGIN; init_done = 1; return; @@ -371,3 +394,33 @@ libcalc_call_me_last(void) init_done = 0; return; } + + +/* + * run_state_name - return a constant string given a run_state + */ +char * +run_state_name(run state) +{ + switch (state) { + case RUN_UNKNOWN: + return "RUN_UNKNOWN"; + case RUN_BEGIN: + return "RUN_BEGIN"; + case RUN_RCFILES: + return "RUN_RCFILES"; + case RUN_PRE_CMD_ARGS: + return "RUN_PRE_CMD_ARGS"; + case RUN_CMD_ARGS: + return "RUN_CMD_ARGS"; + case RUN_PRE_TOP_LEVEL: + return "RUN_PRE_TOP_LEVEL"; + case RUN_TOP_LEVEL: + return "RUN_TOP_LEVEL"; + case RUN_EXIT: + return "RUN_EXIT"; + case RUN_EXIT_WITH_ERROR: + return "RUN_EXIT_WITH_ERROR"; + } + return "RUN_invalid"; +} diff --git a/quickhash.c b/quickhash.c index b12e693..a113c8e 100644 --- a/quickhash.c +++ b/quickhash.c @@ -404,8 +404,8 @@ config_hash(CONFIG *cfg, QCKHASH val) value = (((value>>5) | (value<<27)) ^ (USB32)cfg->blkverbose); value = (((value>>5) | (value<<27)) ^ (USB32)cfg->blkbase); value = (((value>>5) | (value<<27)) ^ (USB32)cfg->blkfmt); - value = (((value>>5) | (value<<27)) ^ (USB32)cfg->lib_debug); value = (((value>>5) | (value<<27)) ^ (USB32)cfg->calc_debug); + value = (((value>>5) | (value<<27)) ^ (USB32)cfg->lib_debug); value = (((value>>5) | (value<<27)) ^ (USB32)cfg->user_debug); value = (((value>>5) | (value<<27)) ^ (USB32)cfg->verbose_quit); diff --git a/version.c b/version.c index bcbe718..7790f17 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 "9.1.1" /* test number or empty string if no patch */ +#define MINOR_PATCH "9.2" /* test number or empty string if no patch */ /* * calc version constants