Compare commits

...

16 Commits

Author SHA1 Message Date
Landon Curt Noll
1b42111665 Release calc version 2.11.0t9.1.1 2017-05-21 15:38:32 -07:00
Landon Curt Noll
ea6b3904be Release calc version 2.11.0t9.1 2017-05-21 15:38:31 -07:00
Landon Curt Noll
f3fceff1b6 Release calc version 2.11.0t9 2017-05-21 15:38:31 -07:00
Landon Curt Noll
69d4a17187 Release calc version 2.11.0t8.10 2017-05-21 15:38:31 -07:00
Landon Curt Noll
a99a3400e7 Release calc version 2.11.0t8.9.1 2017-05-21 15:38:31 -07:00
Landon Curt Noll
9b6c308b42 Release calc version 2.11.0t8.9 2017-05-21 15:38:31 -07:00
Landon Curt Noll
8927373965 Release calc version 2.11.0t8.8 2017-05-21 15:38:30 -07:00
Landon Curt Noll
478d68fca9 Release calc version 2.11.0t8.7 2017-05-21 15:38:30 -07:00
Landon Curt Noll
e6e2556893 Release calc version 2.11.0t8.6 2017-05-21 15:38:30 -07:00
Landon Curt Noll
a7e363da8b Release calc version 2.11.0t8.5 2017-05-21 15:38:30 -07:00
Landon Curt Noll
8db10967e8 Release calc version 2.11.0t8.4 2017-05-21 15:38:30 -07:00
Landon Curt Noll
49be672338 Release calc version 2.11.0t8.3 2017-05-21 15:38:30 -07:00
Landon Curt Noll
a7d401cd65 Release calc version 2.11.0t8.2 2017-05-21 15:38:29 -07:00
Landon Curt Noll
5cc680fe42 Release calc version 2.11.0t8.1 2017-05-21 15:38:29 -07:00
Landon Curt Noll
2c72ea9339 Release calc version 2.11.0t8 2017-05-21 15:38:29 -07:00
Landon Curt Noll
0ffc341b10 Release calc version 2.11.0t7.5 2017-05-21 15:38:29 -07:00
127 changed files with 2867 additions and 1158 deletions

65
BUGS
View File

@@ -20,11 +20,11 @@ configuration, try backing them out and see if things get better.
To be sure that your version of calc is up to date, check out:
http://reality.sgi.com/chongo/calc/calc-download.html
http://reality.sgi.com/chongo/tech/comp/calc/calc-download.html
The calc web site is located at:
http://reality.sgi.com/chongo/calc
http://reality.sgi.com/chongo/tech/comp/calc
=-=
@@ -46,7 +46,7 @@ When you send your report, please include the following information:
* the type of compiler you were using
* any compiler warnings or erros that you saw
* any compiler warnings or errors that you saw
* cd to the calc source directory, and type:
@@ -66,14 +66,57 @@ importantly, fixes (in the form of a context diff patch) to:
=-=
Known problems or mis-features:
Known bugs:
* Many of and SEE ALSO sections of help files
for builtins are either inconsistent or missing information.
* Calc does not support the #! exec method. For example of the
following is placed in an executable file (assume the path to
calc is correct) called /tmp/xyzzy:
* Many of the LIBRARY sections are incorrect now that libcalc.a
contains most of the calc system.
#!/usr/local/bin/calc
/*
* comment
*/
print 2+3;
* 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.
Will result in '"tmp" is undefined' and '"xyzzy" is undefined'
error messages because calc considers $0 as an expression to
evaluate.
* The following file:
/* this is bugdemo.cal */
x = eval(prompt(">>> "));
print x;
when executed as:
calc read bugdemo.cal
will obtain a prompt from the terminal, print the value but leave
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:
make -s check
000: Beginning regression tests
001: Some of these tests may take a while ...
002: Within each section, output should be numbered sequentially
003: parsed global definitions
004: parsed vrfy()
005: parsed prob(str)
006: parsed getglobalvar()
007: parsed test_booleans()
008: parsed test_variables()
make: *** [check] Segmentation fault (core dumped)
Other programs have reported problems when compiling -O2 with
gcc-2.95.1 on the Alpha and Mips.
One work-a-round is to not compile with -O2 (perhaps just -O).
Another work-a-round is not use gcc-2.95.1.
We are sure some more bugs exist. When you find them, please let
us know! See the above for details on how to report and were to
EMail your bug reports and hopefully patches to fix them.

275
CHANGES
View File

