Release calc version 2.11.0t9.2

This commit is contained in:
Landon Curt Noll
1999-11-02 03:59:23 -08:00
parent 1b42111665
commit 75e742c716
14 changed files with 352 additions and 84 deletions

4
BUGS
View File

@@ -96,8 +96,8 @@ Known bugs:
the terminal in a 'bad' state, as if stty -icanon -echo -echoe the terminal in a 'bad' state, as if stty -icanon -echo -echoe
had been executed. had been executed.
* Dec Alpha Linux compiling with gcc-2.95.1 and -O2 fails the * Dec Alpha Linux compiling with gcc-2.95.1 (or gcc-2.95.2) and
regression test with: -O2 fails the regression test with:
make -s check make -s check
000: Beginning regression tests 000: Beginning regression tests

34
CHANGES
View File

@@ -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 The eval(str) builtin will return an error-value rather than cause
an execution error str has a scan-error. 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 When prompt() occurs while reading a file, it will take input from
the terminal rather than taking it from a file. For example, the terminal rather than taking it from a file. For example:
this script, when read, now works:
/* This demonstrates the use of prompt() and some other things */ /* This demonstrates the use of prompt() and some other things */
config("verbose_quit", 0); 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"; 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: 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 * cat comment.cal | calc
* calc < comment.cal * calc < comment.cal
*/ */
print "Hello"; 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: Following is the change from calc version 2.11.0t8 to 2.11.0t8.9:

88
calc.c
View File

@@ -40,6 +40,7 @@
* static definitions and functions * static definitions and functions
*/ */
static char *usage = "usage: %s [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]\n" 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"; "\t[-n] [-p] [-q] [-u] [-v] [[--] calc_cmd ...]\n";
static void intint(int arg); /* interrupt routine */ static void intint(int arg); /* interrupt routine */
@@ -55,13 +56,14 @@ main(int argc, char **argv)
extern char *optarg; /* option argument */ extern char *optarg; /* option argument */
extern int optind; /* option index */ extern int optind; /* option index */
int c; /* option */ int c; /* option */
char *p;
long i; long i;
/* /*
* parse args * parse args
*/ */
program = argv[0]; program = argv[0];
while ((c = getopt(argc, argv, "Cehim:npquvcd")) != -1) { while ((c = getopt(argc, argv, "Cehim:npquvcdD:")) != -1) {
switch (c) { switch (c) {
case 'C': case 'C':
#if defined(CUSTOM) #if defined(CUSTOM)
@@ -126,6 +128,26 @@ main(int argc, char **argv)
*/ */
printf("%s (version %s)\n", CALC_TITLE, version()); printf("%s (version %s)\n", CALC_TITLE, version());
exit(0); 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: default:
/* /*
* we are too early in processing to call * we are too early in processing to call
@@ -185,6 +207,8 @@ main(int argc, char **argv)
*/ */
libcalc_call_me_first(); libcalc_call_me_first();
stdin_tty = isatty(0); /* assume stdin is on fd 0 */ 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) { if (want_defhelp) {
givehelp(DEFAULTCALCHELP); givehelp(DEFAULTCALCHELP);
libcalc_call_me_last(); libcalc_call_me_last();
@@ -239,9 +263,17 @@ main(int argc, char **argv)
*/ */
if (run_state == RUN_BEGIN) { if (run_state == RUN_BEGIN) {
if (!q_flag && allow_read) { 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; run_state = RUN_RCFILES;
runrcfiles(); 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; run_state = RUN_PRE_CMD_ARGS;
} }
@@ -252,25 +284,46 @@ main(int argc, char **argv)
if (inputlevel() == 0) { if (inputlevel() == 0) {
closeinput(); closeinput();
runrcfiles(); 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; run_state = RUN_PRE_CMD_ARGS;
} else { } else {
closeinput(); closeinput();
} }
} else { } 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; 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; run_state = RUN_PRE_CMD_ARGS;
}
} }
} }
if (run_state == RUN_PRE_CMD_ARGS) { if (run_state == RUN_PRE_CMD_ARGS) {
if (havecommands) { 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; run_state = RUN_CMD_ARGS;
(void) openstring(cmdbuf, (long) strlen(cmdbuf)); (void) openstring(cmdbuf, (long) strlen(cmdbuf));
getcommands(FALSE); getcommands(FALSE);
closeinput(); 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; run_state = RUN_PRE_TOP_LEVEL;
} }
@@ -279,19 +332,36 @@ main(int argc, char **argv)
if ((c_flag && !stoponerror) || stoponerror < 0) { if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE); getcommands(FALSE);
if (inputlevel() == 0) 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; run_state = RUN_PRE_TOP_LEVEL;
closeinput(); closeinput();
} else { } else {
closeinput(); 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; 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; run_state = RUN_PRE_TOP_LEVEL;
}
} }
} }
if (run_state == RUN_PRE_TOP_LEVEL) { if (run_state == RUN_PRE_TOP_LEVEL) {
if (stdin_tty && ((havecommands && !i_flag) || p_flag)) { 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; run_state = RUN_EXIT;
} else { } else {
if (stdin_tty) { if (stdin_tty) {
@@ -300,6 +370,10 @@ main(int argc, char **argv)
resetinput(); resetinput();
openterminal(); 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; run_state = RUN_TOP_LEVEL;
getcommands(TRUE); getcommands(TRUE);
} }
@@ -315,6 +389,10 @@ main(int argc, char **argv)
reinitialize(); reinitialize();
getcommands(TRUE); getcommands(TRUE);
} 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_EXIT_WITH_ERROR));
run_state = RUN_EXIT_WITH_ERROR; run_state = RUN_EXIT_WITH_ERROR;
} }
} }