@@ -1,4 +1,227 @@
Following is the change from calc version 2.11.0t7 to date:
Following is the change from calc version 2.11.0t8.9.1 to date:
The config("verbose_quit") will control the printing of the message:
Quit or abort executed
when a non-interactive ABORT, QUIT or EXIT is encounted. By default,
config("verbose_quit") is TRUE and the message is printed. If one does:
config("verbose_quit", 0)
the message is disabled.
Added 8400 regression test set and test8400.cal to test the new
quit and config("verbose_quit") functionality.
Fixed the BigEndian BASEB==16 regression bugs by correctly swapping
16 bit HALFs in a 64 bit value (such as a 64 bit file pointer).
Added calclevel() builtin to calculation level at which it is called.
Added help/calclevel and help/inputlevel help files.
Removed regression tests 951 and 5984 so that the regress test will
run in non-interactively / without a TTY such as under Debian's
build daemon.
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 ';'.
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:
/* This demonstrates the use of prompt() and some other things */
config("verbose_quit", 0);
define getnumber() {
local x;
for (;;) {
x = eval(prompt(">>> "));
if (isnum(x))
return x;
print "Not a number! Try again";
}
}
print "This will display the sqrt of each number you enter";
print "Enter quit to stop";
for (;;) {
print sqrt(getnumber());
}
print "Good bye";
Comments entered at inputisterminal level may be spread over several
lines. For example:
/*
* These commands work given the file: comment.cal
*
* cat comment.cal | calc
* calc < comment.cal
*/
print "Hello";
Following is the change from calc version 2.11.0t8 to 2.11.0t8.9:
Moved 'wishlist' enhancements from the help/todo file to a new
help/wishlist file. Ordered, by priority, help/todo items into
Very High, High and Medium priority items.
The BUGS file now has a 'bugs' section as well as a 'mis-features'
section.
Improved how calc internally dealt with reading EOF or '\0' characters.
Calc now allows multiple defines to occur on the same line:
(Thanks goes to Ernest Bowen <ernie@turing.une.edu.au>)
define f8300(x) = x^2; define g8300(x) = 1 - x;
Improved calc's ability to deal with and recover from errors.
Added inputlevel() builtin to return the input processing level.
In an interact mode, inputlevel() returns 0. When directly reading
a calc script, inputlevel() returns 1. When reading a script which
in turn reads another script, inputlevel() returns 2. etc...
If $CALCRC has more than one file as in file1:file2 and an error
occurs in file1, then calc -c will not read file2.
Fixed some of the old EMail addresses found in calc documentation.
Added HAVE_USTAT, HAVE_GETSID, HAVE_GETPGID, HAVE_GETTIME, HAVE_GETPRID
and HAVE_URANDOM symbols to the Makefile. These symbols, along with
have_ustat.c, have_getsid.c, have_getpgid.c, have_gettime.c and
have_getprid.c form: have_ustat.h, have_getsid.h, have_getpgid.h,
have_gettime.h, have_getprid.h and have_urandom.h which in turn
are used by pseudo_seed() in seed.c to determine what types of
system services can be used to form a pseudo-random seed.
Fixed the way calc -c will continue processing $CALCRC when errors
are encountered. Unless -d is also given, calc -c will report
when calc is unable to open a $CALCRC file.
Fixed the lower level make depend rules.
Misc cleanup on the have_*.c support source files.
Misc source file cleanup for things such as } else { style consistency.
Fixed the basis for FNV-1 hashes. Piror to this fix, the hash()
builtin produced FNV hash values that did not match the FNV-1
algorithm as specified in:
http://reality.sgi.com/chongo/tech/comp/fnv/index.html
Removed an unused argument in the function getbody() in codegen.c.
Encountering of EOF in getbody() will cause a scanerror rather then
stop activity. This will now result in a scanerror:
echo 'define f(x) { ' > myfile
calc -i read myfile
A '{' at the start of a command and a later matching '}' surrounding zero
or more statements (and possibly newlines) results in a function body to
be "evaluated". This permits another command to follow on the same
line as the '}' as in:
{display(5)} read something;
and:
{static a = 5} define f(x) = a + x;
String constants can now be concatenated. For exmaple:
s = "curds" ' and ' "whey";
Added FNV hash to the regression test suite.
Added Ernest Bowen's <ernie@turing.une.edu.au> fix for the
FNV regression test of the hash() builtin function.
Added Ernest Bowen's <ernie@turing.une.edu.au> patch to improve
the way config("calc_debug"). Now the lower 4 bits of the
config("calc_debug") parameter have the following meaning:
n Meaning of bit n of config("calc_debug")
0 Outputs shell commands prior to execution.
1 Outputs currently active functions when a quit instruction
is executed.
2 Some details of shs, shs1 and md5 hash states are included
in the output when these are printed.
3 When a function constructs a block value, tests are
made that the result has the properties required for use of
that block, e.g. that the pointer to the start of the
block is not NULL, and that its "length" is not negative.
A failure will result in a runtime error.
Changed the meaning of (config("calc_debug") & 1) from only printing
the shell commands (and pausing) while displaying help files into
the printing of any shell command prior to execution.
Documented the meaning of config("lib_debug"):
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.
Changed the calc lib files to reflect the new config("lib_debug")
bit field meaning. Calc lib files that need to print extra information
should now do something such as:
if (config("lib_debug") & 3) {
print "obj xyz defined";
print "funcA([val1 [, val2]]) defined";
print "funcB(size, mass, ...) defined";
}
Fixed the help/custom_cal, help/new_custom, and help/copy files so
that they contain the correct contents instead of the 'usage' file.
Fixed problem with loss of bindings when calc -i args runs into
an error while processing 'args' and drops into interactive mode
without the terminal bindings being set.
Added patch from Ernest Bowen to extablish the abort command as
well as to clarify the roles of quit and exit. See the help/command
file for details.
Updated to some extend, the help/statement and help/command help
files with new information about SHOW, QUIT, EXIT and ABORT.
Added show sizes to pzasusb8.cal.
Updated calc man page and help/usage file to reflect recent
command line changes.
Fixed a bug, reported by Michael Somos <somos@grail.cba.csuohio.edu>,
which prevented calc -m from being used.
Fixed misc compiler warnings.
Following is the change from calc version 2.11.0t7 to 2.11.0t7.5:
Calc has some new command line flags / command line meaning:
(Thanks goes to Ernest Bowen <ernie@turing.une.edu.au>)
@@ -110,36 +333,40 @@ Following is the change from calc version 2.11.0t7 to date:
calc -p 2+17 | whey
will write '19' instead of '\t17' to the whey command.
will write '19' instead of '\t19' to the whey command.
Updated calc man page and help/usage file to reflect recent
command line changes.
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.
Converted start_done into a general calc run state enum called
run_state within the calc source.
Removed README.OLD.
Removed README.OLD.
Added the Makefile variable ${LCC} to invoke the local c compiler.
By default, ${CC} also run the ${LCC} compiler. The distinction is
useful when using something such as purify. In the case of ${LCC},
only the local C compiler is invoked. In the case of ${CC} a purify
compile is invoked. Only the source that must be compiled and run
on the local machine use ${LCC}; everything else uses ${CC}.
Added the Makefile variable ${LCC} to invoke the local c compiler.
By default, ${CC} also run the ${LCC} compiler. The distinction is
useful when using something such as purify. In the case of ${LCC},
only the local C compiler is invoked. In the case of ${CC} a purify
compile is invoked. Only the source that must be compiled and run
on the local machine use ${LCC}; everything else uses ${CC}.
Fixed memory buffer ovreread problem in eatstring() in token.c.
Fixed memory buffer ovreread problem in eatstring() in token.c.
Fixed memory leaks related to putenv().
Fixed memory leaks related to putenv().
Fixed memory leaks realted to srandom().
Fixed memory leaks realted to srandom().
Fixed compilation warnings and problems on BSDI.
Fixed compilation warnings and problems on BSDI.
Removed ${CCMAIN} as a variable from the Makefile. Now files
use either ${CFLAGS} for general C source and ${ICFLAGS} for
intermediate C source (e.g., special code for building hsrc files).
Removed ${CCMAIN} as a variable from the Makefile. Now files
use either ${CFLAGS} for general C source and ${ICFLAGS} for
intermediate C source (e.g., special code for building hsrc files).
Misc calc man page fixes.
The main calc URL is now:
http://reality.sgi.com/chongo/tech/comp/calc
Misc calc man page fixes.
Following is the change from calc version 2.11.0t1 to 2.11.0t6.3:
@@ -3715,9 +3942,6 @@ Following is the change from calc version 2.9.3t8 to 2.9.3t9.2:
Following is the change from calc version 2.9.3t7 to 2.9.3t7:
WARNING: This patch is an beta test patch by chongo@toad.com
(Landon Curt Noll).
The 'show' command by itself will issue an error message
that will remind one of the possible show arguments.
(thanks to Ha S. Lam <hl@kuhep4.phsx.ukans.edu>)
@@ -3765,9 +3989,6 @@ Following is the change from calc version 2.9.3t7 to 2.9.3t7:
Following is the change from calc version 2.9.2 to 2.9.3t7:
WARNING: This patch is an beta test patch by chongo@toad.com
(Landon Curt Noll).
Calc can now compile on OSF/1, SGI and IBM RS6000 systems.
A number of systems that have both <varargs.h> and <stdarg.h> do

359
Makefile
View File

@@ -106,7 +106,7 @@ LONGLONG_BITS=
# to determine if there is are fgetpos and fsetpos functions. If HAVE_FPOS
# is set to -DHAVE_NO_FPOS, then calc will use ftell() and fseek().
#
# If in doubt, leave HAVE_FPOS empty.
# If in doubt, leave HAVE_FPOS empty and this Makefile will figure it out.
#
HAVE_FPOS=
#HAVE_FPOS= -DHAVE_NO_FPOS
@@ -120,7 +120,7 @@ HAVE_FPOS=
# -DOFF_T_NON_SCALAR when calc will assume that off_t some sort of
# union or struct which.
#
# If in doubt, leave HAVE_OFFSCL empty.
# If in doubt, leave HAVE_OFFSCL empty and this Makefile will figure it out.
#
HAVE_OFFSCL=
#HAVE_OFFSCL= -DOFF_T_NON_SCALAR
@@ -136,7 +136,7 @@ HAVE_OFFSCL=
# -DFILEPOS_NON_SCALAR when calc will assume that fpos_t exists and is
# some sort of union or struct which.
#
# If in doubt, leave HAVE_POSSCL empty.
# If in doubt, leave HAVE_POSSCL empty and this Makefile will figure it out.
#
HAVE_POSSCL=
#HAVE_POSSCL= -DFILEPOS_NON_SCALAR
@@ -147,7 +147,7 @@ HAVE_POSSCL=
# to determine if const is supported. If HAVE_CONST is set to -DHAVE_NO_CONST,
# then calc will not use const.
#
# If in doubt, leave HAVE_CONST empty.
# If in doubt, leave HAVE_CONST empty and this Makefile will figure it out.
#
HAVE_CONST=
#HAVE_CONST= -DHAVE_NO_CONST
@@ -159,7 +159,7 @@ HAVE_CONST=
# then calc will treat uid_t as an unsigned short. This only matters if
# $HOME is not set and calc must look up the home directory in /etc/passwd.
#
# If in doubt, leave HAVE_UID_T empty.
# If in doubt, leave HAVE_UID_T empty and this Makefile will figure it out.
#
HAVE_UID_T=
#HAVE_UID_T= -DHAVE_NO_UID_T
@@ -172,7 +172,7 @@ HAVE_UID_T=
# of memcpy(), use bfill() instead of memset(), and use index() instead of
# strchr().
#
# If in doubt, leave HAVE_NEWSTR empty.
# If in doubt, leave HAVE_NEWSTR empty and this Makefile will figure it out.
#
HAVE_NEWSTR=
#HAVE_NEWSTR= -DHAVE_NO_NEWSTR
@@ -184,11 +184,83 @@ HAVE_NEWSTR=
# -DHAVE_NO_MEMMOVE, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_MEMMOVE empty.
# If in doubt, leave HAVE_MEMMOVE empty and this Makefile will figure it out.
#
HAVE_MEMMOVE=
#HAVE_MEMMOVE= -DHAVE_NO_MEMMOVE
# Determine if we have ustat()
#
# If HAVE_USTAT is empty, this makefile will run the have_memmv program
# to determine if ustat() is supported. If HAVE_USTAT is set to
# -DHAVE_NO_USTAT, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_USTAT empty and this Makefile will figure it out.
#
HAVE_USTAT=
#HAVE_USTAT= -DHAVE_NO_USTAT
# Determine if we have getsid()
#
# If HAVE_GETSID is empty, this makefile will run the have_memmv program
# to determine if getsid() is supported. If HAVE_GETSID is set to
# -DHAVE_NO_GETSID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_GETSID empty and this Makefile will figure it out.
#
HAVE_GETSID=
#HAVE_GETSID= -DHAVE_NO_GETSID
# Determine if we have getpgid()
#
# If HAVE_GETPGID is empty, this makefile will run the have_memmv program
# to determine if getpgid() is supported. If HAVE_GETPGID is set to
# -DHAVE_NO_GETPGID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_GETPGID empty and this Makefile will figure it out.
#
HAVE_GETPGID=
#HAVE_GETPGID= -DHAVE_NO_GETPGID
# Determine if we have clock_gettime()
#
# If HAVE_GETTIME is empty, this makefile will run the have_memmv program
# to determine if clock_gettime() is supported. If HAVE_GETTIME is set to
# -DHAVE_NO_GETTIME, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_GETTIME empty and this Makefile will figure it out.
#
HAVE_GETTIME=
#HAVE_GETTIME= -DHAVE_NO_GETTIME
# Determine if we have getprid()
#
# If HAVE_GETPRID is empty, this makefile will run the have_memmv program
# to determine if getprid() is supported. If HAVE_GETPRID is set to
# -DHAVE_NO_GETPRID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_GETPRID empty and this Makefile will figure it out.
#
HAVE_GETPRID=
#HAVE_GETPRID= -DHAVE_NO_GETPRID
# Determine if we have /dev/urandom
#
# If HAVE_URANDOM is empty, this makefile will run the have_memmv program
# to determine if /dev/urandom is supported. If HAVE_URANDOM is set to
# -DHAVE_NO_URANDOM, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_URANDOM empty and this Makefile will figure it out.
#
HAVE_URANDOM=
#HAVE_URANDOM= -DHAVE_NO_URANDOM
# Some architectures such as Sparc do not allow one to access 32 bit values
# that are not alligned on a 32 bit boundary.
#
@@ -809,7 +881,9 @@ BUILD_H_SRC= align32.h args.h calcerr.h conf.h endian_calc.h \
fposval.h have_const.h have_fpos.h have_malloc.h \
have_memmv.h have_newstr.h have_offscl.h have_posscl.h \
have_stdlib.h have_string.h have_times.h have_uid_t.h \
have_unistd.h longbits.h longlong.h terminal.h calc_errno.h
have_unistd.h longbits.h longlong.h terminal.h calc_errno.h \
have_ustat.h have_getsid.h have_getpgid.h \
have_gettime.h have_getprid.h have_urandom.h
# we build these .c files during the make
#
@@ -821,7 +895,9 @@ BUILD_C_SRC= calcerr.c
#
UTIL_C_SRC= align32.c endian.c longbits.c have_newstr.c have_uid_t.c \
have_const.c have_stdvs.c have_varvs.c fposval.c have_fpos.c \
longlong.c have_offscl.c have_posscl.c have_memmv.c calc_errno.c
longlong.c have_offscl.c have_posscl.c have_memmv.c calc_errno.c \
have_ustat.c have_getsid.c have_getpgid.c \
have_gettime.c have_getprid.c
# these awk and sed tools are used in the process of building BUILD_H_SRC
# and BUILD_C_SRC
@@ -835,17 +911,22 @@ UTIL_MISC_SRC= calcerr_h.sed calcerr_h.awk calcerr_c.sed calcerr_c.awk \
#
UTIL_OBJS= endian.o longbits.o have_newstr.o have_uid_t.o \
have_const.o fposval.o have_fpos.o longlong.o try_strarg.o \
have_stdvs.o have_varvs.o have_posscl.o have_memmv.o calc_errno.o
have_stdvs.o have_varvs.o have_posscl.o have_memmv.o calc_errno.o \
have_ustat.o have_getsid.o have_getpgid.o \
have_gettime.o have_getprid.o
# these temp files may be created (and removed) during the build of BUILD_C_SRC
# these temp files may be created (and removed) during the build of BUILD_C_SRC
#
UTIL_TMP= ll_tmp fpos_tmp fposv_tmp const_tmp uid_tmp newstr_tmp vs_tmp \
calc_errno_tmp
calc_errno_tmp memmv_tmp offscl_tmp posscl_tmp newstr_tmp \
getsid_tmp gettime_tmp getprid_tmp
# these utility progs may be used in the process of building BUILD_H_SRC
#
UTIL_PROGS= align32 fposval have_uid_t longlong have_const \
endian longbits have_newstr have_stdvs have_varvs calc_errno
endian longbits have_newstr have_stdvs have_varvs calc_errno \
have_ustat have_getsid have_getpgid \
have_gettime have_getprid
# These files are required by the regress.cal regression test.
#
@@ -1717,7 +1798,7 @@ have_newstr.h: have_newstr.c ${MAKE_FILE}
fi
have_memmv.h: have_memmv.c ${MAKE_FILE}
-${Q}rm -f have_memmv have_memmv.o newstr_tmp have_memmv.h
-${Q}rm -f have_memmv have_memmv.o memmv_tmp have_memmv.h
${Q}echo 'forming have_memmv.h'
${Q}echo '/*' > have_memmv.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_memmv.h
@@ -1732,17 +1813,17 @@ have_memmv.h: have_memmv.c ${MAKE_FILE}
-${Q}rm -f have_memmv.o have_memmv
-${Q}${LCC} ${ICFLAGS} ${HAVE_MEMMOVE} have_memmv.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_memmv.o -o have_memmv 2>/dev/null; true
-${Q}${SHELL} -c "./have_memmv > newstr_tmp 2>/dev/null" \
-${Q}${SHELL} -c "./have_memmv > memmv_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s newstr_tmp ]; then \
cat newstr_tmp >> have_memmv.h; \
-${Q}if [ -s memmv_tmp ]; then \
cat memmv_tmp >> have_memmv.h; \
else \
echo '#undef HAVE_MEMMOVE /* no */' >> have_memmv.h; \
fi
${Q}echo '' >> have_memmv.h
${Q}echo '' >> have_memmv.h
${Q}echo '#endif /* !__HAVE_MEMMV_H__ */' >> have_memmv.h
-${Q}rm -f have_memmv have_memmv.o newstr_tmp
-${Q}rm -f have_memmv have_memmv.o memmv_tmp
${Q}echo 'have_memmv.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
@@ -1754,6 +1835,231 @@ have_memmv.h: have_memmv.c ${MAKE_FILE}
true; \
fi
have_ustat.h: have_ustat.c ${MAKE_FILE}
-${Q}rm -f have_ustat have_ustat.o ustat_tmp have_ustat.h
${Q}echo 'forming have_ustat.h'
${Q}echo '/*' > have_ustat.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_ustat.h
${Q}echo ' */' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '#if !defined(__HAVE_USTAT_H__)' >> have_ustat.h
${Q}echo '#define __HAVE_USTAT_H__' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '/* do we have or want ustat()? */' >> have_ustat.h
-${Q}rm -f have_ustat.o have_ustat
-${Q}${LCC} ${ICFLAGS} ${HAVE_USTAT} have_ustat.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_ustat.o -o have_ustat 2>/dev/null; true
-${Q}${SHELL} -c "./have_ustat > ustat_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s ustat_tmp ]; then \
cat ustat_tmp >> have_ustat.h; \
else \
echo '#undef HAVE_USTAT /* no */' >> have_ustat.h; \
fi
${Q}echo '' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '#endif /* !__HAVE_USTAT_H__ */' >> have_ustat.h
-${Q}rm -f have_ustat have_ustat.o ustat_tmp
${Q}echo 'have_ustat.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_getsid.h: have_getsid.c ${MAKE_FILE}
-${Q}rm -f have_getsid have_getsid.o getsid_tmp have_getsid.h
${Q}echo 'forming have_getsid.h'
${Q}echo '/*' > have_getsid.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getsid.h
${Q}echo ' */' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '#if !defined(__HAVE_GETSID_H__)' >> have_getsid.h
${Q}echo '#define __HAVE_GETSID_H__' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '/* do we have or want getsid()? */' >> have_getsid.h
-${Q}rm -f have_getsid.o have_getsid
-${Q}${LCC} ${ICFLAGS} ${HAVE_GETSID} have_getsid.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_getsid.o -o have_getsid 2>/dev/null; true
-${Q}${SHELL} -c "./have_getsid > getsid_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s getsid_tmp ]; then \
cat getsid_tmp >> have_getsid.h; \
else \
echo '#undef HAVE_GETSID /* no */' >> have_getsid.h; \
fi
${Q}echo '' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '#endif /* !__HAVE_GETSID_H__ */' >> have_getsid.h
-${Q}rm -f have_getsid have_getsid.o getsid_tmp
${Q}echo 'have_getsid.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_getpgid.h: have_getpgid.c ${MAKE_FILE}
-${Q}rm -f have_getpgid have_getpgid.o getpgid_tmp have_getpgid.h
${Q}echo 'forming have_getpgid.h'
${Q}echo '/*' > have_getpgid.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getpgid.h
${Q}echo ' */' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '#if !defined(__HAVE_GETPGID_H__)' >> have_getpgid.h
${Q}echo '#define __HAVE_GETPGID_H__' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '/* do we have or want getpgid()? */' >> have_getpgid.h
-${Q}rm -f have_getpgid.o have_getpgid
-${Q}${LCC} ${ICFLAGS} ${HAVE_GETPGID} have_getpgid.c -c 2>/dev/null; \
true
-${Q}${LCC} ${ILDFLAGS} have_getpgid.o -o have_getpgid 2>/dev/null; true
-${Q}${SHELL} -c "./have_getpgid > getpgid_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s getpgid_tmp ]; then \
cat getpgid_tmp >> have_getpgid.h; \
else \
echo '#undef HAVE_GETPGID /* no */' >> have_getpgid.h; \
fi
${Q}echo '' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '#endif /* !__HAVE_GETPGID_H__ */' >> have_getpgid.h
-${Q}rm -f have_getpgid have_getpgid.o getpgid_tmp
${Q}echo 'have_getpgid.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_gettime.h: have_gettime.c ${MAKE_FILE}
-${Q}rm -f have_gettime have_gettime.o gettime_tmp have_gettime.h
${Q}echo 'forming have_gettime.h'
${Q}echo '/*' > have_gettime.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_gettime.h
${Q}echo ' */' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '#if !defined(__HAVE_GETTIME_H__)' >> have_gettime.h
${Q}echo '#define __HAVE_GETTIME_H__' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '/* do we have or want clock_gettime()? */' >> have_gettime.h
-${Q}rm -f have_gettime.o have_gettime
-${Q}${LCC} ${ICFLAGS} ${HAVE_GETTIME} have_gettime.c -c 2>/dev/null; \
true
-${Q}${LCC} ${ILDFLAGS} have_gettime.o -o have_gettime 2>/dev/null; true
-${Q}${SHELL} -c "./have_gettime > gettime_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s gettime_tmp ]; then \
cat gettime_tmp >> have_gettime.h; \
else \
echo '#undef HAVE_GETTIME /* no */' >> have_gettime.h; \
fi
${Q}echo '' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '#endif /* !__HAVE_GETTIME_H__ */' >> have_gettime.h
-${Q}rm -f have_gettime have_gettime.o gettime_tmp
${Q}echo 'have_gettime.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_getprid.h: have_getprid.c ${MAKE_FILE}
-${Q}rm -f have_getprid have_getprid.o getprid_tmp have_getprid.h
${Q}echo 'forming have_getprid.h'
${Q}echo '/*' > have_getprid.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getprid.h
${Q}echo ' */' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '#if !defined(__HAVE_GETPRID_H__)' >> have_getprid.h
${Q}echo '#define __HAVE_GETPRID_H__' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '/* do we have or want getprid()? */' >> have_getprid.h
-${Q}rm -f have_getprid.o have_getprid
-${Q}${LCC} ${ICFLAGS} ${HAVE_GETPRID} have_getprid.c -c 2>/dev/null; \
true
-${Q}${LCC} ${ILDFLAGS} have_getprid.o -o have_getprid 2>/dev/null; true
-${Q}${SHELL} -c "./have_getprid > getprid_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s getprid_tmp ]; then \
cat getprid_tmp >> have_getprid.h; \
else \
echo '#undef HAVE_GETPRID /* no */' >> have_getprid.h; \
fi
${Q}echo '' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '#endif /* !__HAVE_GETPRID_H__ */' >> have_getprid.h
-${Q}rm -f have_getprid have_getprid.o getprid_tmp
${Q}echo 'have_getprid.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_urandom.h: ${MAKE_FILE}
-${Q}rm -f have_urandom.h
${Q}echo 'forming have_urandom.h'
${Q}echo '/*' > have_urandom.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_urandom.h
${Q}echo ' */' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '#if !defined(__HAVE_URANDOM_H__)' >> have_urandom.h
${Q}echo '#define __HAVE_URANDOM_H__' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '/* do we have /dev/urandom? */' >> have_urandom.h
-${Q}if [ -c /dev/urandom ]; then \
echo '#define HAVE_URANDOM_H /* yes */' >> have_urandom.h; \
else \
echo '#undef HAVE_URANDOM_H /* no */' >> have_urandom.h; \
fi
${Q}echo '' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '#endif /* !__HAVE_URANDOM_H__ */' >> have_urandom.h
${Q}echo 'have_urandom.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
-${Q}rm -f args.h have_args
${Q}echo 'forming args.h'
@@ -2290,6 +2596,12 @@ env:
@echo "HAVE_CONST=${HAVE_CONST}"; echo ""
@echo "HAVE_UID_T=${HAVE_UID_T}"; echo ""
@echo "HAVE_NEWSTR=${HAVE_NEWSTR}"; echo ""
@echo "HAVE_USTAT=${HAVE_USTAT}"; echo ""
@echo "HAVE_GETSID=${HAVE_GETSID}"; echo ""
@echo "HAVE_GETPGID=${HAVE_GETPGID}"; echo ""
@echo "HAVE_GETTIME=${HAVE_GETTIME}"; echo ""
@echo "HAVE_GETPRID=${HAVE_GETPRID}"; echo ""
@echo "HAVE_URANDOM=${HAVE_URANDOM}"; echo ""
@echo "ALIGN32=${ALIGN32}"; echo ""
@echo "ERRNO_DECL=${ERRNO_DECL}"; echo ""
@echo "BINDIR=${BINDIR}"; echo ""
@@ -3020,6 +3332,10 @@ hash.o: zrand.h
hash.o: zrandom.h
have_const.o: have_const.c
have_fpos.o: have_fpos.c
have_getpgid.o: have_getpgid.c
have_getprid.o: have_getprid.c
have_getsid.o: have_getsid.c
have_gettime.o: have_gettime.c
have_memmv.o: have_memmv.c
have_newstr.o: have_newstr.c
have_offscl.o: have_offscl.c
@@ -3030,6 +3346,7 @@ have_stdvs.o: have_string.h
have_stdvs.o: have_unistd.h
have_uid_t.o: have_uid_t.c
have_uid_t.o: have_unistd.h
have_ustat.o: have_ustat.c
have_varvs.o: have_string.h
have_varvs.o: have_unistd.h
have_varvs.o: have_varvs.c
@@ -3510,11 +3827,17 @@ quickhash.o: zrandom.h
seed.o: alloc.h
seed.o: byteswap.h
seed.o: endian_calc.h
seed.o: have_getpgid.h
seed.o: have_getprid.h
seed.o: have_getsid.h
seed.o: have_gettime.h
seed.o: have_malloc.h
seed.o: have_memmv.h
seed.o: have_newstr.h
seed.o: have_stdlib.h
seed.o: have_string.h
seed.o: have_urandom.h
seed.o: have_ustat.h
seed.o: longbits.h
seed.o: qmath.h
seed.o: seed.c

9
README
View File

@@ -4,7 +4,7 @@ See the HOWTO.INSTALL file for information on how to build and install calc.
To be sure that your version of calc is up to date, check out:
http://reality.sgi.com/chongo/calc/calc-download.html
http://reality.sgi.com/chongo/tech/comp/calc/calc-download.html
We are interested in any/all feedback on recent versions of calc.
In particular we would like to hear about:
@@ -42,6 +42,7 @@ For overview of calc overview:
> help define
> help statement
> help variable
> help usage
For list of builtin functions:
@@ -60,10 +61,12 @@ Calc is shipped with a library of calc scripts. For a list see:
See the file:
help/todo
help/wishlist
or run:
calc 'help todo'
calc help todo
calc help wishlist
for a wish/todo list. Code contributions are welcome.
@@ -84,4 +87,4 @@ your full name.
The calc web site is located at:
http://reality.sgi.com/chongo/calc
http://reality.sgi.com/chongo/tech/comp/calc

View File

@@ -164,8 +164,8 @@ endfunc(void)
size += dumpop(&fp->f_opcodes[size]);
}
}
if ((inputisterminal() && conf->lib_debug & 1) ||
(!inputisterminal() && conf->lib_debug & 2)) {
if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) ||
(!inputisterminal() && conf->lib_debug & LIBDBG_FILE_FUNC)) {
printf("%s(", fp->f_name);
for (index = 0; index < fp->f_paramcount; index++) {
if (index)
@@ -238,8 +238,8 @@ rmuserfunc(char *name)
return;
freenumbers(functions[index]);
free(functions[index]);
if ((inputisterminal() && conf->lib_debug & 1) ||
(!inputisterminal() && conf->lib_debug & 2))
if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) ||
(!inputisterminal() && conf->lib_debug & LIBDBG_FILE_FUNC))
printf("%s() undefined\n", name);
functions[index] = NULL;
}

View File

@@ -3,7 +3,10 @@
*
* This file was written by:
*
* Landon Curt Noll (chongo@toad.com) chongo <was here> /\../\
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*
* This code has been placed in the public domain. Please do not
* copyright this code.

View File

@@ -57,7 +57,7 @@ associndex(ASSOC *ap, BOOL create, long dim, VALUE *indices)
* so that we can first select the correct hash chain, and
* also so we can quickly compare each element for a match.
*/
hash = (QCKHASH)0;
hash = FNV1_32_BASIS;
for (i = 0; i < dim; i++)
hash = hashvalue(&indices[i], hash);

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*/
#include <stdio.h>

28
block.c
View File

@@ -27,12 +27,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
@@ -106,7 +104,7 @@ blkalloc(int len, int chunk)
/*
* return BLOCK
*/
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(nblk);
}
return nblk;
@@ -147,13 +145,11 @@ blk_free(BLOCK *blk)
* debug time, we plan to call this function often. Once we are satisfied,
* we will normally call this code only in a few places.
*
* This function is normally called whenever the following builtins are called:
* If "calc_debug" has the bit corresponding to CALCDBG_BLOCK set, this
* function is called during execution of the following builtins:
*
* alloc(), realloc(), free()
*
* unless the "calc_debug" is set to -1. If "calc_debug" is > 0, then
* most blk builtins will call this function.
*
* given:
* blk - the BLOCK to check
*
@@ -168,7 +164,7 @@ blkchk(BLOCK *blk)
/*
* firewall - general sanity check
*/
if (conf->calc_debug == -1) {
if ((conf->calc_debug & CALCDBG_BLOCK) == 0) {
/* do nothing when debugging is disabled */
return;
}
@@ -233,7 +229,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
/*
* firewall
*/
if (conf->calc_debug != -1) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
@@ -292,7 +288,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
memset(blk->data, 0, blk->maxsize);
}
blk->datalen = 0;
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
return blk;
@@ -323,7 +319,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
/*
* return realloced type
*/
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
return blk;
@@ -351,7 +347,7 @@ blktrunc(BLOCK *blk)
/*
* firewall
*/
if (conf->calc_debug != -1) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
@@ -372,7 +368,7 @@ blktrunc(BLOCK *blk)
/*NOTREACHED*/
}
blk->data[0] = (USB8)0;
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
return;

View File

@@ -27,12 +27,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/

135
calc.c
View File

@@ -87,7 +87,7 @@ main(int argc, char **argv)
i_flag = TRUE;
break;
case 'm':
if (optarg[1] == '\0' || *optarg<'0' || *optarg>'7') {
if (optarg[1] != '\0' || *optarg<'0' || *optarg>'7') {
/*
* we are too early in processing to
* call libcalc_call_me_last()
@@ -237,73 +237,94 @@ main(int argc, char **argv)
/*
* execute calc code based on the run state
*/
if (run_state == RUN_PRE_BEGIN) {
if (run_state == RUN_BEGIN) {
if (!q_flag && allow_read) {
run_state = RUN_PRE_RCFILES;
run_state = RUN_RCFILES;
runrcfiles();
}
run_state = RUN_POST_RCFILES;
}
if (run_state == RUN_PRE_RCFILES) {
fprintf(stderr, "Execution error in rcfiles\n");
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE);
run_state = RUN_POST_RCFILES;
} else {
if ((havecommands && !i_flag) || !stdin_tty)
run_state = RUN_STOP_ON_ERROR;
else if (havecommands)
run_state = RUN_POST_CMD_ARGS;
else
run_state = RUN_POST_RCFILES;
}
}
if (run_state == RUN_POST_RCFILES) {
if (havecommands) {
run_state = RUN_PRE_CMD_ARGS;
(void) openstring(cmdbuf);
getcommands(FALSE);
}
run_state = RUN_POST_CMD_ARGS;
}
if (run_state == RUN_PRE_CMD_ARGS) {
fprintf(stderr, "Execution error in commands\n");
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE);
run_state = RUN_POST_CMD_ARGS;
} else {
closeinput();
if (!stdin_tty || !i_flag)
run_state = RUN_STOP_ON_ERROR;
else
run_state = RUN_POST_CMD_ARGS;
}
}
if (run_state == RUN_POST_CMD_ARGS) {
if (stdin_tty && ((havecommands && !i_flag) || p_flag))
run_state = RUN_NOT_TOP_LEVEL;
else
openterminal();
} 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();
run_state = RUN_PRE_CMD_ARGS;
}
if (run_state < RUN_NOT_TOP_LEVEL) {
run_state = RUN_TOP_LEVEL;
getcommands(TRUE);
while (run_state == RUN_RCFILES) {
fprintf(stderr, "Error in rcfiles\n");
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE);
if (inputlevel() == 0) {
closeinput();
runrcfiles();
run_state = RUN_PRE_CMD_ARGS;
} else {
closeinput();
}
} else {
if ((havecommands && !i_flag) || !stdin_tty)
run_state = RUN_EXIT_WITH_ERROR;
else
run_state = RUN_PRE_CMD_ARGS;
}
}
if (run_state == RUN_PRE_CMD_ARGS) {
if (havecommands) {
run_state = RUN_CMD_ARGS;
(void) openstring(cmdbuf, (long) strlen(cmdbuf));
getcommands(FALSE);
closeinput();
}
run_state = RUN_PRE_TOP_LEVEL;
}
while (run_state == RUN_CMD_ARGS) {
fprintf(stderr, "Error in commands\n");
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE);
if (inputlevel() == 0)
run_state = RUN_PRE_TOP_LEVEL;
closeinput();
} else {
closeinput();
if (!stdin_tty || !i_flag || p_flag)
run_state = RUN_EXIT_WITH_ERROR;
else
run_state = RUN_PRE_TOP_LEVEL;
}
}
if (run_state == RUN_PRE_TOP_LEVEL) {
if (stdin_tty && ((havecommands && !i_flag) || p_flag)) {
run_state = RUN_EXIT;
} else {
if (stdin_tty) {
reinitialize();
} else {
resetinput();
openterminal();
}
run_state = RUN_TOP_LEVEL;
getcommands(TRUE);
}
}
while (run_state == RUN_TOP_LEVEL) {
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(TRUE);
if (!inputisterminal())
closeinput();
} else {
if (stdin_tty) {
reinitialize();
getcommands(TRUE);
} else {
run_state = RUN_EXIT_WITH_ERROR;
}
}
}
/*
* all done
*/
libcalc_call_me_last();
return (run_state == RUN_STOP_ON_ERROR ||
return (run_state == RUN_EXIT_WITH_ERROR ||
run_state == RUN_UNKNOWN) ? 1 : 0;
}

28
calc.h
View File