1
calc.h
View File

@@ -208,6 +208,7 @@ typedef enum {
RUN_EXIT_WITH_ERROR = 7 /* exit with error */ RUN_EXIT_WITH_ERROR = 7 /* exit with error */
} run; } run;
extern run run_state; extern run run_state;
extern char *run_state_name(run state);
/* /*
* calc version information * calc version information

View File

@@ -15,17 +15,19 @@ calc \- arbitrary precision calculator
.RB [ \-c ] .RB [ \-c ]
.RB [ \-C ] .RB [ \-C ]
.RB [ \-d ] .RB [ \-d ]
.RB [ -D\ \&calc_debug[:lib_debug:[user_debug]] ]
.br
.in +5n
.RB [ \-e ] .RB [ \-e ]
.RB [ \-h ] .RB [ \-h ]
.RB [ \-i ] .RB [ \-i ]
.RB [ \-m\ \&mode ] .RB [ \-m\ \&mode ]
.br
.in +5n
.RB [ \-n ] .RB [ \-n ]
.RB [ \-p ] .RB [ \-p ]
.RB [ \-q ] .RB [ \-q ]
.RB [ \-u ] .RB [ \-u ]
.RB [ \-v ] .RB [ \-v ]
.br
.RB [ calc_cmd\ \&.\|.\|. ] .RB [ calc_cmd\ \&.\|.\|. ]
.in -5n .in -5n
.SH DESCRIPTION .SH DESCRIPTION
@@ -122,6 +124,34 @@ It's nearly ten past six.
This flag disables the reporting of missing calc This flag disables the reporting of missing calc
startup scripts ($CALCRC). 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 .TP
.B \-e .B \-e
Ignore any environment variables on startup. Ignore any environment variables on startup.
@@ -182,7 +212,8 @@ This flag sets the permission mode of
It controls the ability for It controls the ability for
.B calc .B calc
to open files and execute programs. 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 .sp 1
The mode value is interpreted in a way similar to that The mode value is interpreted in a way similar to that
of the of the
@@ -205,8 +236,8 @@ octal mode:
If one wished to run If one wished to run
.B calc .B calc
from a privileged user, one might want to use from a privileged user, one might want to use
.B \-m .BR \-m " 0"
0 in an effort to make in an effort to make
.B calc .B calc
somewhat more secure. somewhat more secure.
.sp 1 .sp 1
@@ -214,8 +245,8 @@ Mode bits for reading and writing apply only on an
open. open.
Files already open are not effected. Files already open are not effected.
Thus if one wanted to use the Thus if one wanted to use the
.B \-m .BR \-m " 0"
0 in an effort to make in an effort to make
.B calc .B calc
somewhat more secure, but still wanted to read and write a specific somewhat more secure, but still wanted to read and write a specific
file, one might want to do in file, one might want to do in

View File

@@ -94,8 +94,8 @@ CONFIG oldstd = { /* backward compatible standard configuration */
FALSE, /* skip duplicate block output lines */ FALSE, /* skip duplicate block output lines */
BLK_BASE_HEX, /* block octet print base */ BLK_BASE_HEX, /* block octet print base */
BLK_FMT_HD_STYLE, /* block output format */ BLK_FMT_HD_STYLE, /* block output format */
3, /* calc library debug level */
0, /* internal calc debug level */ 0, /* internal calc debug level */
3, /* calc library debug level */
0, /* user defined debug level */ 0, /* user defined debug level */
TRUE /* print Quit or abort executed messages */ TRUE /* print Quit or abort executed messages */
}; };
@@ -130,8 +130,8 @@ CONFIG newstd = { /* new non-backward compatible configuration */
FALSE, /* skip duplicate block output lines */ FALSE, /* skip duplicate block output lines */
BLK_BASE_HEX, /* block octet print base */ BLK_BASE_HEX, /* block octet print base */
BLK_FMT_HD_STYLE, /* block output format */ BLK_FMT_HD_STYLE, /* block output format */
3, /* calc library debug level */
0, /* internal calc debug level */ 0, /* internal calc debug level */
3, /* calc library debug level */
0, /* user defined debug level */ 0, /* user defined debug level */
TRUE /* print Quit or abort executed messages */ TRUE /* print Quit or abort executed messages */
}; };
@@ -809,20 +809,6 @@ setconfig(int type, VALUE *vp)
conf->blkfmt = temp; conf->blkfmt = temp;
break; 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: case CONFIG_CALC_DEBUG:
if (vp->v_type != V_NUM) { if (vp->v_type != V_NUM) {
math_error("Non numeric for calc_debug"); math_error("Non numeric for calc_debug");
@@ -837,6 +823,20 @@ setconfig(int type, VALUE *vp)
conf->calc_debug = temp; conf->calc_debug = temp;
break; 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: case CONFIG_USER_DEBUG:
if (vp->v_type != V_NUM) { if (vp->v_type != V_NUM) {
math_error("Non numeric for user_debug"); math_error("Non numeric for user_debug");
@@ -1125,14 +1125,14 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
i = cfg->blkfmt; i = cfg->blkfmt;
break; break;
case CONFIG_LIB_DEBUG:
i = cfg->lib_debug;
break;
case CONFIG_CALC_DEBUG: case CONFIG_CALC_DEBUG:
i = cfg->calc_debug; i = cfg->calc_debug;
break; break;
case CONFIG_LIB_DEBUG:
i = cfg->lib_debug;
break;
case CONFIG_USER_DEBUG: case CONFIG_USER_DEBUG:
i = cfg->user_debug; i = cfg->user_debug;
break; break;
@@ -1214,8 +1214,8 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
cfg1->blkverbose != cfg2->blkverbose || cfg1->blkverbose != cfg2->blkverbose ||
cfg1->blkbase != cfg2->blkbase || cfg1->blkbase != cfg2->blkbase ||
cfg1->blkfmt != cfg2->blkfmt || cfg1->blkfmt != cfg2->blkfmt ||
cfg1->lib_debug != cfg2->lib_debug ||
cfg1->calc_debug != cfg2->calc_debug || cfg1->calc_debug != cfg2->calc_debug ||
cfg1->lib_debug != cfg2->lib_debug ||
cfg1->user_debug != cfg2->user_debug || cfg1->user_debug != cfg2->user_debug ||
cfg1->verbose_quit != cfg2->verbose_quit; cfg1->verbose_quit != cfg2->verbose_quit;
} }

View File

@@ -135,9 +135,9 @@ struct config {
BOOL blkverbose; /* TRUE => print all lines if a block */ BOOL blkverbose; /* TRUE => print all lines if a block */
int blkbase; /* block output base */ int blkbase; /* block output base */
int blkfmt; /* block output style */ int blkfmt; /* block output style */
int lib_debug; /* library debug, see LIB_DEBUG_XXX below */ long calc_debug; /* internal debug, see CALC_DEBUG_XXX below */
int calc_debug; /* internal debug, see CALC_DEBUG_XXX below */ long lib_debug; /* library debug, see LIB_DEBUG_XXX below */
int user_debug; /* user defined debug value: 0 default */ long user_debug; /* user defined debug value: 0 default */
BOOL verbose_quit; /* TRUE => print Quit or abort executed msg */ BOOL verbose_quit; /* TRUE => print Quit or abort executed msg */
}; };
typedef struct config CONFIG; typedef struct config CONFIG;
@@ -158,7 +158,9 @@ typedef struct config CONFIG;
#define CALCDBG_FUNC_QUIT (0x00000002) /* active functions when quit */ #define CALCDBG_FUNC_QUIT (0x00000002) /* active functions when quit */
#define CALCDBG_HASH_STATE (0x00000004) /* hash state details */ #define CALCDBG_HASH_STATE (0x00000004) /* hash state details */
#define CALCDBG_BLOCK (0x00000008) /* block debug */ #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 *conf; /* current configuration */
extern CONFIG oldstd; /* backward compatible standard configuration */ extern CONFIG oldstd; /* backward compatible standard configuration */
extern CONFIG newstd; /* new non-backward compatible 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") */
/* /*

View File

@@ -40,8 +40,8 @@ Configuration parameters
"blkverbose" TRUE=>print all lines, FALSE=>skip duplicates "blkverbose" TRUE=>print all lines, FALSE=>skip duplicates
"blkbase" block output base "blkbase" block output base
"blkfmt" block output format "blkfmt" block output format
"lib_debug" controls library script debug information
"calc_debug" controls internal calc debug information "calc_debug" controls internal calc debug information
"lib_debug" controls library script debug information
"user_debug" for user defined debug information "user_debug" for user defined debug information
"verbose_quit" TRUE=>print message on empty quit or abort "verbose_quit" TRUE=>print message on empty quit or abort
@@ -317,29 +317,6 @@ Configuration parameters
The default "blkfmt" is "hd". 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 The "calc_debug" is intended for controlling internal calc routines
that test its operation, or collect or display information that that test its operation, or collect or display information that
might be useful for debug purposes. Much of the output from these 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. block is not NULL, and that its "length" is not negative.
A failure will result in a runtime error. 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 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"). 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 slower operation or more memory usage, and a particular value (like
-1 or 0) corresponding to "no tests". -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: The "verbose_quit" controls the print of the message:
Quit or abort executed Quit or abort executed

View File

@@ -2,8 +2,8 @@ Calc command line
Calc has the following command line: Calc has the following command line:
calc [-c] [-C] [-d] [-e] [-h] [-i] [-m mode] calc [-c] [-C] [-d] [-D calc_debug[:lib_debug:[user_debug]]]
[-n] [-p] [-q] [-u] [-v] [calc_cmd ...] [-e] [-h] [-i] [-m mode] [-n] [-p] [-q] [-u] [-v] [calc_cmd ...]
-c Continue reading command lines even after an execution -c Continue reading command lines even after an execution
error has caused the abandonment of a line. error has caused the abandonment of a line.
@@ -55,6 +55,22 @@ Calc command line
This flag disables the reporting of missing calc This flag disables the reporting of missing calc
startup scripts ($CALCRC). 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 -e Ignore any environment variables on startup. The
getenv() builtin will still return values, however. getenv() builtin will still return values, however.

63
hist.c
View File

@@ -283,11 +283,16 @@ hist_init(char *filename)
{ {
TTYSTRUCT newtty; TTYSTRUCT newtty;
if (inited) if (inited) {
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: inited already set in hist_init\n");
return HIST_INITED; return HIST_INITED;
}
inited = 1; inited = 1;
canedit = 0; canedit = 0;
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Set inited, cleared canedit in hist_init\n");
/* /*
* open the bindings file * open the bindings file
@@ -309,20 +314,31 @@ hist_init(char *filename)
closeinput(); closeinput();
#ifdef USE_SGTTY #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; return HIST_NOTTY;
}
newtty = oldtty; newtty = oldtty;
newtty.sg_flags &= ~ECHO; newtty.sg_flags &= ~ECHO;
newtty.sg_flags |= CBREAK; 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; return HIST_NOTTY;
}
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: stty -ECHO +CBREAK in hist_init\n");
#endif #endif
#ifdef USE_TERMIO #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; return HIST_NOTTY;
}
newtty = oldtty; newtty = oldtty;
newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK); newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK);
@@ -331,13 +347,22 @@ hist_init(char *filename)
newtty.c_cc[VMIN] = 1; newtty.c_cc[VMIN] = 1;
newtty.c_cc[VTIME] = 0; 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; 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 #endif
#ifdef USE_TERMIOS #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; return HIST_NOTTY;
}
newtty = oldtty; newtty = oldtty;
newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK); newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK);
@@ -346,11 +371,19 @@ hist_init(char *filename)
newtty.c_cc[VMIN] = 1; newtty.c_cc[VMIN] = 1;
newtty.c_cc[VTIME] = 0; 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; 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 #endif
canedit = 1; canedit = 1;
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Set canedit in hist_init\n");
return HIST_SUCCESS; return HIST_SUCCESS;
} }
@@ -363,20 +396,36 @@ void
hist_term(void) hist_term(void)
{ {
if (!inited || !canedit) { 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; inited = 0;
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Cleared inited in hist_term\n");
return; return;
} }
#ifdef USE_SGTTY #ifdef USE_SGTTY
(void) ioctl(STDIN, TIOCSETP, &oldtty); (void) ioctl(STDIN, TIOCSETP, &oldtty);
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: TIOCSETP restored stdin in hist_term\n");
#endif #endif
#ifdef USE_TERMIO #ifdef USE_TERMIO
(void) ioctl(STDIN, TCSETAW, &oldtty); (void) ioctl(STDIN, TCSETAW, &oldtty);
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: TCSETAW restored stdin in hist_term\n");
#endif #endif
#ifdef USE_TERMIOS #ifdef USE_TERMIOS
(void) tcsetattr(STDIN, TCSANOW, &oldtty); (void) tcsetattr(STDIN, TCSANOW, &oldtty);
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: TCSANOW restored stdin in hist_term\n");
#endif #endif
} }

View File

@@ -292,7 +292,7 @@ define test_arithmetic()
vrfy(8/4==2, '404: 8 / 4 == 2'); vrfy(8/4==2, '404: 8 / 4 == 2');
vrfy(2^3==8, '405: 2 ^ 3 == 8'); vrfy(2^3==8, '405: 2 ^ 3 == 8');
vrfy(9-4-2==3, '406: 9-4-2 == 3'); 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(-5+2==-3, '408: -5+2 == -3');
vrfy(2*3+1==7, '409: 2*3+1 == 7'); vrfy(2*3+1==7, '409: 2*3+1 == 7');
vrfy(1+2*3==7, '410: 1+2*3 == 7'); vrfy(1+2*3==7, '410: 1+2*3 == 7');

View File

@@ -63,9 +63,9 @@ int new_std = FALSE; /* TRUE (-n) => use newstd configuration */
int abortlevel; /* current level of aborts */ int abortlevel; /* current level of aborts */
BOOL inputwait; /* TRUE if in a terminal input wait */ BOOL inputwait; /* TRUE if in a terminal input wait */
jmp_buf jmpbuf; /* for errors */ jmp_buf jmpbuf; /* for errors */
run run_state = RUN_UNKNOWN; /* calc startup and run state */
char *program = "calc"; /* our name */ char *program = "calc"; /* our name */
char cmdbuf[MAXCMD+1+1+1]; /* command line expression + "\n\0" + guard */ 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 c_flag = FALSE; /* TRUE => continue on error if permitted */
int i_flag = FALSE; /* TRUE => go interactive if permitted */ int i_flag = FALSE; /* TRUE => go interactive if permitted */
/* /*
* global values * global values
*/ */
@@ -106,6 +107,10 @@ int errmax = ERRMAX; /* if >= 0, maximum value for errcount */
NUMBER *epsilon_default; /* default allowed error for float calcs */ 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 * initialization functions
@@ -173,6 +178,19 @@ libcalc_call_me_first(void)
conf->tab_ok = 0; 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 * initialize
*/ */
@@ -181,6 +199,11 @@ libcalc_call_me_first(void)
/* /*
* ready to rock & roll .. * 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; run_state = RUN_BEGIN;
init_done = 1; init_done = 1;
return; return;
@@ -371,3 +394,33 @@ libcalc_call_me_last(void)
init_done = 0; init_done = 0;
return; 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";
}

View File

@@ -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->blkverbose);
value = (((value>>5) | (value<<27)) ^ (USB32)cfg->blkbase); value = (((value>>5) | (value<<27)) ^ (USB32)cfg->blkbase);
value = (((value>>5) | (value<<27)) ^ (USB32)cfg->blkfmt); 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->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->user_debug);
value = (((value>>5) | (value<<27)) ^ (USB32)cfg->verbose_quit); value = (((value>>5) | (value<<27)) ^ (USB32)cfg->verbose_quit);

View File

@@ -12,7 +12,7 @@
#define MAJOR_VER 2 /* major version */ #define MAJOR_VER 2 /* major version */
#define MINOR_VER 11 /* minor version */ #define MINOR_VER 11 /* minor version */
#define MAJOR_PATCH 0 /* patch level or 0 if no patch */ #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 * calc version constants