@@ -113,7 +113,7 @@ extern void trimconstants(void);
/*
* Input routines.
*/
extern int openstring(char *str);
extern int openstring(char *str, long num);
extern int openterminal(void);
extern int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok);
extern char *nextline(void);
@@ -122,6 +122,8 @@ extern void reread(void);
extern void resetinput(void);
extern void setprompt(char *);
extern BOOL inputisterminal(void);
extern int inputlevel(void);
extern long calclevel(void);
extern char *inputname(void);
extern long linenumber(void);
extern void runrcfiles(void);
@@ -163,6 +165,7 @@ 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 BOOL abort_now; /* TRUE => try to go interactive */
extern char *pager; /* $PAGER or default */
extern int stdin_tty; /* TRUE if stdin is a tty */
@@ -190,22 +193,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 */
/*
* calc startup and run state
/*
* 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_BEGIN = 0, /* calc execution starts */
RUN_RCFILES = 1, /* rc files being evaluated */
RUN_PRE_CMD_ARGS = 2, /* prepare to evaluate cmd args */
RUN_CMD_ARGS = 3, /* cmd args being evaluated */
RUN_PRE_TOP_LEVEL = 4, /* prepare to start top level activity */
RUN_TOP_LEVEL = 5, /* running at top level */
RUN_EXIT = 6, /* normal exit from calc */
RUN_EXIT_WITH_ERROR = 7 /* exit with error */
} run;
extern run run_state;
extern run run_state;
/*
* calc version information

View File

@@ -62,6 +62,13 @@ cause
.B calc
to try to process each line being read
despite the errors that it encounters.
.sp 1
By default, calc startup scripts ($CALCRC) are silently
ignored if not found.
This flag will report missing
startup scripts unless
.B \-d
is also given.
.TP
.B \-C
@@ -112,6 +119,8 @@ It's nearly ten past six.
.fi
.in -5n
.sp 1
This flag disables the reporting of missing calc
startup scripts ($CALCRC).
.TP
.B \-e
@@ -567,7 +576,7 @@ scripts that you would like you see included
in future distributions to:
.sp
.in +0.5i
calc-tester-request@postofc.corp.sgi.com
calc-tester@postofc.corp.sgi.com
.in -0.5i
.sp
Landon Noll maintains the the
@@ -575,7 +584,7 @@ Landon Noll maintains the the
web site is located at:
.sp
.in +0.5i
http://reality.sgi.com/chongo/calc
http://reality.sgi.com/chongo/tech/comp/calc
.in -0.5i
.sp
One may join the

View File

@@ -31,7 +31,7 @@ static void getshowstatement(void);
static void getfunction(void);
static void ungetfunction(void);
static void getbody(LABEL *contlabel, LABEL *breaklabel,
LABEL *nextcaselabel, LABEL *defaultlabel, BOOL toplevel);
LABEL *nextcaselabel, LABEL *defaultlabel);
static void getdeclarations(int symtype);
static void getsimpledeclaration (int symtype);
static int getonevariable (int symtype);
@@ -86,6 +86,7 @@ getcommands(BOOL toplevel)
/* firewall */
name[0] = '\0';
name[MAXCMD+1] = '\0';
abort_now = FALSE;
/* getcommands */
if (!toplevel)
@@ -125,6 +126,7 @@ getcommands(BOOL toplevel)
switch (opensearchfile(name,calcpath,CALCEXT,rdonce)) {
case 0:
getcommands(FALSE);
closeinput();
break;
case 1:
/* previously read and -once was given */
@@ -163,6 +165,13 @@ getcommands(BOOL toplevel)
if (evaluate(FALSE))
updateoldvalue(curfunc);
freefunc(curfunc);
if (abort_now) {
if (!stdin_tty)
run_state = RUN_EXIT;
else if (run_state < RUN_PRE_TOP_LEVEL)
run_state = RUN_PRE_TOP_LEVEL;
longjmp(jmpbuf, 1);
}
}
}
}
@@ -189,22 +198,26 @@ evaluate(BOOL nestflag)
funcname = (nestflag ? "**" : "*");
beginfunc(funcname, nestflag);
if (nestflag)
(void) tokenmode(TM_DEFAULT);
while (loop) {
switch (gettoken()) {
case T_SEMICOLON:
break;
if (gettoken() == T_LEFTBRACE) {
getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL, NULL_LABEL);
} else {
if (nestflag)
(void) tokenmode(TM_DEFAULT);
rescantoken();
while (loop) {
switch (gettoken()) {
case T_SEMICOLON:
break;
case T_NEWLINE:
case T_EOF:
loop = 0;
break;
case T_NEWLINE:
case T_EOF:
loop = 0;
break;
default:
rescantoken();
getstatement(NULL_LABEL, NULL_LABEL,
NULL_LABEL, NULL_LABEL);
default:
rescantoken();
getstatement(NULL_LABEL, NULL_LABEL,
NULL_LABEL, NULL_LABEL);
}
}
}
addop(OP_UNDEF);
@@ -321,13 +334,11 @@ getfunction(void)
}
switch (gettoken()) {
case T_ASSIGN:
rescantoken();
getsimplebody();
break;
case T_LEFTBRACE:
rescantoken();
getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL,
NULL_LABEL, TRUE);
NULL_LABEL);
break;
default:
scanerror(T_NULL,
@@ -346,18 +357,9 @@ getfunction(void)
static void
getsimplebody(void)
{
if (gettoken() != T_ASSIGN) {
scanerror(T_SEMICOLON,
"Missing equals for simple function body");
return;
}
(void) tokenmode(TM_NEWLINES);
(void) getexprlist();
addop(OP_RETURN);
if (gettoken() != T_SEMICOLON)
rescantoken();
if (gettoken() != T_NEWLINE)
scanerror(T_NULL, "Illegal function definition");
}
@@ -368,14 +370,10 @@ getsimplebody(void)
*/
/*ARGSUSED*/
static void
getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel, BOOL toplevel)
getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel)
{
int oldmode;
if (gettoken() != T_LEFTBRACE) {
scanerror(T_SEMICOLON, "Missing left brace for function body");
return;
}
oldmode = tokenmode(TM_DEFAULT);
while (TRUE) {
switch (gettoken()) {
@@ -383,6 +381,10 @@ getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaul
(void) tokenmode(oldmode);
return;
case T_EOF:
scanerror(T_SEMICOLON, "End-of-file in function body");
return;
default:
rescantoken();
getstatement(contlabel, breaklabel, nextcaselabel, defaultlabel);
@@ -407,6 +409,7 @@ getdeclarations(int symtype)
case T_NEWLINE:
case T_SEMICOLON:
case T_RIGHTBRACE:
case T_EOF:
rescantoken();
return;
@@ -598,8 +601,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
break;
case T_LEFTBRACE:
rescantoken();
getbody(contlabel, breaklabel, nextcaselabel, defaultlabel, FALSE);
getbody(contlabel, breaklabel, nextcaselabel, defaultlabel);
return;
case T_IF:
@@ -869,8 +871,19 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
}
break;
case T_ABORT:
switch (gettoken()) {
case T_STRING:
addopone(OP_ABORT, tokenstring());
break;
default:
addopone(OP_ABORT, -1);
rescantoken();
}
break;
case T_SYMBOL:
if (nextchar() == ':') { /****HACK HACK ****/
if (nextchar() == ':') { /****HACK HACK****/
definelabel(tokensymbol());
if (gettoken() == T_RIGHTBRACE) {
rescantoken();
@@ -1004,8 +1017,7 @@ getoneobj(long index, int symtype)
if (symtype == SYM_UNDEFINED) {
rescantoken();
(void) getidexpr(TRUE, TRUE);
}
else {
} else {
symname = tokensymbol();
definesymbol(symname, symtype);
usesymbol(symname, FALSE);
@@ -1089,8 +1101,7 @@ getonematrix(int symtype)
if (symtype == SYM_UNDEFINED) {
rescantoken();
(void) getidexpr(FALSE, TRUE);
}
else {
} else {
name = tokensymbol();
definesymbol(name, symtype);
usesymbol(name, FALSE);
@@ -1175,9 +1186,9 @@ creatematrix(void)
switch (gettoken()) {
case T_RIGHTBRACKET:
addopone(OP_MATCREATE, dim);
if (gettoken() == T_LEFTBRACKET)
if (gettoken() == T_LEFTBRACKET) {
creatematrix();
else {
} else {
rescantoken();
addop(OP_ZERO);
}
@@ -1353,8 +1364,7 @@ getopassignment(void)
while (gettoken() == T_ASSIGN)
getinitlist();
rescantoken();
}
else {
} else {
rescantoken();
(void) getassignment();
}

View File

@@ -231,8 +231,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
return r;
}
s3 = zquo(tmp3, d, &tmp1, s2 < 0);
}
else {
} else {
s2 = zquo(tmp1, d, &tmp3, s1 ? (s1 < 0) : 16);
zfree(tmp1);
s3 = zsqrt(tmp3,&tmp1,(s1||s2) ? (s1<0 || s2<0) : 16);
@@ -288,8 +287,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
return r;
}
s3 = zquo(tmp3, d, &mul1, 0);
}
else {
} else {
s2 = zquo(tmp1, d, &tmp3, 0);
zfree(tmp1);
s3 = zsqrt(tmp3, &mul1, 0);

View File

@@ -55,6 +55,7 @@ NAMETYPE configs[] = {
{"lib_debug", CONFIG_LIB_DEBUG},
{"calc_debug", CONFIG_CALC_DEBUG},
{"user_debug", CONFIG_USER_DEBUG},
{"verbose_quit",CONFIG_VERBOSE_QUIT},
{NULL, 0}
};
@@ -95,7 +96,8 @@ CONFIG oldstd = { /* backward compatible standard configuration */
BLK_FMT_HD_STYLE, /* block output format */
3, /* calc library debug level */
0, /* internal calc debug level */
0 /* user defined debug level */
0, /* user defined debug level */
TRUE /* print Quit or abort executed messages */
};
CONFIG newstd = { /* new non-backward compatible configuration */
MODE_INITIAL, /* current output mode */
@@ -130,7 +132,8 @@ CONFIG newstd = { /* new non-backward compatible configuration */
BLK_FMT_HD_STYLE, /* block output format */
3, /* calc library debug level */
0, /* internal calc debug level */
0 /* user defined debug level */
0, /* user defined debug level */
TRUE /* print Quit or abort executed messages */
};
CONFIG *conf = NULL; /* loaded in at startup - current configuration */
@@ -848,6 +851,21 @@ setconfig(int type, VALUE *vp)
conf->user_debug = temp;
break;
case CONFIG_VERBOSE_QUIT:
if (vp->v_type == V_NUM) {
q = vp->v_num;
conf->verbose_quit = !qiszero(q);
} else if (vp->v_type == V_STR) {
temp = truthtype(vp->v_str->s_str);
if (temp < 0) {
math_error("Illegal truth value"
"for verbose_quit");
/*NOTREACHED*/
}
conf->verbose_quit = (int)temp;
}
break;
default:
math_error("Setting illegal config parameter");
/*NOTREACHED*/
@@ -1119,6 +1137,10 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
i = cfg->user_debug;
break;
case CONFIG_VERBOSE_QUIT:
i = cfg->verbose_quit;
break;
default:
math_error("Getting illegal CONFIG element");
/*NOTREACHED*/
@@ -1194,5 +1216,6 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
cfg1->blkfmt != cfg2->blkfmt ||
cfg1->lib_debug != cfg2->lib_debug ||
cfg1->calc_debug != cfg2->calc_debug ||
cfg1->user_debug != cfg2->user_debug;
cfg1->user_debug != cfg2->user_debug ||
cfg1->verbose_quit != cfg2->verbose_quit;
}

View File

@@ -28,12 +28,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
@@ -82,6 +80,7 @@
#define CONFIG_LIB_DEBUG 30
#define CONFIG_CALC_DEBUG 31
#define CONFIG_USER_DEBUG 32
#define CONFIG_VERBOSE_QUIT 33
/*
@@ -116,8 +115,8 @@ struct config {
LEN sq2; /* size of number to use square algorithm 2 */
LEN pow2; /* size of modulus to use REDC for powers */
LEN redc2; /* size of modulus to use REDC algorithm 2 */
int tilde_ok; /* ok to print a tilde on aproximations */
int tab_ok; /* ok to print tab before numeric values */
BOOL tilde_ok; /* ok to print a tilde on aproximations */
BOOL tab_ok; /* ok to print tab before numeric values */
long quomod; /* quomod() default rounding mode */
long quo; /* quotent // default rounding mode */
long mod; /* mod % default rounding mode */
@@ -127,22 +126,41 @@ struct config {
long cfsim; /* cfsim() default rounding mode */
long outround; /* output default rounding mode */
long round; /* round()/bround() default rounding mode */
int leadzero; /* ok to print leading 0 before decimal pt */
int fullzero; /* ok to print trailing 0's */
BOOL leadzero; /* ok to print leading 0 before decimal pt */
BOOL fullzero; /* ok to print trailing 0's */
long maxscancount; /* max scan errors before abort */
char *prompt1; /* normal prompt */
char *prompt2; /* prompt when inside multi-line input */
int blkmaxprint; /* octets of a block to print, 0 => all */
int blkverbose; /* TRUE => print all lines if a block */
BOOL blkverbose; /* TRUE => print all lines if a block */
int blkbase; /* block output base */
int blkfmt; /* block output style */
int lib_debug; /* library debug: <0 none, 0 default, >0 more */
int calc_debug; /* internal debug: <0 none, 0 default,>0 more */
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 */
BOOL verbose_quit; /* TRUE => print Quit or abort executed msg */
};
typedef struct config CONFIG;
/*
* lib_debug bit masks
*/
#define LIBDBG_STDIN_FUNC (0x00000001) /* interactive func define debug */
#define LIBDBG_FILE_FUNC (0x00000002) /* file read func define debug */
#define LIBDBG_MASK (0x00000003)
/*
* calc_debug bit masks
*/
#define CALCDBG_SYSTEM (0x00000001) /* print system cmd prior to exec */
#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)
/*
* global configuration states and aliases
*/

View File

@@ -24,12 +24,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
/* these include files are needed regardless of CUSTOM */

View File

@@ -28,15 +28,12 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
/*
* Be careful what you put in this file, upper .c files include
* this file even when CUSTOM is not defined (ALLOW_CUSTOM is empty).

View File

@@ -1,5 +1,5 @@
#
# Copyright (c) 1997 Landon Curt Noll
# Copyright (c) 1999 Landon Curt Noll
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby granted,
@@ -19,7 +19,7 @@
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# chongo was here /\../\ chongo@toad.com
# chongo was here /\../\ http://reality.sgi.com/chongo
The following custom calc library files are provided because they serve
as examples of how use the custom interface. The custom interface
@@ -44,8 +44,19 @@ calc library standards and guidelines.
=-=
argv.cal
argv(var, ...)
print information about various args
halflen.cal
halflen(num)
Calculate the length of a numeric value in HALF's.
pzasusb8.cal
Run custom("pzasusb8") on a standard set of data, print Endian
related information and print value size information.

View File

@@ -38,17 +38,17 @@ Step 1: Do some background work
you look at some examples of custom functions. Check out
the following source files:
../custom.c
custom.h
custtbl.c
c_*.[ch]
../help/custom
custom.c
custom/custom.h
custom/custtbl.c
custom/c_*.[ch]
help/custom (or run: calc help custom)
You would be well advised to look at a more recent calc source
such as one available in from the calc alpha test archive.
such as one available in from the calc version archive.
See the following for more details:
../help/archive
help/archive (or run: calc help archive)
Step 2: Name your custom function
@@ -604,3 +604,16 @@ Step 11: Install
Although calc does not run setuid, you may need to be root to install
the directories into which calc installs may be write protected.
Step 12: Contribute
Your custom function may be of interest to some people and/or
serve as an example of what one can do with custom functions.
Read the file:
help/contrib (or run: calc help contrib)
and consider submitting your custom function for possible
inclusion in later versions of calc.

View File

@@ -26,12 +26,10 @@
#
# Happy bit twiddling,
#
# Landon Curt Noll
# Landon Curt Noll
# http://reality.sgi.com/chongo
#
# chongo@toad.com
# ...!{pyramid,sun,uunet}!hoptoad!chongo
#
# chongo was here /\../\
# chongo <was here> /\../\
##############################################################################
#-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-#
@@ -421,9 +419,13 @@ depend:
else \
rm -f Makefile.tmp; \
mv Makefile Makefile.tmp; \
sccs edit Makefile; \
if [ -d RCS ]; then; \
co -l Makefile; \
fi ;\
mv Makefile.tmp Makefile; \
echo new 'custom Makefile formed -- you need to check it in'; \
if [ -d RCS ]; then; \
echo new custom Makefile formed '--' you need to check it in'; \
fi; \
fi
##
@@ -590,8 +592,28 @@ c_help.o: ../string.h
c_help.o: ../value.h
c_help.o: ../zmath.h
c_help.o: c_help.c
c_pzasusb8.o: ../alloc.h
c_pzasusb8.o: ../block.h
c_pzasusb8.o: ../byteswap.h
c_pzasusb8.o: ../calcerr.h
c_pzasusb8.o: ../cmath.h
c_pzasusb8.o: ../config.h
c_pzasusb8.o: ../custom.h
c_pzasusb8.o: ../endian_calc.h
c_pzasusb8.o: ../hash.h
c_pzasusb8.o: ../have_const.h
c_pzasusb8.o: ../have_malloc.h
c_pzasusb8.o: ../have_memmv.h
c_pzasusb8.o: ../have_newstr.h
c_pzasusb8.o: ../have_stdlib.h
c_pzasusb8.o: ../have_string.h
c_pzasusb8.o: ../longbits.h
c_pzasusb8.o: ../md5.h
c_pzasusb8.o: ../nametype.h
c_pzasusb8.o: ../qmath.h
c_pzasusb8.o: ../shs.h
c_pzasusb8.o: ../shs1.h
c_pzasusb8.o: ../string.h
c_pzasusb8.o: ../value.h
c_pzasusb8.o: ../zmath.h
c_pzasusb8.o: c_pzasusb8.c

View File

@@ -10,7 +10,7 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\ chongo@toad.com
* chongo was here /\../\ http://reality.sgi.com/chongo
*/
/*
* argv - print information about various args

View File

@@ -15,12 +15,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
#if defined(CUSTOM)

View File

@@ -15,12 +15,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
#if defined(CUSTOM)

View File

@@ -15,12 +15,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
#if defined(CUSTOM)

View File

@@ -15,12 +15,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
#if defined(CUSTOM)

View File

@@ -24,12 +24,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/

View File

@@ -10,7 +10,7 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\ chongo@toad.com
* chongo was here /\../\ http://reality.sgi.com/chongo
*/
/*
* halflen - determine the length of numeric value in HALFs

View File

@@ -27,3 +27,5 @@ print "BIG_ENDIAN: ", custom("sysinfo", "BIG_ENDIAN");
print "LITTLE_ENDIAN: ", custom("sysinfo", "LITTLE_ENDIAN");
print "LONG_BITS: ", custom("sysinfo", "LONG_BITS");
print "LONGLONG_BITS: ", custom("sysinfo", "LONGLONG_BITS");
print "Calc sizes:";
show sizes;

19
file.c
View File

@@ -115,15 +115,14 @@ file_init(void)
*/
if (fstat(i, &sbuf) >= 0) {
fp = (FILE *) fdopen(i,"r+"); /*guess mode*/
if (fp)
if (fp) {
strcpy(files[idnum].mode, "r+");
else {
} else {
fp = (FILE *) fdopen(i, "r");
if (fp) {
strcpy(files[idnum].mode, "r");
files[idnum].writing = FALSE;
}
else {
} else {
fp = (FILE *) fdopen(i, "w");
if (fp) {
strcpy(files[idnum].mode, "w?");
@@ -885,13 +884,14 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
math_str((char *)
vp->v_nblock
->blk->data);
} else if (printchar) {
} else if (printchar) {
if (vp->v_nblock->blk->data !=
NULL)
math_chr(*vp->v_nblock->
blk->data);
} else
} else {
printvalue(vp, PRINT_NORMAL);
}
break;
default:
printvalue(vp, PRINT_NORMAL);
@@ -1770,8 +1770,7 @@ showfiles(void)
if (fstat(fileno(fp), &sbuf) < 0) {
printf("Bad fstat for file %d\n", (int) fiop->id);
sizes[i] = -1;
}
else {
} else {
inodes[i] = sbuf.st_ino;
sizes[i] = (long) sbuf.st_size;
}
@@ -2471,9 +2470,9 @@ fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res)
}
(void) f_seek_set(fiop->fp, &cur);
}
if (*tmp.v)
if (*tmp.v) {
(*tmp.v)--;
else {
} else {
if (tmp.len == 1)
break;
k = 0;

109
func.c
View File

@@ -153,12 +153,15 @@ f_eval(VALUE *vp)
FUNC *oldfunc;
FUNC *newfunc;
VALUE result;
char *cp;
char *str;
long num;
int temp;
if (vp->v_type != V_STR)
return error_value(E_EVAL2);
cp = vp->v_str->s_str;
switch (openstring(cp)) {
str = vp->v_str->s_str;
num = vp->v_str->s_len;
switch (openstring(str, num)) {
case -2:
return error_value(E_EVAL3);
case -1:
@@ -166,7 +169,11 @@ f_eval(VALUE *vp)
}
oldfunc = curfunc;
enterfilescope();
temp = stoponerror;
stoponerror = -1;
if (evaluate(TRUE)) {
stoponerror = temp;
closeinput();
exitfilescope();
freevalue(stack--);
newfunc = curfunc;
@@ -178,6 +185,8 @@ f_eval(VALUE *vp)
free(newfunc);
return result;
}
stoponerror = temp;
closeinput();
exitfilescope();
newfunc = curfunc;
curfunc = oldfunc;
@@ -199,11 +208,11 @@ f_prompt(VALUE *vp)
unsigned int len;
result.v_type = V_STR;
if (inputisterminal()) {
printvalue(vp, PRINT_SHORT);
math_flush();
}
openterminal();
printvalue(vp, PRINT_SHORT);
math_flush();
cp = nextline();
closeinput();
if (cp == NULL) {
math_error("End of file while prompting");
/*NOTREACHED*/
@@ -1520,16 +1529,12 @@ static VALUE
f_hash(int count, VALUE **vals)
{
QCKHASH hash;
long lhash;
VALUE result;
hash = (QCKHASH)0;
hash = FNV1_32_BASIS;
while (count-- > 0)
hash = hashvalue(*vals++, hash);
lhash = (long) hash;
if (lhash < 0)
lhash = -lhash;
result.v_num = itoq(lhash);
result.v_num = utoq((FULL) hash);
result.v_type = V_NUM;
return result;
}
@@ -1636,8 +1641,7 @@ f_avg(int count, VALUE **vals)
if ((*vals)->v_type == V_LIST) {
addlistitems((*vals)->v_list, &sum);
n += countlistitems((*vals++)->v_list);
}
else {
} else {
addvalue(&sum, *vals++, &tmp);
freevalue(&sum);
sum = tmp;
@@ -1686,8 +1690,7 @@ f_hmean(int count, VALUE **vals)
if ((*vals)->v_type == V_LIST) {
addlistinv((*vals)->v_list, &sum);
n += countlistitems((*vals++)->v_list);
}
else {
} else {
invertvalue(*vals++, &tmp1);
addvalue(&sum, &tmp1, &tmp2);
freevalue(&tmp1);
@@ -3838,9 +3841,9 @@ f_search(int count, VALUE **vals)
start = qlink(start);
}
if (end) {
if (!qispos(end))
if (!qispos(end)) {
end = qqadd(size, end);
else {
} else {
if (qrel(end, size) > 0)
end = qlink(size);
else
@@ -3862,8 +3865,7 @@ f_search(int count, VALUE **vals)
if (count == 2 || (count == 4 && end != NULL)) {
start = qalloc();
start->num = pos;
}
else {
} else {
end = qalloc();
end->num = pos;
}
@@ -4001,9 +4003,9 @@ f_rsearch(int count, VALUE **vals)
start = qlink(start);
}
if (end) {
if (!qispos(end))
if (!qispos(end)) {
end = qqadd(size, end);
else {
} else {
if (qrel(end, size) > 0)
end = qlink(size);
else
@@ -4025,8 +4027,7 @@ f_rsearch(int count, VALUE **vals)
if (count == 2 || (count == 4 && end != NULL)) {
start = qalloc();
start->num = pos;
}
else {
} else {
end = qalloc();
end->num = pos;
}
@@ -4038,8 +4039,7 @@ f_rsearch(int count, VALUE **vals)
if (count < 4) {
end = start;
start = NULL;
}
else {
} else {
qtmp = qsub(end, qlen);
qfree(end);
end = qtmp;
@@ -4630,9 +4630,9 @@ f_strerror(int count, VALUE **vals)
if (count > 0) {
vp = vals[0];
if (vp->v_type < 0)
if (vp->v_type < 0) {
i = (long) -vp->v_type;
else {
} else {
if (vp->v_type != V_NUM || qisfrac(vp->v_num))
return error_value(E_STRERROR1);
i = qtoi(vp->v_num);
@@ -4743,12 +4743,12 @@ f_error(int count, VALUE **vals)
if (count > 0) {
vp = vals[0];
if (vp->v_type <= 0)
if (vp->v_type <= 0) {
r = (long) -vp->v_type;
else {
if (vp->v_type != V_NUM || qisfrac(vp->v_num))
} else {
if (vp->v_type != V_NUM || qisfrac(vp->v_num)) {
r = E_ERROR1;
else {
} else {
r = qtoi(vp->v_num);
if (r < 0 || r >= 32768)
r = E_ERROR2;
@@ -5538,28 +5538,26 @@ f_tail(VALUE *v1, VALUE *v2)
res.v_type = v1->v_type;
switch (v1->v_type) {
case V_LIST:
if (n == 0)
if (n == 0) {
res.v_list = listalloc();
else if (n > 0) {
} else if (n > 0) {
res.v_list = listsegment(v1->v_list,
v1->v_list->l_count - n,
v1->v_list->l_count - 1);
}
else {
} else {
res.v_list = listsegment(v1->v_list,
v1->v_list->l_count - 1,
v1->v_list->l_count + n);
}
return res;
case V_STR:
if (n == 0)
if (n == 0) {
res.v_str = slink(&_nullstring_);
else if (n > 0) {
} else if (n > 0) {
res.v_str = stringsegment(v1->v_str,
v1->v_str->s_len - n,
v1->v_str->s_len - 1);
}
else {
} else {
res.v_str = stringsegment(v1->v_str,
v1->v_str->s_len - 1,
v1->v_str->s_len + n);
@@ -5889,6 +5887,28 @@ f_isatty(VALUE *vp)
}
static VALUE
f_inputlevel (void)
{
VALUE result;
result.v_type = V_NUM;
result.v_num = itoq((long) inputlevel());
return result;
}
static VALUE
f_calclevel (void)
{
VALUE result;
result.v_type = V_NUM;
result.v_num = itoq(calclevel());
return result;
}
static VALUE
f_access(int count, VALUE **vals)
{
@@ -6033,6 +6053,9 @@ f_system(VALUE *vp)
/*NOTREACHED*/
}
result.v_type = V_NUM;
if (conf->calc_debug & CALCDBG_SYSTEM) {
printf("%s\n", vp->v_str->s_str);
}
result.v_num = itoq((long) system(vp->v_str->s_str));
return result;
}
@@ -6811,6 +6834,8 @@ static CONST struct builtin builtins[] = {
"round value a to b number of binary places"},
{"btrunc", 1, 2, 0, OP_NOP, f_btrunc, 0,
"truncate a to b number of binary places"},
{"calclevel", 0, 0, 0, OP_NOP, 0, f_calclevel,
"current calculation level"},
{"ceil", 1, 1, 0, OP_NOP, 0, f_ceil,
"smallest integer greater than or equal to number"},
{"cfappr", 1, 3, 0, OP_NOP, f_cfappr, 0,
@@ -6973,6 +6998,8 @@ static CONST struct builtin builtins[] = {
"integral log of a number base 2"},
{"im", 1, 1, 0, OP_IM, 0, 0,
"imaginary part of complex number"},
{"inputlevel", 0, 0, 0, OP_NOP, 0, f_inputlevel,
"current input depth"},
{"insert", 2, IN, FA, OP_NOP, 0, f_listinsert,
"insert values c ... into list a at position b"},
{"int", 1, 1, 0, OP_INT, qint, 0,

View File

@@ -46,16 +46,21 @@ int
main(void)
{
#if defined(HAVE_NO_CONST)
printf("#undef HAVE_CONST /* no */\n");
printf("#undef CONST\n");
printf("#define CONST /* no */\n");
#else /* HAVE_NO_CONST */
const char * const str = "const";
printf("#define HAVE_CONST /* yes */\n");
printf("#undef CONST\n");
printf("#define CONST %s /* yes */\n", str);
#endif /* HAVE_NO_CONST */
/* exit(0); */
return 0;
}

60
have_getpgid.c Normal file
View File

@@ -0,0 +1,60 @@
/*
* have_getpgid - Determine if we getpgid()
*
* usage:
* have_getpgid
*
* Not all systems have the getpgid() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETPGID
* defined ==> use getpgid()
* undefined ==> do not or cannot call getpgid()
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{
#if defined(HAVE_NO_GETPGID)
printf("#undef HAVE_GETPGID /* no */\n");
#else /* HAVE_NO_GETPGID */
(void) getpgid((pid_t)0);
printf("#define HAVE_GETPGID /* yes */\n");
#endif /* HAVE_NO_GETPGID */
/* exit(0); */
return 0;
}

59
have_getprid.c Normal file
View File

@@ -0,0 +1,59 @@
/*
* have_getprid - Determine if we getprid()
*
* usage:
* have_getprid
*
* Not all systems have the getprid() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETPRID
* defined ==> use getprid()
* undefined ==> do not or cannot call getprid()
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{
#if defined(HAVE_NO_GETPRID)
printf("#undef HAVE_GETPRID /* no */\n");
#else /* HAVE_NO_GETPRID */
(void) getprid();
printf("#define HAVE_GETPRID /* yes */\n");
#endif /* HAVE_NO_GETPRID */
/* exit(0); */
return 0;
}

59
have_getsid.c Normal file
View File

@@ -0,0 +1,59 @@
/*
* have_getsid - Determine if we getsid()
*
* usage:
* have_getsid
*
* Not all systems have the getsid() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETSID
* defined ==> use getsid()
* undefined ==> do not call or cannot call getsid()
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <sys/types.h>
int
main(void)
{
#if defined(HAVE_NO_GETSID)
printf("#undef HAVE_GETSID /* no */\n");
#else /* HAVE_NO_GETSID */
(void) getsid((pid_t)0);
printf("#define HAVE_GETSID /* yes */\n");
#endif /* HAVE_NO_GETSID */
/* exit(0); */
return 0;
}

74
have_gettime.c Normal file
View File

@@ -0,0 +1,74 @@
/*
* have_gettime - Determine if we clock_gettime()
*
* usage:
* have_gettime
*
* Not all systems have the clock_gettime() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETTIME
* defined ==> use clock_gettime() for either CLOCK_SGI_CYCLE
* and/or CLOCK_REALTIME
* undefined ==> clock_gettime() is not available for both
* CLOCK_SGI_CYCLE and CLOCK_REALTIME
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <time.h>
int
main(void)
{
#if defined(HAVE_NO_GETTIME)
printf("#undef HAVE_GETTIME /* no */\n");
#else /* HAVE_NO_GETTIME */
# if defined(CLOCK_SGI_CYCLE)
struct timespec sgi_cycle; /* SGI hardware clock */
(void) clock_gettime(CLOCK_SGI_CYCLE, &sgi_cycle);
printf("#define HAVE_GETTIME /* yes - w/CLOCK_SGI_CYCLE */\n");
# elif defined(CLOCK_REALTIME)
struct timespec realtime; /* POSIX realtime clock */
(void) clock_gettime(CLOCK_REALTIME, &realtime);
printf("#define HAVE_GETTIME /* yes - CLOCK_REALTIME only */\n");
# else
printf("#undef HAVE_GETTIME /* no - no SGI_CYCLE and no REALTIME */\n");
# endif /* CLOCK_REALTIME */
#endif /* HAVE_NO_GETTIME */
/* exit(0); */
return 0;
}

View File

@@ -2,7 +2,7 @@
* have_memmv - Determine if we memmove()
*
* usage:
* have_newstr
* have_memmv
*
* Not all systems with memcpy() have memmove() functions, so this may not
* compile on your system.
@@ -48,12 +48,17 @@ int
main(void)
{
#if defined(HAVE_NO_MEMMOVE)
printf("#undef HAVE_MEMMOVE /* no */\n");
#else /* HAVE_NO_MEMMOVE */
(void) memmove(dest, src, MOVELEN);
printf("#define HAVE_MEMMOVE /* yes */\n");
#endif /* HAVE_NO_MEMMOVE */
/* exit(0); */
return 0;
}

View File

@@ -50,14 +50,19 @@ int
main(void)
{
#if defined(HAVE_NO_NEWSTR)
printf("#undef HAVE_NEWSTR /* no */\n");
#else /* HAVE_NO_NEWSTR */
(void) memcpy(dest, src, MOVELEN);
(void) memset(dest, 0, MOVELEN);
(void) strchr(src, 'e');
printf("#define HAVE_NEWSTR /* yes */\n");
#endif /* HAVE_NO_NEWSTR */
/* exit(0); */
return 0;
}

View File

@@ -51,15 +51,20 @@ int
main(void)
{
#if defined(HAVE_NO_UID_T)
printf("#undef HAVE_UID_T /* no */\n");
#else /* HAVE_NO_UID_T */
uid_t curds;
extern uid_t geteuid();
curds = geteuid();
printf("#define HAVE_UID_T /* yes */\n");
#endif /* HAVE_NO_UID_T */
/* exit(0); */
return 0;
}

65
have_ustat.c Normal file
View File

@@ -0,0 +1,65 @@
/*
* have_ustat - Determine if we ustat()
*
* usage:
* have_ustat
*
* Not all systems have the ustat() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_USTAT
* defined ==> use ustat()
* undefined ==> do not call or cannot call ustat()
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <ustat.h>
int
main(void)
{
#if defined(HAVE_NO_USTAT)
printf("#undef HAVE_USTAT /* no */\n");
#else /* HAVE_NO_USTAT */
struct stat stat_dot; /* stat of "." */
struct ustat ustat_dot; /* usage stat of "." */
(void) stat(".", &stat_dot);
(void) ustat(stat_dot.st_dev, &ustat_dot);
printf("#define HAVE_USTAT /* yes */\n");
#endif /* HAVE_NO_USTAT */
/* exit(0); */
return 0;
}

View File

@@ -57,11 +57,13 @@ try_this(char *fmt, ...)
va_list ap;
va_start(ap);
#if !defined(DONT_HAVE_VSPRINTF)
vsprintf(buf, fmt, ap);
#else
sprintf(buf, fmt, ap);
#endif
va_end(ap);
}

3
help.c
View File

@@ -121,9 +121,8 @@ givehelp(char *type)
"else %s no such help, try: help help;fi",
HELPDIR, type, pager, HELPDIR, type,
CUSTOMHELPDIR, type, pager, CUSTOMHELPDIR, type, ECHO);
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_SYSTEM) {
printf("%s\n", helpcmd);
sleep(3);
}
/* execute the help command */

View File

@@ -74,7 +74,7 @@ STD_HELP_FILES_12= archive
BLT_HELP_FILES_13= bugs changes
STD_HELP_FILES_14= contrib credit todo
STD_HELP_FILES_14= contrib credit wishlist todo
# These files are used in the following order to construct full
#
@@ -105,29 +105,30 @@ BLT_HELP_FILES= ${BLT_HELP_FILES_3} ${BLT_HELP_FILES_5} \
# This list is prodiced by the detaillist rule when no WARNINGS are detected.
#
DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \
appr arg arrow asec asech asin asinh assign atan atan2 atanh avg base \
bit blk blkcpy blkfree blocks bround btrunc ceil cfappr cfsim char \
cmdbuf cmp comb conj cos cosh cot coth count cp csc csch ctime delete \
den dereference det digit digits dp epsilon errcount errmax errno \
error eval exp fact factor fclose fcnt feof ferror fflush fgetc \
fgetfield fgetline fgets fgetstr fib files floor fopen forall fprintf \
fputc fputs fputstr frac free freeglobals freeredc freestatics frem \
freopen fscan fscanf fseek fsize ftell gcd gcdrem gd getenv hash head \
highbit hmean hnrmod hypot ilog ilog10 ilog2 im insert int inverse \
iroot isassoc isatty isblk isconfig isdefined iserror iseven isfile \
ishash isident isint islist ismat ismult isnull isnum isobj isobjtype \
isodd isprime isptr isqrt isrand israndom isreal isrel issimple issq \
isstr istype jacobi join lcm lcmfact lfactor ln lowbit ltol makelist \
matdim matfill matmax matmin matsum mattrace mattrans max md5 memsize \
meq min minv mmin mne mod modify name near newerror nextcand \
nextprime norm null num oldvalue ord param perm pfact pi pix places \
pmod polar poly pop popcnt power prevcand prevprime printf prompt \
protect ptest push putenv quo quomod rand randbit random randombit \
randperm rcin rcmul rcout rcpow rcsq re remove reverse rewind rm root \
round rsearch runtime saveval scale scan scanf search sec sech seed \
segment select sgn sha sha1 sin sinh size sizeof sort sqrt srand \
srandom ssq str strcat strerror strlen strpos strprintf strscan \
strscanf substr sum swap system tail tan tanh test time trunc xor
appr arg arrow asec asech asin asinh assign atan atan2 atanh avg \
base bit blk blkcpy blkfree blocks bround btrunc calclevel ceil \
cfappr cfsim char cmdbuf cmp comb conj cos cosh cot coth count cp \
csc csch ctime delete den dereference det digit digits dp epsilon \
errcount errmax errno error eval exp fact factor fclose fcnt feof \
ferror fflush fgetc fgetfield fgetline fgets fgetstr fib files \
floor fopen forall fprintf fputc fputs fputstr frac free freeglobals \
freeredc freestatics frem freopen fscan fscanf fseek fsize ftell gcd \
gcdrem gd getenv hash head highbit hmean hnrmod hypot ilog ilog10 \
ilog2 im inputlevel insert int inverse iroot isassoc isatty isblk \
isconfig isdefined iserror iseven isfile ishash isident isint islist \
ismat ismult isnull isnum isobj isobjtype isodd isprime isptr isqrt \
isrand israndom isreal isrel issimple issq isstr istype jacobi join \
lcm lcmfact lfactor ln lowbit ltol makelist matdim matfill matmax \
matmin matsum mattrace mattrans max md5 memsize meq min minv mmin \
mne mod modify name near newerror nextcand nextprime norm null \
num oldvalue ord param perm pfact pi pix places pmod polar poly \
pop popcnt power prevcand prevprime printf prompt protect ptest \
push putenv quo quomod rand randbit random randombit randperm rcin \
rcmul rcout rcpow rcsq re remove reverse rewind rm root round rsearch \
runtime saveval scale scan scanf search sec sech seed segment select \
sgn sha sha1 sin sinh size sizeof sort sqrt srand srandom ssq str \
strcat strerror strlen strpos strprintf strscan strscanf substr \
sum swap system tail tan tanh test time trunc xor
# This list is of files that are clones of DETAIL_HELP files. They are
# built from DETAIL_HELP files.
@@ -258,7 +259,7 @@ calc: usage
custom_cal: ../custom/CUSTOM_CAL
rm -f $@
cp usage $@
cp ../custom/CUSTOM_CAL $@
chmod 0444 $@
-@if [ -z "${Q}" ]; then \
echo ''; \
@@ -270,7 +271,7 @@ custom_cal: ../custom/CUSTOM_CAL
new_custom: ../custom/HOW_TO_ADD
rm -f $@
cp usage $@
cp ../custom/HOW_TO_ADD $@
chmod 0444 $@
-@if [ -z "${Q}" ]; then \
echo ''; \
@@ -282,7 +283,7 @@ new_custom: ../custom/HOW_TO_ADD
copy: blkcpy
rm -f $@
cp usage $@
cp blkcpy $@
chmod 0444 $@
-@if [ -z "${Q}" ]; then \
echo ''; \
@@ -416,8 +417,8 @@ bsdi: all
detaillist:
${Q}-(echo "xxxxx"; \
for i in ${DETAIL_HELP}; do \
if [ ! -f SCCS/s.$$i ]; then \
echo "WARNING: $$i not under SCCS control" 1>&2; \
if [ ! -f RCS/$$i,v ]; then \
echo "WARNING: $$i not under RCS control" 1>&2; \
else \
echo $$i; \
fi; \

View File

@@ -1,31 +1,16 @@
Where to get the the latest versions of calc
Landon Noll maintains the official calc ftp archive at:
Landon Noll maintains the official calc home page at:
ftp://ftp.uu.net/pub/calc
Alpha test versions, complete with bugs, untested code and
experimental features may be fetched (if you are brave) under:
http://reality.sgi.com/chongo/calc/
One may join the calc testing group by sending a request to:
calc-tester-request@postofc.corp.sgi.com
Your message body (not the subject) should consist of:
subscribe calc-tester address
end
name your_full_name
where "address" is your EMail address and "your_full_name"
is your full name.
http://reality.sgi.com/chongo/tech/comp/calc/
See:
http://prime.corp.sgi.com/csp/ioccc/noll/noll.html#calc
http://reality.sgi.com/chongo/tech/comp/calc/calc-download.html
for details.
for information on how to obtain up a recent version of calc.
Landon Curt Noll <chongo@toad.com> /\oo/\
Landon Curt Noll
http://reality.sgi.com/chongo
chongo <was here> /\../\

35
help/calclevel Normal file
View File

@@ -0,0 +1,35 @@
NAME
calclevel - current calculation level
SYNOPSIS
calclevel()
TYPES
return nonnegative integer
DESCRIPTION
This function returns the calculation level at which it is called.
When a command is being read from a terminal or from a file,
calc is at calculation level zero. The level is increased
by 1 each time calculation starts of a user-defined function
or of eval(S) for some expression S which evaluates to a string. It
decreases to zero if an error occurs or a quit or abort statement
is executed. Otherwise, it decreases by 1 when the calculation
is completed. Except when an error occurs or abort is executed,
the input level is not affected by changes in the calculation level.
Zero calculation level is also called top calculation level; greater
values of calclevel() indicate calculation is occurring at greater
depths.
EXAMPLE
n/a
LIMITS
none
LIBRARY
none
SEE ALSO
eval, read, quit, abort, inputlevel

View File

@@ -14,12 +14,10 @@ Command sequence
described in the next section.
NOTE: Calc commands are in lower case. UPPER case is used below
for emphasis only, and should be considered in lower case.
DEFINE function(params) { body }
DEFINE function(params) = expression
define a function
-----------------
define function(params) { body }
define function(params) = expression
This first form defines a full function which can consist
of declarations followed by many statements which implement
the function.
@@ -30,13 +28,22 @@ Command sequence
and question mark operators can be useful. Examples of
simple functions are:
define sumcubes(a, b) = a^3 + b^3;
define pimod(a) = a % pi();
define sumcubes(a, b) = a^3 + b^3
define pimod(a) = a % pi()
define printnum(a, n, p)
{
if (p == 0) {
print a: "^": n, "=", a^n;
} else {
print a: "^": n, "mod", p, "=", pmod(a,n,p);
}
}
HELP
This displays a general help message.
READ filename
read calc commands
------------------
read filename
read -once filename
This reads definitions from the specified filename.
The name can be quoted if desired. The calculator
uses the CALCPATH environment variable to search
@@ -52,14 +59,11 @@ Command sequence
evaluate or functions to define, just like at the top
level command level.
If the -m mode disallows opening of files for reading,
this command will be disabled.
When -once is given, the read command acts like the regular
read expect that it will ignore filename if is has been
previously read.
READ -once filename
This command acts like the regular READ expect that it
will ignore filename if is has been previously read.
This command is particularly useful in a library that
The read -once form is particularly useful in a library that
needs to read a 2nd library. By using the READ -once
command, one will not reread that 2nd library, nor will
once risk entering into a infinite READ loop (where
@@ -69,7 +73,10 @@ Command sequence
If the -m mode disallows opening of files for reading,
this command will be disabled.
WRITE filename
write calc commands
-------------------
write filename
This writes the values of all global variables to the
specified filename, in such a way that the file can be
later read in order to recreate the variable values.
@@ -81,19 +88,221 @@ Command sequence
If the -m mode disallows opening of files for writing,
this command will be disabled.
QUIT
This leaves the calculator, when given as a top-level
command.
CD
Change the current directory to the home directory, if $HOME
quit or exit
------------
quit
quit string
exit
exit string
The action of these commands depends on where they are used.
At the interactive level, they will cause calc it edit.
This is the normal way to leave the calculator. In any
other use, they will stop the current calculation as if
an error had occurred.
If a string is given, then the string is printed as the reason
for quitting, otherwise a general quit message is printed.
The routine name and line number which executed the quit is
also printed in either case.
Exit is an alias for quit.
Quit is useful when a routine detects invalid arguments,
in order to stop a calculation cleanly. For example,
for a square root routine, an error can be given if the
supplied parameter was a negative number, as in:
define mysqrt(n)
{
if (! isnum(n))
quit "non-numeric argument";
if (n < 0)
quit "Negative argument";
return sqrt(n);
}
See 'more information about abort and quit' below for
more information.
abort
-----
abort
abort string
This command behaves like QUIT except that it will attempt
to return to the interactive level if permitted, otherwise
calc exit.
See 'more information about abort and quit' below for
more information.
change current directory
------------------------
cd
cd dir
Change the current directory to 'dir'. If 'dir' is ommitted,
change the current directory to the home directory, if $HOME
is set in the environment.
CD dir
Change the current directory to dir.
show information
----------------
show item
This command displays some information where 'item' is
one of the following:
blocks unfreed named blocks
builtin built in functions
config config parameters and values
constants cache of numeric constants
custom custom functions if calc -C was used
errors new error-values created
files open files, file position and sizes
function user-defined functions
globaltypes global variables
objfunctions possible object functions
objtypes defined objects
opcodes func internal opcodes for function `func'
sizes size in octets of calc value types
realglobals numeric global variables
statics unscoped static variables
numbers calc number cache
redcdata REDC data defined
strings calc string cache
literals calc literal cache
Only the first 4 characters of item are examined, so:
show globals
show global
show glob
do the same thing.
calc help
---------
help
help name
This displays a help related to 'name' or general
help of none is given.
=-=
more information about abort and quit
=====================================
Consider the following calc file called myfile.cal:
print "start of myfile.cal";
define q() {quit "quit from q()"; print "end of q()"}
define a() {abort "abort from a()"}
x = 3;
{print "start #1"; if (x > 1) q()} print "after #1";
{print "start #2"; if (x > 1) a()} print "after #2";
{print "start #3"; if (x > 1) quit "quit from 3rd statement"}
print "end of myfile.cal";
The command:
calc read myfile
will produce:
q() defined
a() defined
start statment #1
quit from q()
after statment #1
start statment #2
abort from a()
The QUIT within the q() function prevented the ``end of q()''
statement from being evaluated. This QUIT command caused
control to be returned to just after the place where q()
was called.
Notice that unlike QUIT, the ABORT inside function a() halts
the processing of statements from the input source (myfile.cal).
Because calc was not interactive, ABORT causes calc to exit.
The command:
calc -i read myfile
will produce:
q() defined
a() defined
start statment #1
quit from q()
after statment #1
start statment #2
abort from a()
> <==== calc interactive prompt
because the '-i' calc causes ABORT to drop into an
interactive prompt. However typing a QUIT or ABORT
at the interactive prompt level will always calc to exit,
even when calc is invoked with '-i'.
Also observe that both of these commands:
cat myfile.cal | calc
cat myfile.cal | calc -i
will produce:
q() defined
a() defined
start statment #1
quit from q()
after statment #1
start statment #2
abort from a()
The ABORT inside function a() halts the processing of statements
from the input source (standard input). Because standard input
is not a terminal, using '-i' does not force it to drop into
an interactive prompt.
If one were to type in the contents of myfile.cal interactively,
calc will produce:
> print "start of myfile.cal";
start of myfile.cal
> define q() {quit "quit from q()"; print "end of q()"}
q() defined
> define a() {abort "abort from a()"}
a() defined
> x = 3;
> {print "start #1"; if (x > 1) q()} print "after #1";
start statment #1
quit from q()
after statment #1
> {print "start #2"; if (x > 1) a()} print "after #2";
start statment #2
abort from a()
> {print "start #3"; if (x > 1) quit "quit from 3rd statement"}
start #3
quit from 3rd statement
The ABORT from within the a() function returned control to
the interactive level.
The QUIT (after the if (x > 1) ...) will cause calc to exit
because it was given at the interactive prompt level.
=-=
Also see the help topic:
statement flow control and declaration statements
usage for -m modes
usage how to invoke the calc command and calc -options

View File

@@ -40,9 +40,10 @@ Configuration parameters
"blkverbose" TRUE=>print all lines, FALSE=>skip duplicates
"blkbase" block output base
"blkfmt" block output format
"lib_debug" calc library script debug level
"calc_debug" internal calc debug level
"user_debug" user defined debug level
"lib_debug" controls library script debug information
"calc_debug" controls internal calc debug information
"user_debug" for user defined debug information
"verbose_quit" TRUE=>print message on empty quit or abort
The "all" config value allows one to save/restore the configuration
@@ -78,7 +79,8 @@ Configuration parameters
The "newstd" is not backward compatible with the historic
configuration. Even so, some people prefer this configuration
and place the config("all", "newstd") command in their CALCRC
startup files.
startup files; newstd may also be established by invoking calc
with the flag -n.
When nonzero, the "trace" parameter activates one or more features
that may be useful for debugging. These features correspond to
@@ -103,9 +105,12 @@ Configuration parameters
the decimal point to be printed in real or exponential mode in
normal unformatted printing (print, strprint, fprint) or in
formatted printing (printf, strprintf, fprintf) when precision is not
specified. The initial value is 20. This parameter does not change
the stored value of a number. Where rounding is necessary, the type
of rounding to be used is controlled by "outround".
specified. The initial value for oldstd is 20, for newstd 10.
The parameter may be changed to the value d by either
config("display", d) or by display (d). This parameter does not change
the stored value of a number. Where rounding is necessary to
display up to d decimal places, the type of rounding to be used is
controlled by config("outround").
The "epsilon" parameter specifies the default accuracy for the
calculation of functions for which exact values are not possible or
@@ -118,9 +123,10 @@ Configuration parameters
absolute value of the remainder usually does not exceed epsilon/2.
Functions which require an epsilon value accept an
optional argument which overrides this default epsilon value for
that single call. (The value v can be assigned to the "epsilon"
parameter by epsilon(v) as well as by config("epsilon", v), and the
current value obtained by epsilon() as well as by config("epsilon").)
that single call. The value v can be assigned to the "epsilon"
parameter by either config("epsilon", v) or epsilon(v); each of
these functions return the current epsilon value; config("epsilon")
or epsilon() returns but does not change the epsilon value.
For the transcendental functions and the functions sqrt() and
appr(), the calculated value is always a multiple of epsilon.
@@ -311,67 +317,72 @@ Configuration parameters
The default "blkfmt" is "hd".
With regards to "lib_debug", "calc_debug" and "user_debug":
higher absolute values result in more detailed debugging and
more verbose debug messages. The default value is 0 in which
a very amount of debugging will be performed with nil messages.
The -1 value is reserved for no debugging or messages. Any
value <-1 will perform debugging silently (presumably collecting
data to be displayed at a later time). Values >0 result in a
greater degree of debugging and more verbose messages.
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:
The "lib_debug" is reserved by convention for calc library scripts.
This config parameter takes the place of the lib_debug global variable.
By convention, "lib_debug" has the following meanings:
n Meaning of bit n of config("lib_debug")
<-1 no debug messages are printed though some internal
debug actions and information may be collected
0 When a function is defined, redefined or undefined at
interactive level, a message saying what has been done
is displayed.
-1 no debug messages are printed, no debug actions will be taken
1 When a function is defined, redefined or undefined during
the reading of a file, a message saying what has been done
is displayed.
0 only usage message regarding each important object are
printed at the time of the read (default)
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.
>0 messages regarding each important object are
printed at the time of the read in addition
to other debug messages
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
will make sense only to calc wizards. Zero value (the default for
both oldstd and newstd) of config("lib_calc") corresponds to switching
off all these routines. For nonzero value, particular bits
currently have the following meanings:
The "calc_debug" is reserved by convention for internal calc routines.
The output of "calc_debug" will change from release to release.
Generally this value is used by calc wizards and by the regress.cal
routine (make check). By convention, "calc_debug" has the following
meanings:
n Meaning of bit n of config("calc_debug")
<-1 reserved for future use
0 outputs shell commands prior to execution
-1 no debug messages are printed, no debug actions will be taken
1 outputs currently active functions when a quit instruction
is executed
0 very little, if any debugging is performed (and then mostly
in alpha test code). The only output is as a result of
internal fatal errors (typically either math_error() or
exit() will be called). (default)
2 some details of shs, shs1 and md5 hash states are included
in the output when these are printed
>0 a greater degree of debugging is performed and more
verbose messages are printed (regress.cal uses 1).
3 when a function constructs a block value, tests are
made that the result has the properties required for use of
that block, e.g. that the pointer to the start of the
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.
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").
No calc code or shipped library will change this value other than
during startup or during a config("all", xyz) call.
No calc code or shipped library should change this value. Users
should feel free to use it in any way. In particular they may
use particular bits for special purposes as with "calc_debug", or
they may use it to indicate a debug level with larger values
indicating more stringent and more informative tests with presumably
slower operation or more memory usage, and a particular value (like
-1 or 0) corresponding to "no tests".
The following is suggested as a convention for use of "user_debug".
These are only suggestions: feel free to use it as you like:
The "verbose_quit" controls the print of the message:
<-1 no debug messages are printed though some internal
debug actions and information may be collected
Quit or abort executed
-1 no debug messages are printed, no debug actions will be taken
0 very little, if any debugging is performed. The only output
are from fatal errors. (default)
>0 a greater degree of debugging is performed and more
verbose messages are printed
when a non-interactive quit or abort without an argument is encounted.
A quit of abort without an argument does not display a message when
invoked at the interactive level.
The following are synonyms for true:

View File

@@ -5,30 +5,27 @@ We welcome and encourage you to send us:
* custom functions that you have modified or written
* any other source code modifications
Prior to doing so, you should consider trying your changes on the most
recent alpha test code. To obtain the most recent code, look under
Prior to doing so, you should consider applying your changes to the most
recent version of calc.
http://reality.sgi.com/chongo/calc/
Landon Noll maintains the official calc home page at:
You should also consider joining the calc testing group by sending a
request to:
http://reality.sgi.com/chongo/tech/comp/calc/
calc-tester-request@postofc.corp.sgi.com
See:
Your message body (not the subject) should consist of:
http://reality.sgi.com/chongo/tech/comp/calc/calc-download.html
subscribe calc-tester address
end
name your_full_name
for information on how to obtain up a recent version of calc.
where "address" is your EMail address and "your_full_name"
is your full name.
=-=
In order to consider integrating your code, we need:
* help files (documentation)
* CHANGES text (brief description of what it does)
* regress.cal test (to test non-custom code)
* the calc version you are working with (use the latest calc, see above)
* new help files or help file patches, if applicable (documentation)
* proposed text for the CHANGES file (brief description of what it does)
* regress.cal test patch, if applicable
* your source code and/or source code changes (:-))
The best way to send us new code, if your changes are small, is
@@ -45,4 +42,22 @@ Thanks for considering submitting code to calc. Calc is a collective
work by a number of people. It would not be what it is today without
your efforts and submissions!
Landon Curt Noll <chongo@toad.com> /\oo/\
=-=
One may join the calc testing group by sending a request to:
calc-tester-request@postofc.corp.sgi.com
Your message body (not the subject) should consist of:
subscribe calc-tester address
end
name your_full_name
where "address" is your EMail address and "your_full_name"
is your full name.
Landon Curt Noll
http://reality.sgi.com/chongo
chongo <was here> /\../\

View File

@@ -22,41 +22,10 @@ Credits
Most of this source and binary has one of the following copyrights:
Copyright (c) 19xx David I. Bell
Copyright (c) 19xx David I. Bell and Landon Curt Noll
Copyright (c) 19xx Landon Curt Noll
Copyright (c) 19xx Ernest Bowen and Landon Curt Noll
Copyright (c) year David I. Bell
Copyright (c) year David I. Bell and Landon Curt Noll
Copyright (c) year Landon Curt Noll
Copyright (c) year Ernest Bowen and Landon Curt Noll
Permission is granted to use, distribute, or modify this source,
provided that this copyright notice remains intact.
Send calc comments, suggestions, bug fixes, enhancements and
interesting calc scripts that you would like you see included in
future distributions to:
dbell@auug.org.au
chongo@toad.com
Landon Noll maintains the official calc ftp archive at:
ftp://ftp.uu.net/pub/calc
Alpha test versions, complete with bugs, untested code and
experimental features may be fetched (if you are brave) under:
http://reality.sgi.com/chongo/calc/
One may join the calc testing group by sending a request to:
calc-tester-request@postofc.corp.sgi.com
Your message body (not the subject) should consist of:
subscribe calc-tester address
end
name your_full_name
where "address" is your EMail address and "your_full_name"
is your full name.
Enjoy!

View File

@@ -1,5 +1,5 @@
NAME
hash - hash value
hash - FNV-1 hash value
SYNOPSIS
hash(x_1 [, x_2, x_3, ...])
@@ -12,10 +12,32 @@ TYPES
DESCRIPTION
Returns a hash value for one or more values of arbitrary types.
The basis of this hash algorithm was taken from an idea sent
as reviewer comments to the IEEE POSIX P1003.2 committee by:
Phong Vo (http://www.research.att.com/info/kpv)
Glenn Fowler (http://www.research.att.com/~gsf/)
In a subsequent ballot round:
Landon Curt Noll (http://reality.sgi.com/chongo)
improved on their algorithm. Some people tried this hash
and found that it worked rather well. In an EMail message
to Landon, they named it ``Fowler/Noll/Vo'' or the FNV hash.
FNV hashes are architected to be fast while maintaining a low
collision rate. The FNV speed allows one to quickly hash lots
of data while maintaining a reasonable collision rate. See:
http://reality.sgi.com/chongo/tech/comp/fnv/
for more details as well as other forms of the FNV hash.
EXAMPLE
> a = isqrt(2e1000); s = "xyz";
> hash(a,s)
870000771
2378490456
LIMITS
The number of arguments is not to exceed 100.
@@ -24,3 +46,4 @@ LIBRARY
none
SEE ALSO
sha, sha1, md5

View File

@@ -42,7 +42,8 @@ following topics:
changes recent changes to calc
contrib how to contribute scripts, code or custom functions
credit who wrote calc and who helped
todo needed enhancements and wish list
todo list of priority action items for calc
wishlist wish list of future enhancements of calc
full all of the above (in the above order)

36
help/inputlevel Normal file
View File

@@ -0,0 +1,36 @@
NAME
inputlevel - current input level
SYNOPSIS
inputlevel()
TYPES
return nonnegative integer
DESCRIPTION
This function returns the input level at which it is called.
When calc starts, it is at level zero. The level is increased
by 1 each time execution starts of a read file command or a call to
eval(S) for some expression S which evaluates to a string. It
decreases by 1 when a file being read reaches EOF or a string
being eval-ed reaches '\0', or earlier if a quit statement is
encountered at top calculation-level in the flle or string. It
decreases to zero if an abort statement is encountered at any
function-level in the file or string. If a quit or abort
statement is encountered at top calculation-level at top input-level,
calc is exited.
Zero input level is also called top input level; greater values
of inputlevel() indicate reading at greater depths.
EXAMPLE
n/a
LIMITS
none
LIBRARY
none
SEE ALSO
read, eval, quit, abort, calclevel

View File

@@ -71,6 +71,10 @@
help stdlib
To learn how to invoke the calc command and about calc -flags, try:
help usage
A full and extensive overview of calc may be obtained by:
help full
@@ -160,5 +164,3 @@
These can contain both functions to be defined, and expressions
to be calculated. Global variables which are numbers can be
saved to a file by using the 'write filename' command.
XXX - update this file and add in new major features

View File

@@ -10,28 +10,38 @@ Statements
expressions are optional and may be omitted (as in RETURN).
NOTE: Calc commands are in lower case. UPPER case is used below
for emphasis only, and should be considered in lower case.
IF (expr) statement
IF (expr) statement ELSE statement
FOR (optionalexpr ; optionalexpr ; optionalexpr) statement
WHILE (expr) statement
DO statement WHILE (expr)
CONTINUE
BREAK
GOTO label
C-like statements
-----------------
{ statement }
{ statement; ... statement }
if (expr) statement
if (expr) statement ELSE statement
for (optionalexpr ; optionalexpr ; optionalexpr) statement
while (expr) statement
do statement while (expr)
continue
break
goto label
These all work like in normal C.
RETURN optionalexpr
See 'help expression' for details on expressions.
See 'help builtin' for details on calc builtin functions.
return
------
return optionalexpr
return ( optionalexpr )
This returns a value from a function. Functions always
have a return value, even if this statement is not used.
If no return statement is executed, or if no expression
is specified in the return statement, then the return
value from the function is the null type.
SWITCH (expr) { caseclauses }
switch
------
switch (expr) { caseclauses }
Switch statements work similarly to C, except for the
following. A switch can be done on any type of value,
and the case statements can be of any type of values.
@@ -42,17 +52,12 @@ Statements
is the exception, and only matches once all other cases
have been tested.
{ statements }
This is a normal list of statements, each one ended by
a semicolon. Unlike the C language, no declarations are
permitted within an inner-level compound statement.
Declarations are only permitted at the beginning of a
function definition, or at the beginning of an expression
sequence.
MAT variable [dimension] [dimension] ...
MAT variable [dimension, dimension, ...]
MAT variable [] = { value, ... }
matrix
------
mat variable [dimension] [dimension] ...
mat variable [dimension, dimension, ...]
mat variable [] = { value, ... }
This creates a matrix variable with the specified dimensions.
Matrices can have from 1 to 4 dimensions. When specifying
multiple dimensions, you can use either the standard C syntax,
@@ -119,8 +124,11 @@ Statements
local mat temp[5];
static mat strtable[] = {"hi", "there", "folks");
OBJ type { elementnames } optionalvariables
OBJ type variable
object
------
obj type { elementnames } optionalvariables
obj type variable
These create a new object type, or create one or more
variables of the specified type. For this calculator,
an object is just a structure which is implicitly acted
@@ -183,33 +191,12 @@ Statements
static obj point temp2 = {4, 3};
global obj point p1, p2, p3;
EXIT string
QUIT string
This command is used in two cases. At the top command
line level, quit will exit from the calculator. This
is the normal way to leave the calculator. In any other
use, quit will abort the current calculation as if an
error had occurred. If a string is given, then the string
is printed as the reason for quitting, otherwise a general
quit message is printed. The routine name and line number
which executed the quit is also printed in either case.
Quit is useful when a routine detects invalid arguments,
in order to stop a calculation cleanly. For example,
for a square root routine, an error can be given if the
supplied parameter was a negative number, as in:
define mysqrt(n)
{
if (n < 0)
quit "Negative argument";
...
}
Exit is an alias for quit.
PRINT exprs
print expressions
-----------------
print expr
print expr, ... expr
print expr: ... expr
For interactive expression evaluation, the values of all
typed-in expressions are automatically displayed to the
user. However, within a function or loop, the printing of
@@ -228,8 +215,8 @@ Statements
expression unless the statement ends with a colon. As
examples:
print 3, 4; prints "3 4" and newline.
print 5:; prints "5" with no newline.
print 3, 4; prints "3 4" and newline.
print 5:; prints "5" with no newline.
print 'a' : 'b' , 'c'; prints "ab c" and newline.
print; prints a newline.
@@ -247,25 +234,9 @@ Statements
prints the name of the file that was opened.
SHOW item
This command displays some information.
builtin built in functions
global global variables
function user-defined functions
objfunc possible object functions
config config parameters and values
objtype defined objects
Only the first 4 characters of item are examined, so:
show globals
show global
show glob
do the same thing.
Also see the help topic:
command top level commands
expression calc expression syntax
builtin calc builtin functions
usage how to invoke the calc command and calc -options

260
help/todo
View File

@@ -1,183 +1,96 @@
Needed enhancements
Calc Todo Items:
Send calc comments, suggestions, bug fixes, enhancements and
interesting calc scripts that you would like you see included in
future distributions to:
The following items should be addressed sometime in the short to
medium term future, if not before the next release.
dbell@auug.org.au
chongo@toad.com
Code contributions are welcome. Send patches to:
The following items are in the calc wish list. Programs like this
can be extended and improved forever.
calc-tester@postofc.corp.sgi.com
* In general use faster algorithms for large numbers when they
become known. In particular, look at better algorithms for
very large numbers -- multiply, square and mod in particular.
See also the 'wishlist' help files for the calc enhancement wish list.
* Implement an autoload feature. Associate a calc library filename
with a function or global variable. On the first reference of
such item, perform an automatic load of that file.
=-=
* Add error handling statements, so that QUITs, errors from the
'eval' function, division by zeroes, and so on can be caught.
This should be done using syntax similar to:
Very High priority items:
ONERROR statement DO statement;
* Write the help file for the display() builtin function.
Something like signal isn't versatile enough.
* Write the help file for the stoponerror() builtin function.
* Add a debugging capability so that functions can be single stepped,
breakpoints inserted, variables displayed, and so on.
* Update the errmax about the meaning of errmax(-1).
* Figure out how to write all variables out to a file, including
deeply nested arrays, lists, and objects.
* Review and if needed, correct/update the help topics:
Add the ability to read and write a value in some binary form.
Clearly this is easy for non-neg integers. The question of
everything else is worth pondering.
topic description
----- -----------
intro introduction to calc
overview overview of calc
assoc using associations
command top level commands
config configuration parameters
define how to define functions
environment how environment variables effect calc
errorcodes calc generated error codes
expression expression sequences
file using files
history command history
interrupt how interrupts are handled
list using lists
mat using matrices
obj user defined data types
operator math, relational, logic and variable access ...
statement flow control and declaration statements
types builtin data types
unexpected unexpected syntax/usage surprises for C ...
variable variables and variable declarations
libcalc using the arbitrary precision routines in ...
bugs known bugs and mis-features
wishlist wish list of future enhancements of calc
* Eliminate the need for the define keyword by doing smarter parsing.
* Fix any 'Known bugs' as noted in the BUGS file or as
displayed by 'calc help bugs'.
* Allow results of a command (or all commands) to be re-directed to a
file or piped into a command.
=-=
* Add some kind of #include and #define facility. Perhaps use
the C pre-processor itself?
High priority items:
* Support a more general input and output base mode other than
just dec, hex or octal.
* Verify, complete or fix the 'SEE ALSO' help file sections.
* Implement a form of symbolic algebra. Work on this has already
begun. This will use backquotes to define expressions, and new
functions will be able to act on expressions. For example:
* Verify, complete or fix the 'LIBRARY' help file sections.
x = `hello * strlen(mom)`;
x = sub(x, `hello`, `hello + 1`);
x = sub(x, `hello`, 10, `mom`, "curds");
eval(x);
* Verify, complete or fix the 'LIMITS' help file sections.
prints 55.
* Verify, complete or fix the 'SYNOPSIS' and 'TYPES' help file sections.
* Place the results of previous commands into a parallel history list.
Add a binding that returns the saved result of the command so
that one does not need to re-execute a previous command simply
to obtain its value.
* Where reasonable, be sure that regress.cal tests builtin functions.
If you have a command that takes a very long time to execute,
it would be nice if you could get at its result without having
to spend the time to reexecute it.
* Perform a code coverage analysis of the 'make check' action
and improve the coverage (within reason) of the regress.cal suite.
* Add a binding to delete a value from the history list.
* Create a Linux rpm (Red Hat Package Manager) package for calc.
One may need to remove a large value from the history list if
it is very large. Deleting the value would replace the history
entry with a null value.
* Address, if possible and reasonable, any Calc Mis-features
as noted in the BUGS file or as displayed by 'calc help bugs'.
* Add a binding to delete a command from the history list.
* The shell script that is currently constructed to display a help
file (in help.c) is a gross hack. That code should be replaced
with code that looks for the help file in the pre-defined help
directories. When the specific help file is found and opened,
then a $PAGER should be forked and execed after doing things such
as closing open file descriptors that the $PAGER does not need.
Since you can delete values, you might as well be able to
delete commands.
* Inspect changes made since the last major calc release (the
initial x.y.z version ... prior to any t sub-version) to help
ensure that they have not introduced new or re-introduced old bugs
into calc.
* All one to alter the size of the history list thru config().
* Consider using configure to build the calc Makefile.
In some cases, 256 values is too small, in others it is too large.
=-=
* Add a builtin that returns a value from the history list.
As an example:
Medium priority items:
histval(-10)
returns the 10th value on the history value list, if such
a value is in the history list (null otherwise). And:
histval(23)
return the value of the 23rd command given to calc, if
such a value is in the history list (null otherwise).
It would be very helpful to use the history values in
subsequent equations.
* Add a builtin that returns command as a string from the
history list. As an example:
history(-10)
returns a string containing the 10th command on the
history list, if a such a value is in the history list
(empty string otherwise). And:
history(23)
return the string containing the 23rd command given to calc, if
such a value is in the history list (empty string otherwise).
One could use the eval() function to re-evaluate the command.
* Allow one to optionally restore the command number to calc
prompts. When going back in the history list, indicate the
command number that is being examined.
The command number was a useful item. When one is scanning the
history list, knowing where you are is hard without it. It can
get confusing when the history list wraps or when you use
search bindings. Command numbers would be useful in
conjunction with positive args for the history() and histval()
functions as suggested above.
* Add a builtin that returns the current command number.
For example:
cmdnum()
returns the current command number.
This would allow one to tag a value in the history list. One
could save the result of cmdnum() in a variable and later use
it as an arg to the histval() or history() functions.
* Add a factoring builtin functions. Provide functions that perform
multiple polynomial quadratic sieves, elliptic curve, difference
of two squares, N-1 factoring as so on. Provide a easy general
factoring builtin (say factor(foo)) that would attempt to apply
whatever process was needed based on the value.
Factoring builtins would return a matrix of factors.
It would be handy to configure, via config(), the maximum time
that one should try to factor a number. By default the time
should be infinite. If one set the time limit to a finite
value and the time limit was exceeded, the factoring builtin
would return whatever if had found thus far, even if no new
factors had been found.
Another factoring configuration interface, via config(), that
is needed would be to direct the factoring builtins to return
as soon as a factor was found.
* Allow one to config calc break up long output lines.
The command: calc '2^100000' will produce one very long
line. Many times this is reasonable. Long output lines
are a problem for some utilities. It would be nice if one
could configure, via config(), calc to fold long lines.
By default, calc should continue to produce long lines.
One option to config should be to specify the length to
fold output. Another option should be to append a trailing
\ on folded lines (as some symbolic packages use).
* Allow one to use the READ and WRITE commands inside a function.
* Remove or increase limits on factor(), lfactor(), isprime(),
nextprime(), and prevprime(). Currently these functions cannot
search for factors > 2^32.
* Add read -once -try "filename" which would do nothing
if "filename" was not a readable file.
* Complete the use of CONST where appropirate:
* Complete the use of CONST where appropriate:
CONST is beginning to be used with read-only tables and some
function arguments. This allows certain compilers to better
@@ -196,48 +109,13 @@ Needed enhancements
at by 'fizbin' and the HALF array pointer at by 'data' should be
treated as read-only.
* Blocks should have the following features:
+ read/write to/from files (ala fread/fwrite)
+ misc memory functions (ala memcpy, memcmp, memset,
memchr, etc.)
+ scatter and gather functions (to send every n-th octet
to another block and to copy from n blocks, the 1st
then 2nd then 3rd ... octets)
* Printing of blocks should be under the control of the
config() interface. This should allow one to select
from any of the following formats:
+ as one long string
+ as a series of lines (< 80 chars wide)
+ in od command style (offset: value value value ...)
+ in hex dump style (offset: val val val val ... 3hf.Uas.c)
* In addition one should be able to control the following
aspects of printing blocks via the config() interface:
+ base (hex, octal, char, base 2)
+ amount of data (the first n octets or the entire block)
+ skipping printing of duplicate print lines (ala od)
+ have the ability to print the block as raw data
* It is overkill to have nearly everything wind up in libcalc.a.
One should make available a the fundimental math operations
One should make available a the fundamental math operations
on ZVALUE, NUMBER and perhaps COMPLEX (without all of the
other stuff) in a separate library.
* improve the coverage in the 'SEE ALSO' help file lists
* Clean the source code and document it better.
* where reasonable, be sure that regress.cal tests builtin functions
* clean the source code and document it better
* Add a builtin function to access the 64 bit FNV hash which
is currently being used internally in seed.c.

View File

@@ -19,6 +19,10 @@ Calc command line
will cause calc to try to process each line being read
despite the errors that it encounters.
By default, calc startup scripts ($CALCRC) are silently
ignored if not found. This flag will report missing
startup scripts unless -d is also given.
-C Permit the execution of custom builtin functions. Without
this flag, calling the custom() builtin function will
simply generate an error.
@@ -48,6 +52,9 @@ Calc command line
It's nearly ten past six.
This flag disables the reporting of missing calc
startup scripts ($CALCRC).
-e Ignore any environment variables on startup. The
getenv() builtin will still return values, however.

181
help/wishlist Normal file
View File

@@ -0,0 +1,181 @@
Calc Enhancement Wish List:
Send calc comments, suggestions, bug fixes, enhancements and
interesting calc scripts that you would like you see included in
future distributions to:
calc-tester@postofc.corp.sgi.com
The following items are in the calc wish list. Programs like this
can be extended and improved forever.
See the 'todo' help file for higher priority todo items.
=-=
* In general use faster algorithms for large numbers when they
become known. In particular, look at better algorithms for
very large numbers -- multiply, square and mod in particular.
* Implement an autoload feature. Associate a calc library filename
with a function or global variable. On the first reference of
such item, perform an automatic load of that file.
* Add error handling statements, so that QUITs, errors from the
'eval' function, division by zeroes, and so on can be caught.
This should be done using syntax similar to:
ONERROR statement DO statement;
Something like signal isn't versatile enough.
* Add a debugging capability so that functions can be single stepped,
breakpoints inserted, variables displayed, and so on.
* Figure out how to write all variables out to a file, including
deeply nested arrays, lists, and objects.
Add the ability to read and write a value in some binary form.
Clearly this is easy for non-neg integers. The question of
everything else is worth pondering.
* Eliminate the need for the define keyword by doing smarter parsing.
* Allow results of a command (or all commands) to be re-directed to a
file or piped into a command.
* Add some kind of #include and #define facility. Perhaps use
the C pre-processor itself?
* Support a more general input and output base mode other than
just dec, hex or octal.
* Implement a form of symbolic algebra. Work on this has already
begun. This will use backquotes to define expressions, and new
functions will be able to act on expressions. For example:
x = `hello * strlen(mom)`;
x = sub(x, `hello`, `hello + 1`);
x = sub(x, `hello`, 10, `mom`, "curds");
eval(x);
prints 55.
* Place the results of previous commands into a parallel history list.
Add a binding that returns the saved result of the command so
that one does not need to re-execute a previous command simply
to obtain its value.
If you have a command that takes a very long time to execute,
it would be nice if you could get at its result without having
to spend the time to reexecute it.
* Add a binding to delete a value from the history list.
One may need to remove a large value from the history list if
it is very large. Deleting the value would replace the history
entry with a null value.
* Add a binding to delete a command from the history list.
Since you can delete values, you might as well be able to
delete commands.
* All one to alter the size of the history list thru config().
In some cases, 256 values is too small, in others it is too large.
* Add a builtin that returns a value from the history list.
As an example:
histval(-10)
returns the 10th value on the history value list, if such
a value is in the history list (null otherwise). And:
histval(23)
return the value of the 23rd command given to calc, if
such a value is in the history list (null otherwise).
It would be very helpful to use the history values in
subsequent equations.
* Add a builtin that returns command as a string from the
history list. As an example:
history(-10)
returns a string containing the 10th command on the
history list, if a such a value is in the history list
(empty string otherwise). And:
history(23)
return the string containing the 23rd command given to calc, if
such a value is in the history list (empty string otherwise).
One could use the eval() function to re-evaluate the command.
* Allow one to optionally restore the command number to calc
prompts. When going back in the history list, indicate the
command number that is being examined.
The command number was a useful item. When one is scanning the
history list, knowing where you are is hard without it. It can
get confusing when the history list wraps or when you use
search bindings. Command numbers would be useful in
conjunction with positive args for the history() and histval()
functions as suggested above.
* Add a builtin that returns the current command number.
For example:
cmdnum()
returns the current command number.
This would allow one to tag a value in the history list. One
could save the result of cmdnum() in a variable and later use
it as an arg to the histval() or history() functions.
* Add a factoring builtin functions. Provide functions that perform
multiple polynomial quadratic sieves, elliptic curve, difference
of two squares, N-1 factoring as so on. Provide a easy general
factoring builtin (say factor(foo)) that would attempt to apply
whatever process was needed based on the value.
Factoring builtins would return a matrix of factors.
It would be handy to configure, via config(), the maximum time
that one should try to factor a number. By default the time
should be infinite. If one set the time limit to a finite
value and the time limit was exceeded, the factoring builtin
would return whatever if had found thus far, even if no new
factors had been found.
Another factoring configuration interface, via config(), that
is needed would be to direct the factoring builtins to return
as soon as a factor was found.
* Allow one to config calc break up long output lines.
The command: calc '2^100000' will produce one very long
line. Many times this is reasonable. Long output lines
are a problem for some utilities. It would be nice if one
could configure, via config(), calc to fold long lines.
By default, calc should continue to produce long lines.
One option to config should be to specify the length to
fold output. Another option should be to append a trailing
\ on folded lines (as some symbolic packages use).
* Allow one to use the READ and WRITE commands inside a function.
* Remove or increase limits on factor(), lfactor(), isprime(),
nextprime(), and prevprime(). Currently these functions cannot
search for factors > 2^32.
* Add read -once -try "filename" which would do nothing
if "filename" was not a readable file.

5
hist.c
View File

@@ -242,7 +242,7 @@ int
hist_getline(char *prompt, char *buf, int len)
{
if (!inited)
(void) hist_init((char *) NULL);
(void) hist_init(calcbindings);
HS.prompt = prompt;
HS.bufsize = len - 2;
@@ -455,8 +455,9 @@ do_bind_line(KEY_MAP *map, char *line)
if (*cp == '?') {
key = 0177;
cp++;
} else
} else {
key = CONTROL(*cp++);
}
}
else if (key == '\\')
key = *cp++;

82
input.c
View File

@@ -12,6 +12,12 @@
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "have_unistd.h"
#if defined(HAVE_UNISTD_H)
#include <unistd.h>
#endif
#include "calc.h"
#include "conf.h"
#include "hist.h"
@@ -33,8 +39,9 @@ typedef struct {
int i_state; /* state (read, reread) */
int i_char; /* currently read char */
long i_line; /* line number */
char *i_str; /* current string for input (if not NULL) */
char *i_origstr; /* original string so it can be freed */
char *i_cp; /* pointer to string character to be read */
char *i_str; /* start of string copy to be read, or NULL */
long i_num; /* number of string characters remaining */
char *i_ttystr; /* current character of tty line (or NULL) */
FILE *i_fp; /* current file for input (if not NULL) */
char *i_name; /* file name if known */
@@ -311,7 +318,7 @@ f_open(char *name, char *mode)
*/
if (!allow_read && !allow_write) {
/* no reads and no writes means no opens! */
if (run_state > RUN_PRE_BEGIN) {
if (run_state > RUN_BEGIN) {
fprintf(stderr,
"open of %s mode %s - %s\n", name, mode,
"open for read or write disallowed by -m\n");
@@ -319,7 +326,7 @@ f_open(char *name, char *mode)
return NULL;
} else if (!allow_read && strchr(mode, 'r') != NULL) {
/* reading new files disallowed */
if (run_state > RUN_PRE_BEGIN) {
if (run_state > RUN_BEGIN) {
fprintf(stderr,
"open of %s mode %s - %s\n", name, mode,
"open for read disallowed by -m\n");
@@ -330,7 +337,7 @@ f_open(char *name, char *mode)
strchr(mode, 'a') != NULL ||
strchr(mode, '+') != NULL)) {
/* writing new files disallowed */
if (run_state > RUN_PRE_BEGIN) {
if (run_state > RUN_BEGIN) {
fprintf(stderr,
"open of %s mode %s - %s\n", name, mode,
"open for write disallowed by -m\n");
@@ -375,7 +382,6 @@ openfile(char *name)
cip->i_state = IS_READ;
cip->i_char = '\0';
cip->i_str = NULL;
cip->i_origstr = NULL;
cip->i_ttystr = NULL;
cip->i_fp = fp;
cip->i_line = 1;
@@ -401,7 +407,7 @@ curstream(void)
/*
* Open a string for scanning. String is ended by a null character.
* Open a string for scanning, num characters to be read.
* String is copied into local memory so it can be trashed afterwards.
* Returns -1 if cannot open string.
*
@@ -409,21 +415,22 @@ curstream(void)
* str string to be opened
*/
int
openstring(char *str)
openstring(char *str, long num)
{
char *cp; /* copied string */
if ((depth >= MAXDEPTH) || (str == NULL))
return -2;
cp = (char *)malloc(strlen(str) + 1);
cp = (char *) malloc(num + 1);
if (cp == NULL)
return -1;
strcpy(cp, str);
cip = inputs + depth++;
cip->i_state = IS_READ;
cip->i_char = '\0';
cip->i_cp = cp;
cip->i_str = cp;
cip->i_origstr = cp;
cip->i_num = num;
cip->i_fp = NULL;
cip->i_name = NULL;
cip->i_ttystr = NULL;
@@ -445,7 +452,6 @@ openterminal(void)
cip->i_state = IS_READ;
cip->i_char = '\0';
cip->i_str = NULL;
cip->i_origstr = NULL;
cip->i_ttystr = NULL;
cip->i_fp = NULL;
cip->i_name = NULL;
@@ -462,8 +468,8 @@ closeinput(void)
{
if (depth <= 0)
return;
if (cip->i_origstr)
free(cip->i_origstr);
if (cip->i_str)
free(cip->i_str);
if (cip->i_fp)
fclose(cip->i_fp);
if (cip->i_name)
@@ -515,8 +521,11 @@ nextchar(void)
return ch;
}
if (cip->i_str) { /* from string */
ch = chartoint(*cip->i_str++);
if (ch == '\0')
if (cip->i_num) {
ch = chartoint(*cip->i_cp++);
cip->i_num--;
}
else
ch = EOF;
} else if (cip->i_fp) { /* from file */
ch = fgetc(cip->i_fp);
@@ -525,10 +534,6 @@ nextchar(void)
} else { /* from terminal */
ch = ttychar();
}
if (ch == EOF) { /* fix up end of file */
closeinput();
ch = EOF;
}
if (depth > 0)
cip->i_char = ch; /* save for rereads */
if (ch == '\n')
@@ -634,6 +639,9 @@ ttychar(void)
if (*cmd == '\0' || *cmd == '\n')
cmd = shell;
if (allow_exec) {
if (conf->calc_debug & CALCDBG_SYSTEM) {
printf("%s\n", cmd);
}
system(cmd);
} else {
fprintf(stderr, "execution disallowed by -m flag\n");
@@ -663,6 +671,16 @@ inputisterminal(void)
}
/*
* Return depth of current input source
*/
int
inputlevel(void)
{
return depth - 1;
}
/*
* Return the name of the current input file.
* Returns NULL for terminal or strings.
@@ -710,35 +728,37 @@ runrcfiles(void)
{
char path[MAX_CALCRC+1+1]; /* name being searched for */
char *cp;
char *newcp;
char *p;
int i;
/* execute each file in the list */
for (cp=calcrc, newcp=(char *)strchr(calcrc, LISTCHAR);
cp != NULL && *cp;
cp = newcp,
newcp=(newcp) ? (char *)strchr(newcp+1, LISTCHAR) : NULL) {
while (calcrc != NULL && *calcrc) {
cp = calcrc;
calcrc = (char *) strchr(calcrc + 1, LISTCHAR);
/* load file name into the path */
if (newcp == NULL) {
if (calcrc == NULL) {
strcpy(path, cp);
} else {
strncpy(path, cp, newcp-cp);
path[newcp-cp] = '\0';
strncpy(path, cp, calcrc - cp);
path[calcrc - cp] = '\0';
}
/* find the start of the path */
p = (path[0] == ':') ? path+1 : path;
p = (path[0] == ':') ? path + 1 : path;
if (p[0] == '\0') {
continue;
}
/* process the current file in the list */
i = openfile(p);
if (i < 0)
if (openfile(p) < 0) {
/* Unable to open rcfile */
if (c_flag && !d_flag)
fprintf(stderr,
"Unable to open rcfile \"%s\"\n", p);
continue;
}
getcommands(FALSE);
closeinput();
}
}

View File

@@ -44,7 +44,7 @@ CALC_FILES= README bigprime.cal deg.cal ellip.cal lucas.cal lucas_chk.cal \
test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \
test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \
beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \
randomrun.cal xx_print.cal natnumset.cal qtime.cal
randomrun.cal xx_print.cal natnumset.cal qtime.cal test8400.cal
# These files are found (but not built) in the distribution
#

View File

@@ -17,7 +17,7 @@ For example:
will cause calc to load and execute the 'lucas.cal' library.
Executing the library will cause several functions to be defined.
Executing the lucas function
Executing the lucas function:
> lucas(149,60)
1
@@ -50,37 +50,41 @@ version of read:
This will cause the needed library files to be read once. If these
files have already been read, the read -once will act as a noop.
By convention, the config parameter "lib_debug" is used to control
the verbosity of debug information printed by lib files. By default,
the "lib_debug" has a value of 0.
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:
The "lib_debug" config parameter takes the place of the lib_debug
global variable. By convention, "lib_debug" has the following meanings:
n Meaning of bit n of config("lib_debug")
<-1 no debug messages are printed though some internal
debug actions and information may be collected
0 When a function is defined, redefined or undefined at
interactive level, a message saying what has been done
is displayed.
-1 no debug messages are printed, no debug actions will be taken
1 When a function is defined, redefined or undefined during
the reading of a file, a message saying what has been done
is displayed.
0 only usage message regarding each important object are
printed at the time of the read (default)
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.
>0 messages regarding each important object are
printed at the time of the read in addition
to other debug messages
When config("lib_debug") >= 0, function names and their arg are
printed as they are defined. Sometimes this printing is not enough
information. For example:
Sometimes the information printed is not enough. In addition to the
standard information, one might want to print:
* useful obj definitions
* functions with optional args
* functions with optional args where the param() interface is used
For these cases we suggest that you place at the bottom of your code
something like:
something that prints extra information if config("lib_debug") has
either of the bottom 2 bits set:
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj xyz defined";
print "funcA([val1 [, val2]]) defined";
print "funcB(size, mass, ...) defined";

View File

@@ -86,7 +86,7 @@
* i.e., any value that is 301 mod 420.
*
* Written by: Ernest W Bowen <ernie@neumann.une.edu.au>
* Interface by: Landon Curt Noll <chongo@toad.com>
* Interface by: Landon Curt Noll http://reality.sgi.com/chongo
*/
static defaultmlist = list(2,3,5,7,11,13,17,19); /* The first eight primes */
@@ -174,7 +174,7 @@ define chrem()
}
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "chrem(r1,m1 [,r2,m2 ...]) defined";
print "chrem(rlist [,mlist]) defined";
}

View File

@@ -111,6 +111,6 @@ define fixdms(a)
a.deg %= 360;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj dms {deg, min, sec} defined";
}

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\ chongo@toad.com
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*/
/*
* lucas - perform a Lucas primality test on h*2^n-1
@@ -1024,7 +1027,7 @@ gen_v1(h, n)
define
ldebug(funct, str)
{
if (config("lib_debug") > 0) {
if (config("lib_debug") & 3) {
print "DEBUG:", funct:":", str;
}
return;

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\ chongo@toad.com
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*/
/*
* primes of the form h*2^n-1 for 1<=h<200 and 1<=n<1000
@@ -328,7 +331,7 @@ lucas_chk(high_n, quiet)
/* skip primes where h>=2^n */
if (highbit(h_p[i]) >= n_p[i]) {
if (config("lib_debug") > 0) {
if (config("lib_debug") & 3) {
print "h>=2^n skip:", h_p[i]:"*2^":n_p[i]:"-1";
}
continue;

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\ chongo@toad.com
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*/
/*
* Lucasian criteria for primality
@@ -149,7 +152,7 @@ d_val[97]=1045; a_val[97]=33; b_val[97]=1; r_val[97]=44;
d_val[99]=9797; a_val[99]=97; b_val[99]=1; r_val[99]=388;
d_val[100]= 51; a_val[100]= 7; b_val[100]=1; r_val[100]=2;
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "d_val[100] defined";
print "a_val[100] defined";
print "b_val[100] defined";

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\ chongo@toad.com
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*/
@@ -309,6 +312,6 @@ define mfactor(n, start_k, rept_loop, p_elim)
return q;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "mfactor(n [, start_k=1 [, rept_loop=10000 [, p_elim=17]]])"
}

View File

@@ -189,7 +189,7 @@ define mod_pow(a, b)
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj mod {a} defined";
print "mod_value defined";
print "set mod_value as needed";

View File

@@ -687,6 +687,6 @@ a=pol(1,4,4,2,3,1);
b=pol(5,16,8,1);
c=pol(1+2i,3+4i,5+6i);
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj poly {p} defined";
}

View File

@@ -7,7 +7,7 @@
* utc_hr_offset Offset from UTC in hours.
*
* Written by: Klaus Alexander Seistrup <kseis@magnetic-ink.dk>
* With minor mods by: Landon Curt Noll <chongo@toad.com>
* With minor mods by: Landon Curt Noll <http://reality.sgi.com/chongo>
*
* See:
* http://www.magnetic-ink.dk/download/qtime.html

View File

@@ -195,6 +195,6 @@ define quat_shift(a, b)
return x.s;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj quat {s, v} defined";
}

View File

@@ -21,7 +21,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\ chongo@toad.com
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*/
/* obtain our required libs */

View File

@@ -122,6 +122,6 @@ define randrun(run_cnt)
printf("max length=%d\n", max_run);
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "randrun([run_length]) defined";
}

View File

@@ -28,8 +28,9 @@ global ecnt; /* expected value of errcount() */
ecnt = 0; /* clear expected errcount() value */
initcfg = config("all", "oldstd"); /* set config to startup default */
initcfg = config("lib_debug", -4); /* disable lib startup messages */
initcfg = config("calc_debug", 1); /* enable more internal debugging */
initcfg = config("lib_debug", 0); /* disable lib startup messages */
initcfg = config("calc_debug", 0); /* disable internal debugging */
initcnf = config("verbose_quit", 0); /* disable quit messages */
initcfg = config("all"); /* save state for later use */
print '003: parsed global definitions';
@@ -964,7 +965,7 @@ define test_functions()
vrfy(strpos(a, a) == 1, '948: strpos(a, a) == 1');
vrfy(system("") == 0, '949: system("") == 0');
vrfy(system("true") == 0, '950: system("true") == 0');
vrfy(isatty(files(0)) == 1, '951: isatty(files(0)) == 1');
print '951: test disabled due to stdin dependency';
print '952: test removed';
print '953: test removed';
vrfy(isstr(cmdbuf()) == 1, '954: isstr(cmdbuf()) == 1');
@@ -3302,7 +3303,7 @@ define test_fileops()
print '4261: Ending test_fileops';
}
print '071: parsed test_redc()';
print '071: parsed test_fileops()';
/*
@@ -5106,7 +5107,7 @@ define test_is()
vrfy(isatty(square) == 0, '5981: isatty(square) == 0');
vrfy(isatty(string) == 0, '5982: isatty(string) == 0');
vrfy(isatty(com) == 0, '5983: isatty(com) == 0');
vrfy(isatty(files(0)) == 1, '5984: isatty(files(0)) == 1');
print '5984: test disabled due to stdin dependency';
/* if we pipe to awk (for make chk), stdout and stderr are not ttys */
print '5985: test unused';
print '5986: test unused';
@@ -6861,7 +6862,7 @@ print '181: parsed test_ptr()';
*/
define test_newstring()
{
local A, B, C, D, S, p;
local A, B, C, D, S, p, q;
print '7700: Beginning test_newstring';
@@ -6953,7 +6954,14 @@ define test_newstring()
print '7762: setbit(A, 16, 0);';
vrfy(A == "A\255fdef", '7763: A == "A\255fdef"');
print '7764: Ending test_newstring';
q = "curds" " and " "whey";
print '7764: q = "curds" " and " "whey"';
vrfy(q == "curds and whey", '7765: q == "curds and whey"');
q = "chongo" ' was ' "here";
print '7766: q = "chongo" \' was \' "here"';
vrfy(q == "chongo was here", '7767: q == "chongo was here"');
print '7768: Ending test_newstring';
}
print '182: parsed test_newstring()';
@@ -7113,8 +7121,12 @@ print '188: parsed test_natnumset()';
/*
* test_somenew - test some new features
*/
define func8200(x,y) {if (x>0) return calclevel()+func8200(x-1,y)-y; return 0;}
print '189: define func8200(x,y)';
define test_somenew()
{
local a, s, y;
print '8200: Starting test_somenew';
vrfy(char(-1) == char(255), '8201: char(-1) == char(255)');
@@ -7139,9 +7151,42 @@ define test_somenew()
vrfy(1/(1/0) == 0, '8215: 1/(1/0) == 0');
vrfy(inverse(1/0) == 0, '8216: inverse(1/0) == 0');
print '8217: Ending test_somenew';
a = isqrt(2e1000); s = "xyz";
print '8217: a = isqrt(2e1000); s = "xyz";';
vrfy(hash(a,s) == 2708885378, '8218: hash(a,s) == 2708885378');
vrfy(hash("curds n whey") == 2376141927,
'8219: hash("curds n whey") == 2376141927');
y = calclevel();
print '8220: y = calclevel()';
vrfy(func8200(0,y) == 0, '8221: func8200(0,y) == 0');
vrfy(func8200(1,y) == 1, '8222: func8200(1,y) == 1');
vrfy(func8200(10,y) == 55, '8223: func8200(10,y) == 55');
vrfy(func8200(100,y) == 5050, '8224: func8200(100,y) == 5050');
vrfy(inputlevel() == 1, '8225: inputlevel() == 1');
print '8226: Ending test_somenew';
}
print '189: parsed test_somenew()';
print '190: parsed test_somenew()';
/*
* test_quit - test the QUIT functionality
*/
define test_quit()
{
local x8400 = 23209; /* watch for lost memory */
static s8400 = 21701; /* watch for lost memory */
print '8400: Starting test_quit';
quit;
prob('quit did not end the test_quit() function');
/* 8400 serise continued after return, do not print end here */
}
print '191: parsed test_quit()';
/*
@@ -7195,16 +7240,27 @@ print '1700: Beginning read test';
value = 0;
vrfy(value == 0, '1701: value == 0');
read "test1700";
vrfy(value == 1, '1702: value == 1');
read -once "test1700";
print '1702: read "test1700";';
vrfy(value == 1, '1703: value == 1');
read -once "test1700";
print '1704: read -once "test1700";';
vrfy(value == 1, '1705: value == 1');
read "test1700.cal";
vrfy(value == 2, '1704: value == 2');
print '1706: read "test1700.cal";';
vrfy(value == 2, '1707: value == 2');
read -once "test1700.cal";
vrfy(value == 2, '1705: value == 2');
print '1708: read -once "test1700.cal";';
vrfy(value == 2, '1709: value == 2');
read "test1700.cal";
vrfy(value == 3, '1706: value == 3');
print '1707: Ending read test';
print '1710: read "test1700.cal";';
vrfy(value == 3, '1711: value == 3');
{++value;} read "test1700.cal";
print '1712: {++value;} read "test1700.cal";';
vrfy(value == 5, '1713: value == 5');
{++value;} read -once "test1700.cal";
print '1714: {++value;} read -once "test1700.cal";';
vrfy(value == 6, '1715: value == 6');
print '1716: Ending read test';
print;
return test_obj();
@@ -7279,6 +7335,9 @@ print;
return test_size();
print;
/*
* 5800 assignment tests
*/
return test_assign(5800, 1);
define xy5800_assign(a,b) { };
print '5812: define xy5800_assign(a,b) { }';
@@ -7323,7 +7382,7 @@ X5800 = obj xy5800 = {1,2};
print '5864: X5800 = obj xy5800 = {1,2}';
vrfy(X5800 == (obj xy5800 = {1,2}),
'5865: X5800 == (obj xy5800 = {1,2})');
print '5899: End of 5800 sequence';
print '5866: End of 5800 sequence';
print;
return test_is();
@@ -7393,6 +7452,37 @@ print;
return test_somenew();
/*
* misc define tests
*/
print;
print '8300: Starting define tests';
define f8300(x) = x^2; define g8300(x) = 1 - x;
print '8301: define f8300(x) = x^2; define g8300(x) = 1 - x;';
vrfy(f8300(10) == 100, '8302: f8300(10) == 100');
vrfy(g8300(10) == -9, '8303: g8300(10) == -9');
define h8300(x)=x^3;define i8300(x)=x-1;define j8300(x)=x+1;
print '8304: define h8300(x)=x^3;define i8300(x)=x-1;define j8300(x)=x+1;';
vrfy(h8300(10) == 1000, '8305: h8300(10) == 1000');
vrfy(i8300(10) == 9, '8306: i8300(10) == 9');
vrfy(j8300(10) == 11, '8307: j8300(10) == 11');
{static k8300 = 5} define l8300(x) = k8300 + x;
print '8308: {static k8300 = 5} define l8300(x) = k8300 + x;';
vrfy(l8300(10) == 15, '8309: l8300(10) == 15');
print '8310: Ending define tests';
/*
* quit tests
*/
print;
return test_quit();
read -once test8400;
print '8404: read -once test8400';
vrfy(test8400() == 64434, '8405: test8400() == 64434');
print '8406: Ending test_quit';
/*
* read various calc libs
*
@@ -7406,7 +7496,7 @@ return test_somenew();
* lucas_tbl.cal - duplicatres code already read by another file
* regress.cal - this file
* surd.cal - already read by this file
* testXXXX.cal - already read by this file
* test9999.cal - files of this form are already read by this file
* xx_print.cal - prints a bunch of things when loaded
*
* We want to do this 2nd to last; ahead of any final cleanup and behind

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\ chongo@toad.com
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*/
/*
@@ -110,7 +113,7 @@ define seedrandom(seed1, seed2, size, trials)
p = 2*fp+1;
} while (ptest(p,1,0) == 0);
} while(ptest(p, trials) == 0 || ptest(fp, trials) == 0);
if (config("lib_debug") > 0) {
if (config("lib_debug") & 3) {
print "/* 1st Blum prime */ p=", p;
}
@@ -124,7 +127,7 @@ define seedrandom(seed1, seed2, size, trials)
q = 2*fq+1;
} while (ptest(q,1,0) == 0);
} while(ptest(q, trials) == 0 || ptest(fq, trials) == 0);
if (config("lib_debug") > 0) {
if (config("lib_debug") & 3) {
print "/* 2nd Blum prime */ q=", q;
}
@@ -134,7 +137,7 @@ define seedrandom(seed1, seed2, size, trials)
n = p*q; /* the Blum modulus */
binsize = highbit(n)+1; /* smallest power of 2 > p*q */
r = pmod(rand(1<<ceil(binsize*4/5), 1<<(binsize-2)), 2, n);
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "/* seed quadratic residue */ r=", r;
print "/* newn", binsize, "bit quadratic residue*/ newn=", n;
}
@@ -151,6 +154,6 @@ define seedrandom(seed1, seed2, size, trials)
return old_state;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "seedrandom(seed1, seed2, size [, trials]) defined";
}

View File

@@ -261,7 +261,7 @@ define surd_rel(a, b)
return sgn(x^2 - y^2 * surd_type) * sgn(x);
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj surd {a, b} defined";
print "surd_type defined";
print "set surd_type as needed";

View File

@@ -3,8 +3,10 @@
* Permission is granted to use, distribute, or modify this source,
* provided that this copyright notice remains intact.
*
* By: Landon Curt Noll
* chongo@toad.com -or- ...!{pyramid,sun,uunet}!hoptoad!chongo
* By: Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*
* This library is used by the 1700 series of the regress.cal test suite.
*/

View File

@@ -3,8 +3,10 @@
* Permission is granted to use, distribute, or modify this source,
* provided that this copyright notice remains intact.
*
* By: Landon Curt Noll
* chongo@toad.com -or- ...!{pyramid,sun,uunet}!hoptoad!chongo
* By: Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*
* This library is used by the 2300 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 2600 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 2700 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 3100 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 3300 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 3400 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 3500 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 4000 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 4100 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 4600 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 5100 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact.
*
* By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo
*
* This library is used by the 5200 series of the regress.cal test suite.
*/

30
lib/test8400.cal Normal file
View File

@@ -0,0 +1,30 @@
/*
* Copyright (c) 1999 Landon Curt Noll
* Permission is granted to use, distribute, or modify this source,
* provided that this copyright notice remains intact.
*
* By: Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*
* This library is used by the 8400 series of the regress.cal test suite.
*/
print "8401: in test8400.cal";
/*
* test8400 - dummy function to allow a check of quit-based memory leaks
*/
define test8400()
{
local x8401 = 19937; /* watch for lost memory */
static s8401 = 44497; /* watch for lost memory */
return x8401+s8401;
}
print "8402: parsed test8400()";
vrfy(test8400() == 64434, '8403: test8400() == 64434');
quit;
prob('quit did not end test8400.cal');

View File

@@ -23,6 +23,6 @@ define sc()
return s;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "sc(a, b, ...) defined";
}

View File

@@ -89,19 +89,20 @@ int i_flag = FALSE; /* TRUE => go interactive if permitted */
/*
* global values
*/
char *calcpath; /* $CALCPATH or default */
char *calcrc; /* $CALCRC or default */
char *calcbindings; /* $CALCBINDINGS or default */
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 */
char *calcpath = NULL; /* $CALCPATH or default */
char *calcrc = NULL; /* $CALCRC or default */
char *calcbindings = NULL; /* $CALCBINDINGS or default */
char *home = NULL; /* $HOME or default */
char *pager = NULL; /* $PAGER or default */
char *shell = NULL; /* $SHELL or default */
int stdin_tty = FALSE; /* TRUE if stdin is a tty */
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 post_init = FALSE; /* TRUE setjmp for math_error is ready */
BOOL abort_now = FALSE; /* TRUE => go interactive now, if permitted */
int no_env = FALSE; /* TRUE (-e) => ignore env vars on startup */
int errmax = ERRMAX; /* if >= 0, maximum value for errcount */
int no_env = FALSE; /* TRUE (-e) => ignore env vars on startup */
int errmax = ERRMAX; /* if >= 0, maximum value for errcount */
NUMBER *epsilon_default; /* default allowed error for float calcs */
@@ -180,7 +181,7 @@ libcalc_call_me_first(void)
/*
* ready to rock & roll ..
*/
run_state = RUN_PRE_BEGIN;
run_state = RUN_BEGIN;
init_done = 1;
return;
}
@@ -247,6 +248,7 @@ reinitialize(void)
math_setfp(stdout);
resetscopes();
resetinput();
inittokens();
(void) openterminal();
}

View File

@@ -1213,8 +1213,9 @@ matcopy(MATRIX *m)
if (v1->v_type == V_NUM) {
v2->v_type = V_NUM;
v2->v_num = qlink(v1->v_num);
} else
} else {
copyvalue(v1, v2);
}
v1++;
v2++;
}

View File

@@ -27,12 +27,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/

2
md5.c
View File

@@ -656,7 +656,7 @@ MD5_print(HASH *state)
/*
* form the hash value
*/
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_HASH_STATE) {
char buf[DEBUG_SIZE+1]; /* hash value buffer */
/*

View File

@@ -28,12 +28,10 @@
*
* Happy bit twiddling,
*
* Landon Curt Noll
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/

6
obj.c
View File

@@ -640,8 +640,9 @@ objfree(OBJECT *op)
for (i = op->o_actions->count; i-- > 0; vp++) {
if (vp->v_type == V_NUM) {
qfree(vp->v_num);
} else
} else {
freevalue(vp);
}
}
if (op->o_actions->count <= USUAL_ELEMENTS)
free(op);
@@ -678,8 +679,9 @@ objcopy(OBJECT *op)
if (v1->v_type == V_NUM) {
v2->v_num = qlink(v1->v_num);
v2->v_type = V_NUM;
} else
} else {
copyvalue(v1, v2);
}
v2->v_subtype = V_NOSUBTYPE;
}
return np;

View File

@@ -33,6 +33,7 @@ static BOOL saveval = TRUE; /* to enable or disable saving */
static int calc_errno; /* most recent error-number */
static int errcount; /* counts calls to error_value */
static BOOL go;
static long calc_depth;
/*
* global symbols
@@ -106,6 +107,9 @@ initstack(void)
freevalue(stack--);
}
}
/* initialize calc_depth */
calc_depth = 0;
}
@@ -2065,9 +2069,9 @@ o_isdefined(void)
}
r = 0;
index = getbuiltinfunc(vp->v_str->s_str);
if (index >= 0)
if (index >= 0) {
r = 1;
else {
} else {
index = getuserfunc(vp->v_str->s_str);
if (index >= 0)
r = 2;
@@ -3124,8 +3128,7 @@ o_quit(FUNC *fp, long index)
s = findstring(index);
cp = s->s_str;
}
if (inputisterminal() && (fp->f_name[0] == '*')
&& (fp->f_name[1] == '\0')) {
if (inputisterminal() && !strcmp(fp->f_name, "*")) {
if (cp)
printf("%s\n", cp);
hist_term();
@@ -3138,14 +3141,22 @@ o_quit(FUNC *fp, long index)
}
if (cp)
printf("%s\n", cp);
else
printf("Quit statement executed\n");
if (!inputisterminal() && fp->f_name[0] == '*')
else if (conf->verbose_quit)
printf("Quit or abort executed\n");
if (!inputisterminal() && !strcmp(fp->f_name, "*"))
closeinput();
go = FALSE;
}
static void
o_abort(FUNC *fp, long index)
{
abort_now = TRUE;
o_quit(fp, index);
}
static void
o_getepsilon(void)
{
@@ -3533,7 +3544,8 @@ static struct opcode opcodes[MAX_OPCODE+1] = {
{o_backslash, OPNUL, "BACKSLASH"}, /* unary backslash op */
{o_setminus, OPNUL, "SETMINUS"}, /* binary backslash op */
{o_plus, OPNUL, "PLUS"}, /* unary + op */
{o_jumpnn, OPJMP, "JUMPNN"} /* jump if non-null */
{o_jumpnn, OPJMP, "JUMPNN"}, /* jump if non-null */
{o_abort, OPONE, "ABORT"} /* abort operation */
};
@@ -3567,6 +3579,7 @@ calculate(FUNC *fp, int argcount)
funcname = fp->f_name;
funcline = 0;
go = TRUE;
++calc_depth;
origargcount = argcount;
while (argcount < fp->f_paramcount) {
stack++;
@@ -3682,6 +3695,7 @@ calculate(FUNC *fp, int argcount)
}
funcname = oldname;
funcline = oldline;
--calc_depth;
return;
case OPSTI: /* static initialization code */
@@ -3697,12 +3711,13 @@ calculate(FUNC *fp, int argcount)
freevalue(&locals[i]);
if (locals != localtable)
free(locals);
if (conf->calc_debug & 2)
if (conf->calc_debug & CALCDBG_FUNC_QUIT)
printf("\t\"%s\": line %ld\n", funcname, funcline);
while (stack > beginstack)
freevalue(stack--);
funcname = oldname;
funcline = oldline;
--calc_depth;
return;
}
@@ -3748,8 +3763,10 @@ dumpop(unsigned long *pc)
case OP_PRINTSTRING: case OP_STRING:
printf(" \"%s\"\n", findstring((long)(*pc))->s_str);
return 2;
case OP_QUIT:
printf(" \"%s\"\n", findstring((long)(*pc))->s_str);
case OP_QUIT: case OP_ABORT:
if ((long)(*pc) >= 0)
printf(" \"%s\"", findstring((long)(*pc))->s_str);
putchar('\n');
return 2;
case OP_INDEXADDR:
printf(" %ld %ld\n", pc[0], pc[1]);
@@ -3837,3 +3854,13 @@ freenumbers(FUNC *fp)
}
trimconstants();
}
long
calclevel(void)
{
return calc_depth - 1;
}
/* END CODE */

View File

@@ -144,7 +144,8 @@
#define OP_SETMINUS 129L /* binary backslash */
#define OP_PLUS 130L /* unary + */
#define OP_JUMPNN 131L /* jump if top value is non-null */
#define MAX_OPCODE 131L /* highest legal opcode */
#define OP_ABORT 132L /* abort operation */
#define MAX_OPCODE 132L /* highest legal opcode */
/*

Some files were not shown because too many files have changed in this diff Show More