Compare commits

...

4 Commits

Author SHA1 Message Date
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
Landon Curt Noll
2251281027 Release calc version 2.11.0t7.4 2017-05-21 15:38:29 -07:00
Landon Curt Noll
45a4b8469d Release calc version 2.11.0t7.3 2017-05-21 15:38:29 -07:00
74 changed files with 998 additions and 665 deletions

50
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,42 @@ 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.
None reported. We are sure some 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.
* Many of the LIBRARY sections are incorrect now that libcalc.a
contains most of the calc system.
=-=
* 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.
Calc Mis-features:
* The following shell command (written in sh,ksh,bash-like form) works:
calc '/*
* comment
*/
print 2+3;'
However this (also written in sh,ksh,bash-like form) does not work:
echo '/*
* comment
*/
print 2+3;' | calc
The 2nd example will result in an 'Unterminated comment' error.
* 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:
#!/usr/local/bin/calc
/*
* comment
*/
print 2+3;
Will result in '"tmp" is undefined' and '"xyzzy" is undefined'
error messages because calc considers $0 as an expression to
evaluate.

64
CHANGES
View File

@@ -1,4 +1,33 @@
Following is the change from calc version 2.11.0t7 to date:
Following is the change from calc version 2.11.0t8 to date:
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.
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,7 +139,7 @@ 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.
@@ -118,6 +147,31 @@ Following is the change from calc version 2.11.0t7 to date:
Converted start_done into a general calc run state enum called
run_state within the calc source.
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}.
Fixed memory buffer ovreread problem in eatstring() in token.c.
Fixed memory leaks related to putenv().
Fixed memory leaks realted to srandom().
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).
The main calc URL is now:
http://reality.sgi.com/chongo/tech/comp/calc
Misc calc man page fixes.
@@ -3694,9 +3748,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>)
@@ -3744,9 +3795,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

133
Makefile
View File

@@ -352,7 +352,7 @@ CALCPAGER= more
#CALCPAGER= cat
#CALCPAGER= less
# Debug/Optimize options for ${CC}
# Debug/Optimize options for ${CC} and ${LCC}
#
#DEBUG= -O
#DEBUG= -O -g
@@ -393,7 +393,7 @@ NO_SHARED=
#NO_SHARED= -non_shared
# On some systems where you are disabling dynamic shared libs, you may
# need to pass a special flag to ${CC} during linking stage.
# need to pass a special flag to ${CC} and ${LCC} during linking stage.
#
# System type NO_SHARED recommendation
#
@@ -516,13 +516,12 @@ ALLOW_CUSTOM= -DCUSTOM
# CFLAGS are all flags given to ${CC} [[often includes CCOPT, CCWARN, CCMISC]]
# ICFLAGS are given to ${CC} for intermediate progs
#
# CCMAIN are flags for ${CC} when files with main() instead of CFLAGS
#
# LCFLAGS are CC-style flags for ${LINT}
# LDFLAGS are flags given to ${CC} for linking .o files
# ILDFLAGS are flags given to ${CC} for linking .o files for intermediate progs
#
# CC is how the the C compiler is invoked
# LCC how the the C compiler is invoked on locally executed intermediate progs
# CC is how the the C compiler is invoked (with an optional Purify)
#
###
#
@@ -540,13 +539,12 @@ CCMISC=
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
ICFLAGS= ${CCWARN} ${CCMISC}
#
CCMAIN= ${ICFLAGS}
#
LCFLAGS=
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
ILDFLAGS=
#
CC= ${PURIFY} gcc
LCC= gcc
CC= ${PURIFY} ${LCC}
#
###
#
@@ -562,14 +560,13 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} gcc
#CC= ${PURIFY} gcc2
#LCC= gcc
#LCC= gcc2
#CC= ${PURIFY} ${LCC}
#
###
#
@@ -582,13 +579,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc
#LCC= cc
#CC= ${PURIFY} ${LCC}
#
###
#
@@ -613,13 +609,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc -n32 -xansi
#LCC= cc -n32 -xansi
#CC= ${PURIFY} ${LCC}
#
###
#
@@ -638,13 +633,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc
#LCC= cc
#CC= ${PURIFY} ${LCC}
#
###
#
@@ -657,13 +651,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc
#LCC= cc
#CC= ${PURIFY} ${LCC}
#
###
#
@@ -682,13 +675,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc
#LCC= cc
#CC= ${PURIFY} ${LCC}
#
###
#
@@ -702,15 +694,14 @@ CC= ${PURIFY} gcc
#CCMISC=
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#ICFLAGS= ${CCWARN} ${CCMISC} -Wno-unused
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} gcc
#LCC= gcc
#CC= ${PURIFY} ${LCC}
#
###
#
@@ -724,15 +715,14 @@ CC= ${PURIFY} gcc
#CCMISC=
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#ICFLAGS= ${CCWARN} ${CCMISC} -Wno-unused
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc
#LCC= cc
#CC= ${PURIFY} ${LCC}
##############################################################################
#-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#
@@ -887,6 +877,7 @@ CUSTOM_PASSDOWN= Q="${Q}" \
LCFLAGS="${LCFLAGS}" \
LDFLAGS="${LDFLAGS}" \
ILDFLAGS="${ILDFLAGS}" \
LCC="${LCC}" \
CC="${CC}" \
MAKE_FILE=${MAKE_FILE} \
SED=${SED} \
@@ -909,11 +900,11 @@ SAMPLE_PASSDOWN= Q="${Q}" \
CCMISC="${CCMISC}" \
CFLAGS="${CFLAGS} ${ALLOW_CUSTOM}" \
ICFLAGS="${ICFLAGS}" \
CCMAIN="${CCMAIN}" \
LCFLAGS="${LCFLAGS}" \
LDFLAGS="${LDFLAGS}" \
ILDFLAGS="${ILDFLAGS}" \
CALC_LIBS="../libcalc.a ../custom/libcustcalc.a" \
LCC="${LCC}" \
CC="${CC}" \
MAKE_FILE=${MAKE_FILE} \
SED=${SED} \
@@ -931,7 +922,7 @@ C_SRC= ${LIBSRC} ${CALCSRC} ${UTIL_C_SRC}
# These files are found (but not built) in the distribution
#
DISTLIST= ${C_SRC} ${H_SRC} ${MAKE_FILE} BUGS CHANGES LIBRARY README \
calc.man lint.sed README.OLD HOWTO.INSTALL ${UTIL_MISC_SRC}
calc.man lint.sed HOWTO.INSTALL ${UTIL_MISC_SRC}
# complete list of .o files
#
@@ -981,7 +972,7 @@ calc.1: calc.man ${MAKE_FILE}
##
calc.o: calc.c ${MAKE_FILE}
${CC} ${CCMAIN} ${CCOPT} ${ALLOW_CUSTOM} -c calc.c
${CC} ${CFLAGS} ${CCOPT} ${ALLOW_CUSTOM} -c calc.c
custom.o: custom.c ${MAKE_FILE}
${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c custom.c
@@ -1379,8 +1370,8 @@ longlong.h: longlong.c have_stdlib.h have_string.h ${MAKE_FILE}
${Q}echo '' >> longlong.h
${Q}echo '/* do we have/want to use a long long type? */' >> longlong.h
-${Q}rm -f longlong.o longlong
-${Q}${CC} ${CCMAIN} longlong.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} longlong.o -o longlong 2>/dev/null; true
-${Q}${LCC} ${ICFLAGS} longlong.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} longlong.o -o longlong 2>/dev/null; true
-${Q}${SHELL} -c "./longlong ${LONGLONG_BITS} > ll_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s ll_tmp ]; then \
@@ -1418,8 +1409,8 @@ have_fpos.h: have_fpos.c ${MAKE_FILE}
${Q}echo '' >> have_fpos.h
${Q}echo '/* do we have fgetpos & fsetpos functions? */' >> have_fpos.h
-${Q}rm -f have_fpos.o have_fpos
-${Q}${CC} ${HAVE_FPOS} ${CCMAIN} have_fpos.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} have_fpos.o -o have_fpos 2>/dev/null; true
-${Q}${LCC} ${HAVE_FPOS} ${ICFLAGS} have_fpos.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_fpos.o -o have_fpos 2>/dev/null; true
-${Q}${SHELL} -c "./have_fpos > fpos_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s fpos_tmp ]; then \
@@ -1459,8 +1450,8 @@ fposval.h: fposval.c have_fpos.h have_offscl.h have_posscl.h \
${Q}echo '' >> fposval.h
${Q}echo '/* what are our file position & size types? */' >> fposval.h
-${Q}rm -f fposval.o fposval
-${Q}${CC} ${CCMAIN} fposval.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} fposval.o -o fposval 2>/dev/null; true
-${Q}${LCC} ${ICFLAGS} fposval.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} fposval.o -o fposval 2>/dev/null; true
${Q}${SHELL} -c "./fposval fposv_tmp >> fposval.h 2>/dev/null" \
>/dev/null 2>&1; true
${Q}echo '' >> fposval.h
@@ -1492,8 +1483,8 @@ have_const.h: have_const.c ${MAKE_FILE}
${Q}echo '' >> have_const.h
${Q}echo '/* do we have or want const? */' >> have_const.h
-${Q}rm -f have_const.o have_const
-${Q}${CC} ${CCMAIN} ${HAVE_CONST} have_const.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} have_const.o -o have_const 2>/dev/null; true
-${Q}${LCC} ${ICFLAGS} ${HAVE_CONST} have_const.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_const.o -o have_const 2>/dev/null; true
-${Q}${SHELL} -c "./have_const > const_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s const_tmp ]; then \
@@ -1531,8 +1522,8 @@ have_offscl.h: have_offscl.c ${MAKE_FILE}
${Q}echo '' >> have_offscl.h
${Q}echo '' >> have_offscl.h
-${Q}rm -f have_offscl.o have_offscl
-${Q}${CC} ${CCMAIN} ${HAVE_OFFSCL} have_offscl.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} have_offscl.o -o have_offscl 2>/dev/null; true
-${Q}${LCC} ${ICFLAGS} ${HAVE_OFFSCL} have_offscl.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_offscl.o -o have_offscl 2>/dev/null; true
-${Q}${SHELL} -c "./have_offscl > offscl_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s offscl_tmp ]; then \
@@ -1569,8 +1560,8 @@ have_posscl.h: have_posscl.c have_fpos.h ${MAKE_FILE}
${Q}echo '' >> have_posscl.h
${Q}echo '' >> have_posscl.h
-${Q}rm -f have_posscl.o have_posscl
-${Q}${CC} ${CCMAIN} ${HAVE_POSSCL} have_posscl.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} have_posscl.o -o have_posscl 2>/dev/null; true
-${Q}${LCC} ${ICFLAGS} ${HAVE_POSSCL} have_posscl.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_posscl.o -o have_posscl 2>/dev/null; true
-${Q}${SHELL} -c "./have_posscl > posscl_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s posscl_tmp ]; then \
@@ -1621,8 +1612,8 @@ align32.h: align32.c longbits.h have_unistd.h ${MAKE_FILE}
fi
-${Q}if [ X = X${ALIGN32} ]; then \
rm -f align32.o align32; \
${CC} ${CCMAIN} ${ALIGN32} align32.c -c 2>/dev/null; \
${CC} ${ILDFLAGS} align32.o -o align32 2>/dev/null; \
${LCC} ${ICFLAGS} ${ALIGN32} align32.c -c 2>/dev/null; \
${LCC} ${ILDFLAGS} align32.o -o align32 2>/dev/null; \
${SHELL} -c "./align32 >align32_tmp 2>/dev/null" >/dev/null 2>&1; \
if [ -s align32_tmp ]; then \
cat align32_tmp >> align32.h; \
@@ -1662,8 +1653,8 @@ have_uid_t.h: have_uid_t.c have_unistd.h ${MAKE_FILE}
${Q}echo '' >> have_uid_t.h
${Q}echo '/* do we have or want uid_t? */' >> have_uid_t.h
-${Q}rm -f have_uid_t.o have_uid_t
-${Q}${CC} ${CCMAIN} ${HAVE_UID_T} have_uid_t.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} have_uid_t.o -o have_uid_t 2>/dev/null; true
-${Q}${LCC} ${ICFLAGS} ${HAVE_UID_T} have_uid_t.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_uid_t.o -o have_uid_t 2>/dev/null; true
-${Q}${SHELL} -c "./have_uid_t > uid_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s uid_tmp ]; then \
@@ -1701,8 +1692,8 @@ have_newstr.h: have_newstr.c ${MAKE_FILE}
${Q}echo '/* do we have or want memcpy(), memset() & strchr()? */' \
>> have_newstr.h
-${Q}rm -f have_newstr.o have_newstr
-${Q}${CC} ${CCMAIN} ${HAVE_NEWSTR} have_newstr.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} have_newstr.o -o have_newstr 2>/dev/null; true
-${Q}${LCC} ${ICFLAGS} ${HAVE_NEWSTR} have_newstr.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_newstr.o -o have_newstr 2>/dev/null; true
-${Q}${SHELL} -c "./have_newstr > newstr_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s newstr_tmp ]; then \
@@ -1739,8 +1730,8 @@ have_memmv.h: have_memmv.c ${MAKE_FILE}
${Q}echo '' >> have_memmv.h
${Q}echo '/* do we have or want memmove()? */' >> have_memmv.h
-${Q}rm -f have_memmv.o have_memmv
-${Q}${CC} ${CCMAIN} ${HAVE_MEMMOVE} have_memmv.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} have_memmv.o -o have_memmv 2>/dev/null; true
-${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" \
>/dev/null 2>&1; true
-${Q}if [ -s newstr_tmp ]; then \
@@ -1776,8 +1767,9 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
${Q}echo '' >> args.h
${Q}echo '' >> args.h
-${Q}rm -f have_stdvs.o have_stdvs
-${Q}${CC} ${CCMAIN} ${HAVE_VSPRINTF} have_stdvs.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} have_stdvs.o -o have_stdvs 2>/dev/null; true
-${Q}${LCC} ${ICFLAGS} ${HAVE_VSPRINTF} have_stdvs.c -c \
2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_stdvs.o -o have_stdvs 2>/dev/null; true
-${Q}if ./have_stdvs >>args.h 2>/dev/null; then \
touch have_args; \
else \
@@ -1785,8 +1777,9 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
fi
-${Q}if [ ! -f have_args ] && [ X"${HAVE_VSPRINTF}" = X ]; then \
rm -f have_stdvs.o have_stdvs have_varvs.o have_varvs; \
${CC} ${CCMAIN} -DDONT_HAVE_VSPRINTF have_varvs.c -c 2>/dev/null; \
${CC} ${ILDFLAGS} have_varvs.o -o have_varvs 2>/dev/null; \
${LCC} ${ICFLAGS} -DDONT_HAVE_VSPRINTF have_varvs.c -c \
2>/dev/null; \
${LCC} ${ILDFLAGS} have_varvs.o -o have_varvs 2>/dev/null; \
if ./have_varvs >>args.h 2>/dev/null; then \
touch have_args; \
else \
@@ -1865,17 +1858,17 @@ calc_errno.h: calc_errno.c ${MAKE_FILE}
echo 'extern int sys_nerr; ' \
'/* number of system errors */' >> calc_errno.h; \
else \
${CC} ${CCMAIN} -DTRY_ERRNO_NO_DECL \
${LCC} ${ICFLAGS} -DTRY_ERRNO_NO_DECL \
calc_errno.c -o calc_errno 2>calc_errno_tmp; \
if [ -x ./calc_errno ]; then \
./calc_errno >> calc_errno.h; \
else \
${CC} ${CCMAIN} -DTRY_ERRNO_STD_DECL \
${LCC} ${ICFLAGS} -DTRY_ERRNO_STD_DECL \
calc_errno.c -o calc_errno 2>calc_errno_tmp; \
if [ -x ./calc_errno ]; then \
./calc_errno >> calc_errno.h; \
else \
${CC} ${CCMAIN} -DTRY_ERRNO_OLD_DECL \
${LCC} ${ICFLAGS} -DTRY_ERRNO_OLD_DECL \
calc_errno.c -o calc_errno 2>calc_errno_tmp; \
if [ -x ./calc_errno ]; then \
./calc_errno >> calc_errno.h; \
@@ -1971,16 +1964,16 @@ calcerr.c: calcerr.tbl calcerr_c.sed calcerr_c.awk ${MAKE_FILE}
##
endian.o: endian.c have_unistd.h
${CC} ${CCMAIN} endian.c -c
${LCC} ${ICFLAGS} endian.c -c
endian: endian.o
${CC} ${ILDFLAGS} endian.o -o endian
${LCC} ${ICFLAGS} endian.o -o endian
longbits.o: longbits.c longlong.h have_unistd.h
${CC} ${CCMAIN} longbits.c -c
${LCC} ${ICFLAGS} longbits.c -c
longbits: longbits.o
${CC} ${ILDFLAGS} longbits.o -o longbits
${LCC} ${ICFLAGS} longbits.o -o longbits
##
#
@@ -2332,10 +2325,10 @@ env:
@echo "CCMISC=${CCMISC}"; echo ""
@echo "CFLAGS=${CFLAGS}"; echo ""
@echo "ICFLAGS=${ICFLAGS}"; echo ""
@echo "CCMAIN=${CCMAIN}"; echo ""
@echo "LCFLAGS=${LCFLAGS}"; echo ""
@echo "LDFLAGS=${LDFLAGS}"; echo ""
@echo "ILDFLAGS=${ILDFLAGS}"; echo ""
@echo "LCC=${LCC}"; echo ""
@echo "CC=${CC}"; echo ""
@echo "SHELL=${SHELL}"; echo ""
@echo "MAKE=${MAKE}"; echo ""

8
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:
@@ -60,10 +60,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 +86,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

@@ -1,73 +0,0 @@
# Copyright (c) 1997 David I. Bell
# Permission is granted to use, distribute, or modify this source,
# provided that this copyright notice remains intact.
#
# Arbitrary precision calculator.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NOTE: This is an old historic README. We recommend that
you read README and HOWTO.INSTALL for more info.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I am allowing this calculator to be freely distributed for your enjoyment.
Like all multi-precision programs, you should not depend absolutely on
its results, since bugs in such programs can be insidious and only rarely
show up.
-dbell-
p.s. By Landon Curt Noll:
Building calc in 3 easy steps:
1) Look at the makefile, and adjust it to suit your needs.
Here are some Makefile hints:
In the past, some people have had to adjust the VARARG or
TERMCONTROL because the Makefile cannot always guess
correctly for certain systems. You may need to play with
these values if you experience problems.
The default compiler used is 'cc'. The default compiler flag
is '-O'. If you have gcc, or gcc v2 (or better) you should use
that instead. Some compilers allow for optimization beyond
just -O (gcc v2 has -O2, mips cc has -O3). You should select
the best flag for speed optimization. Calc can be cpu intensive
so selecting a quality compiler and good optimization level can
really pay off.
2) build calc:
make all
3) test calc:
make check
==>>>If you run into problems, follow the instructions in the BUGS file<<<==
=-=
For further reading:
LIBRARY
explains how programs can use libcalc.a to take advantage
of the calc multi-precision routines.
help/todo
current wish list for calc
CHANGES
recent changes to calc
BUGS
known bugs, mis-features and how to report problems
help/full
full set of calc documentation
=-=
David I. Bell dbell@auug.org.au
chongo <Landon Curt Noll> /\../\

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

@@ -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>

View File

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

View File

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

125
calc.c
View File

@@ -237,73 +237,92 @@ 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();
}
if (run_state < RUN_NOT_TOP_LEVEL) {
while (run_state == RUN_RCFILES) {
fprintf(stderr, "Error in rcfiles\n");
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE);
closeinput();
if (inputisterminal())
run_state = RUN_PRE_CMD_ARGS;
} 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);
closeinput();
if (inputlevel() == 0) {
getcommands(FALSE);
run_state = RUN_PRE_TOP_LEVEL;
}
} 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;
}

22
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,12 +122,12 @@ extern void reread(void);
extern void resetinput(void);
extern void setprompt(char *);
extern BOOL inputisterminal(void);
extern int inputlevel(void);
extern char *inputname(void);
extern long linenumber(void);
extern void runrcfiles(void);
extern void closeinput(void);
/*
* Other routines.
*/
@@ -141,7 +141,6 @@ extern void libcalc_call_me_first(void);
extern void libcalc_call_me_last(void);
extern void showerrors(void);
/*
* Initialization
*/
@@ -197,18 +196,17 @@ extern int allow_exec; /* FALSE => may not execute any commands */
*/
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;
/*
* calc version information
*/

View File

@@ -567,7 +567,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 +575,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

@@ -125,6 +125,7 @@ getcommands(BOOL toplevel)
switch (opensearchfile(name,calcpath,CALCEXT,rdonce)) {
case 0:
getcommands(FALSE);
closeinput();
break;
case 1:
/* previously read and -once was given */
@@ -354,10 +355,6 @@ getsimplebody(void)
(void) tokenmode(TM_NEWLINES);
(void) getexprlist();
addop(OP_RETURN);
if (gettoken() != T_SEMICOLON)
rescantoken();
if (gettoken() != T_NEWLINE)
scanerror(T_NULL, "Illegal function definition");
}

View File

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

View File

@@ -25,11 +25,9 @@
* Happy bit twiddling,
*
* 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

@@ -29,14 +29,11 @@
* Happy bit twiddling,
*
* 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

@@ -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

View File

@@ -27,11 +27,9 @@
# Happy bit twiddling,
#
# 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 -=-=-=-=-=-=-=-=-#

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

@@ -16,11 +16,9 @@
* Happy bit twiddling,
*
* 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

@@ -16,11 +16,9 @@
* Happy bit twiddling,
*
* 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

@@ -16,11 +16,9 @@
* Happy bit twiddling,
*
* 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

@@ -16,11 +16,9 @@
* Happy bit twiddling,
*
* 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

@@ -25,11 +25,9 @@
* Happy bit twiddling,
*
* 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

181
func.c
View File

@@ -72,6 +72,7 @@ static int strscan(char *s, int count, VALUE **vals);
static int filescan(FILEID id, int count, VALUE **vals);
static VALUE f_eval(VALUE *vp);
static VALUE f_fsize(VALUE *vp);
static int malloced_putenv(char *str);
@@ -87,6 +88,19 @@ extern int idungetc(FILEID id, int ch);
extern int stoponerror;
/*
* malloced environment storage
*/
#define ENV_POOL_CHUNK 10 /* env_pool elements to allocate at a time */
struct env_pool {
char *getenv; /* what getenv() would return, NULL => unused */
char *putenv; /* pointer given to putenv() */
};
static int env_pool_cnt = 0; /* number of env_pool elements in use */
static int env_pool_max = 0; /* number of env_pool elements allocated */
static struct env_pool *e_pool = NULL; /* env_pool elements */
/*
* if HZ & CLK_TCK are not defined, pick typical values, hope for the best
*/
@@ -139,12 +153,14 @@ f_eval(VALUE *vp)
FUNC *oldfunc;
FUNC *newfunc;
VALUE result;
char *cp;
char *str;
long num;
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:
@@ -153,6 +169,7 @@ f_eval(VALUE *vp)
oldfunc = curfunc;
enterfilescope();
if (evaluate(TRUE)) {
closeinput();
exitfilescope();
freevalue(stack--);
newfunc = curfunc;
@@ -164,6 +181,7 @@ f_eval(VALUE *vp)
free(newfunc);
return result;
}
closeinput();
exitfilescope();
newfunc = curfunc;
curfunc = oldfunc;
@@ -5875,6 +5893,17 @@ 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_access(int count, VALUE **vals)
{
@@ -5977,8 +6006,7 @@ f_putenv(int count, VALUE **vals)
/* return putenv result */
result.v_type = V_NUM;
result.v_num = itoq((long) putenv(putenv_str));
free(putenv_str);
result.v_num = itoq((long) malloced_putenv(putenv_str));
return result;
}
@@ -6960,6 +6988,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,
@@ -7522,4 +7552,145 @@ showerrors(void)
}
/*
* malloced_putenv - Keep track of malloced environment variable storage
*
* given:
* str a malloced string which will be given to putenv
*
* returns:
* putenv() return value
*
* NOTE: The caller MUST pass a string that the caller has previously malloced.
*/
static int
malloced_putenv(char *str)
{
char *value; /* location of the value part of the str argument */
char *old_val; /* previously stored (or inherited) env value */
int found_cnt; /* number of active env_pool entries found */
struct env_pool *new; /* new e_pool */
int i;
/*
* firewall
*/
if (str == NULL) {
math_error("malloced_putenv given a NULL pointer!!");
/*NOTREACHED*/
}
if (str[0] == '=') {
math_error("malloced_putenv = is first character in string!!");
/*NOTREACHED*/
}
/*
* determine the place where getenv would return
*/
value = strchr(str, '=');
if (value == NULL) {
math_error("malloced_putenv = not found in string!!");
/*NOTREACHED*/
}
++value;
/*
* lookup for an existing environment value
*/
*(value-1) = '\0';
old_val = getenv(str);
*(value-1) = '=';
/*
* If we have the value in our environment, look for a
* previously malloced string and free it
*/
if (old_val != NULL && env_pool_cnt > 0) {
for (i=0, found_cnt=0;
i < env_pool_max && found_cnt < env_pool_cnt;
++i) {
/* skip an unused entry */
if (e_pool[i].getenv == NULL) {
continue;
}
++found_cnt;
/* look for the 1st match */
if (e_pool[i].getenv == value) {
/* found match, free the storage */
if (e_pool[i].putenv != NULL) {
free(e_pool[i].putenv);
}
e_pool[i].getenv = NULL;
--env_pool_cnt;
break;
}
}
}
/*
* ensure that we have room in the e_pool
*/
if (env_pool_max == 0) {
/* allocate an initial pool (with one extra guard value) */
new = (struct env_pool *)malloc((ENV_POOL_CHUNK+1) *
sizeof(struct env_pool));
if (new == NULL) {
math_error("malloced_putenv malloc failed");
/*NOTREACHED*/
}
e_pool = new;
env_pool_max = ENV_POOL_CHUNK;
for (i=0; i <= ENV_POOL_CHUNK; ++i) {
e_pool[i].getenv = NULL;
}
} else if (env_pool_cnt >= env_pool_max) {
/* expand the current pool (with one extra guard value) */
new = (struct env_pool *)realloc(e_pool,
(env_pool_max+ENV_POOL_CHUNK+1) *
sizeof(struct env_pool));
if (new == NULL) {
math_error("malloced_putenv realloc failed");
/*NOTREACHED*/
}
e_pool = new;
for (i=env_pool_max; i <= env_pool_max + ENV_POOL_CHUNK; ++i) {
e_pool[i].getenv = NULL;
}
env_pool_max += ENV_POOL_CHUNK;
}
/*
* store our data into the first e_pool entry
*/
for (i=0; i < env_pool_max; ++i) {
/* skip used entries */
if (e_pool[i].getenv != NULL) {
continue;
}
/* store in this free entry and stop looping */
e_pool[i].getenv = value;
e_pool[i].putenv = str;
++env_pool_cnt;
break;
}
if (i >= env_pool_max) {
math_error("malloced_putenv missed unused entry!!");
/*NOTREACHED*/
}
/*
* finally, do the putenv action
*/
return putenv(str);
}
#endif /* FUNCLIST */

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
#

View File

@@ -7,7 +7,7 @@ Where to get the the latest versions of 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/
http://reality.sgi.com/chongo/tech/comp/calc/
One may join the calc testing group by sending a request to:
@@ -22,10 +22,7 @@ Where to get the the latest versions of calc
where "address" is your EMail address and "your_full_name"
is your full name.
See:
Landon Curt Noll
http://reality.sgi.com/chongo
http://prime.corp.sgi.com/csp/ioccc/noll/noll.html#calc
for details.
Landon Curt Noll <chongo@toad.com> /\oo/\
chongo <was here> /\../\

View File

@@ -8,7 +8,7 @@ We welcome and encourage you to send us:
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
http://reality.sgi.com/chongo/calc/
http://reality.sgi.com/chongo/tech/comp/calc/
You should also consider joining the calc testing group by sending a
request to:
@@ -45,4 +45,7 @@ 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/\
Landon Curt Noll
http://reality.sgi.com/chongo
chongo <was here> /\../\

View File

@@ -34,17 +34,17 @@ Credits
interesting calc scripts that you would like you see included in
future distributions to:
dbell@auug.org.au
chongo@toad.com
calc-tester@postofc.corp.sgi.com
Landon Noll maintains the official calc ftp archive at:
Landon Noll maintains the official calc http/ftp archive at:
ftp://ftp.uu.net/pub/calc
ftp://reality.sgi.com/users/chongo/src/calc
http://reality.sgi.com/chongo/src/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/
http://reality.sgi.com/chongo/tech/comp/calc/
One may join the calc testing group by sending a request to:

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)

236
help/todo
View File

@@ -1,183 +1,71 @@
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 inputlevel() builtin function.
Something like signal isn't versatile enough.
* Write the help file for the display() builtin function.
* Add a debugging capability so that functions can be single stepped,
breakpoints inserted, variables displayed, and so on.
* Write the help file for the stoponerror() builtin function.
* Figure out how to write all variables out to a file, including
deeply nested arrays, lists, and objects.
* Update the errmax about the meaning of errmax(-1).
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.
* Document the new meanings for bit values and the sign of
of config("lib_debug") in the appropriate help file(s).
* 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().
=-=
In some cases, 256 values is too small, in others it is too large.
Medium priority items:
* 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.
* 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 +84,10 @@ 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
* where reasonable, be sure that regress.cal tests builtin functions
* clean the source code and document it better
* Clean the source code and document it better.

215
help/wishlist Normal file
View File

@@ -0,0 +1,215 @@
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.
* 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

48
input.c
View File

@@ -33,8 +33,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 +312,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 +320,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 +331,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 +376,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 +401,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 +409,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 +446,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 +462,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 +515,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 +528,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')
@@ -663,6 +662,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.
@@ -739,6 +748,7 @@ runrcfiles(void)
if (i < 0)
continue;
getcommands(FALSE);
closeinput();
}
}

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 */

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

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

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

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> /\../\
*/

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

@@ -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

@@ -4223,7 +4223,7 @@ define test_random()
/* test range interface some more */
tmp = srandom(state1);
print '5369: tmp = srandom(0)';
print '5369: tmp = srandom(state1)';
vrfy(random(-46,46) == -0x7, '5370: random(-46,46) == -0x7');
vrfy(random(21701,23209) == 23061,
'5371: random(21701,23209) == 23061');
@@ -7393,6 +7393,23 @@ 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');
print '8308: Ending define tests';
/*
* read various calc libs
*

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> /\../\
*/
/*

View File

@@ -4,7 +4,9 @@
* provided that this copyright notice remains intact.
*
* By: Landon Curt Noll
* chongo@toad.com -or- ...!{pyramid,sun,uunet}!hoptoad!chongo
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*
* This library is used by the 1700 series of the regress.cal test suite.
*/

View File

@@ -4,7 +4,9 @@
* provided that this copyright notice remains intact.
*
* By: Landon Curt Noll
* chongo@toad.com -or- ...!{pyramid,sun,uunet}!hoptoad!chongo
* 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.
*/

View File

@@ -180,7 +180,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 +247,7 @@ reinitialize(void)
math_setfp(stdout);
resetscopes();
resetinput();
inittokens();
(void) openterminal();
}

View File

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

View File

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

2
poly.c
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 "value.h"

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 /\../\
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*/
/*
@@ -81,7 +84,7 @@ static QCKHASH blk_hash(BLOCK *blk, QCKHASH val);
* The basis of the hash algorithm was taken from an idea
* sent by Email to the IEEE Posix P1003.2 mailing list from
* Phong Vo (kpv@research.att.com) and Glenn Fowler (gsf@research.att.com).
* Landon Curt Noll (chongo@toad.com) later improved on there
* Landon Curt Noll (http://reality.sgi.com/chongo) later improved on there
* algorithm to come up with Fowler/Noll/Vo hash.
*
* The magic lies in the constant 16777619, which for 32 bit hashing

View File

@@ -27,11 +27,9 @@
# Happy bit twiddling,
#
# 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 -=-=-=-=-=-=-=-=-#
@@ -208,11 +206,6 @@ CALC_LIBS= ../libcalc.a ../custom/libcustcalc.a
###
#
# Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory.
#
# Select your compiler type by commenting out one of the cc sets below:
#
# CCOPT are flags given to ${CC} for optimization
# CCWARN are flags given to ${CC} for warning message control
# CCMISC are misc flags given to ${CC}
@@ -220,32 +213,36 @@ CALC_LIBS= ../libcalc.a ../custom/libcustcalc.a
# CFLAGS are all flags given to ${CC} [[often includes CCOPT, CCWARN, CCMISC]]
# ICFLAGS are given to ${CC} for intermediate progs
#
# CCMAIN are flags for ${CC} when files with main() instead of CFLAGS
#
# LCFLAGS are CC-style flags for ${LINT}
# LDFLAGS are flags given to ${CC} for linking .o files
# ILDFLAGS are flags given to ${CC} for linking .o files for intermediate progs
#
# CC is how the the C compiler is invoked
# LCC how the the C compiler is invoked on locally executed intermediate progs
# CC is how the the C compiler is invoked (with an optional Purify)
#
###
#
# common cc set
# default set
#
CCWARN=
# Normally these values are passed in from the upper level Makefile.
# Change these as needed if you intend to build directly in this directory.
#
# for better performance, set the following above:
# DEBUG= -O2
#
CCWARN= -Wall -Wno-implicit -Wno-comment
CCOPT= ${DEBUG} ${NO_SHARED}
CCMISC=
#
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} ${ALLOW_CUSTOM}
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
ICFLAGS= ${CCWARN} ${CCMISC}
#
CCMAIN= ${ICFLAGS}
#
LCFLAGS=
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
ILDFLAGS=
#
CC= ${PURIFY} cc
LCC= gcc
CC= ${PURIFY} ${LCC}
##############################################################################
#-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#
@@ -286,13 +283,13 @@ SORT= sort
all: ${TARGETS} .all
test_random.o: test_random.c
${CC} ${CCMAIN} ${CCOPT} ${ALLOW_CUSTOM} test_random.c -c
${CC} ${CFLAGS} ${ALLOW_CUSTOM} test_random.c -c
test_random: test_random.o ../libcalc.a
${CC} ${LDFLAGS} test_random.o ${CALC_LIBS} ${LD_DEBUG} -o test_random
many_random.o: many_random.c
${CC} ${CCMAIN} ${CCOPT} ${ALLOW_CUSTOM} many_random.c -c
${CC} ${CFLAGS} ${ALLOW_CUSTOM} many_random.c -c
many_random: many_random.o ../libcalc.a
${CC} ${LDFLAGS} many_random.o ${CALC_LIBS} ${LD_DEBUG} -o many_random

23
seed.c
View File

@@ -28,7 +28,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\ {chongo,noll}@{toad,sgi}.com
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*
* Share and enjoy! :-)
*/
@@ -52,7 +55,9 @@
#include <sys/stat.h>
#include <sys/resource.h>
#include <setjmp.h>
#if !defined(__bsdi)
#include <ustat.h>
#endif /* __bsdi */
#if defined(__linux)
# include <fcntl.h>
# define DEV_URANDOM "/dev/urandom"
@@ -111,8 +116,8 @@ hash_buf(char *buf, unsigned len)
*
* for information on 32bit and 64bit Fowler/Noll/Vo hashes.
*
* Landon Curt Noll (chongo@toad.com) later improved on their
* algorithm to come up with Fowler/Noll/Vo hash.
* Landon Curt Noll (http://reality.sgi.com/chongo) later improved
* on their algorithm to come up with Fowler/Noll/Vo hash.
*
* The 32 hash was able to process 234936 words from the web2 dictionary
* without any 32 bit collisions using a constant of
@@ -214,8 +219,6 @@ pseudo_seed(void)
char urandom_pool[DEV_URANDOM_POOL]; /* /dev/urandom data pool */
#endif /* __linux */
struct timeval tp; /* time of day */
pid_t getsid; /* session ID */
pid_t getpgid; /* process group ID */
pid_t getpid; /* process ID */
pid_t getppid; /* parent process ID */
uid_t getuid; /* real user ID */
@@ -229,6 +232,7 @@ pseudo_seed(void)
struct stat fstat_stdin; /* stat of stdin */
struct stat fstat_stdout; /* stat of stdout */
struct stat fstat_stderr; /* stat of stderr */
#if !defined(__bsdi)
struct ustat ustat_dot; /* usage stat of "." */
struct ustat ustat_dotdot; /* usage stat of ".." */
struct ustat ustat_tmp; /* usage stat of "/tmp" */
@@ -236,6 +240,9 @@ pseudo_seed(void)
struct ustat ustat_stdin; /* usage stat of stdin */
struct ustat ustat_stdout; /* usage stat of stdout */
struct ustat ustat_stderr; /* usage stat of stderr */
pid_t getsid; /* session ID */
pid_t getpgid; /* process group ID */
#endif /* __bsdi */
struct rusage rusage; /* resource utilization */
struct rusage rusage_chld; /* resource utilization of children */
struct timeval tp2; /* time of day again */
@@ -271,8 +278,6 @@ pseudo_seed(void)
}
#endif /* __linux */
(void) gettimeofday(&sdata.tp, NULL);
sdata.getsid = getsid((pid_t)0);
sdata.getpgid = getpgid((pid_t)0);
sdata.getpid = getpid();
sdata.getppid = getppid();
sdata.getuid = getuid();
@@ -286,6 +291,7 @@ pseudo_seed(void)
(void) fstat(0, &sdata.fstat_stdin);
(void) fstat(1, &sdata.fstat_stdout);
(void) fstat(2, &sdata.fstat_stderr);
#if !defined(__bsdi)
(void) ustat(sdata.stat_dotdot.st_dev, &sdata.ustat_dotdot);
(void) ustat(sdata.stat_dot.st_dev, &sdata.ustat_dot);
(void) ustat(sdata.stat_tmp.st_dev, &sdata.ustat_tmp);
@@ -293,6 +299,9 @@ pseudo_seed(void)
(void) ustat(sdata.fstat_stdin.st_dev, &sdata.ustat_stdin);
(void) ustat(sdata.fstat_stdout.st_dev, &sdata.ustat_stdout);
(void) ustat(sdata.fstat_stderr.st_dev, &sdata.ustat_stderr);
sdata.getsid = getsid((pid_t)0);
sdata.getpgid = getpgid((pid_t)0);
#endif /* __bsdi */
(void) getrusage(RUSAGE_SELF, &sdata.rusage);
(void) getrusage(RUSAGE_CHILDREN, &sdata.rusage_chld);
(void) gettimeofday(&sdata.tp2, NULL);

7
shs.c
View File

@@ -11,7 +11,10 @@
*
* This file was Modified/Re-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.
@@ -26,7 +29,7 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Based on Version 2.11 (09 Mar 1995) from Landon Curt Noll's
* (chongo@toad.com) shs hash program.
* (http://reality.sgi.com/chongo) shs hash program.
*
****
*

5
shs.h
View File

@@ -11,7 +11,10 @@
*
* This file was Modified 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.

5
shs1.c
View File

@@ -5,7 +5,10 @@
*
* This file was Modified/Re-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.

5
shs1.h
View File

@@ -5,7 +5,10 @@
*
* This file was Modified 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

@@ -1142,7 +1142,7 @@ initstrings(void)
/*
* addstring is called only from token.c
* When called, len is length if string including '\0'
* When called, len is length of string including '\0'
*/
long
addstring(char *str, long len)

View File

@@ -458,6 +458,7 @@ eatstring(int quotechar)
}
memcpy(str + totlen, buf, len);
totlen += len;
len = 0;
}
}
curtoken.t_strindex = addstring(str, totlen + len);

View File

@@ -12,7 +12,7 @@
#define MAJOR_VER 2 /* major version */
#define MINOR_VER 11 /* minor version */
#define MAJOR_PATCH 0 /* patch level or 0 if no patch */
#define MINOR_PATCH "7.2" /* test number or empty string if no patch */
#define MINOR_PATCH "8" /* test number or empty string if no patch */
/*
* calc version constants

View File

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

View File

@@ -29,11 +29,9 @@
* Happy bit twiddling,
*
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
/*
* random number generator - see zrand.c for details

106
zrandom.c
View File

@@ -29,11 +29,9 @@
* Happy bit twiddling,
*
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
/*
@@ -1571,6 +1569,12 @@ static RANDOM random_pregen[BLUM_PREGEN] = {
};
/*
* forward static declarations
*/
static void zfree_random(ZVALUE z);
/*
* zsrandom1 - seed the Blum generator 1 arg style
*
@@ -1647,7 +1651,7 @@ zsrandom1(CONST ZVALUE seed, BOOL need_ret)
do {
/* free temp storage */
if (last_r.v != NULL) {
zfree(last_r);
zfree_random(last_r);
}
/*
@@ -1657,10 +1661,10 @@ zsrandom1(CONST ZVALUE seed, BOOL need_ret)
last_r = r;
zsquaremod(last_r, blum.n, &r);
} while (zrel(r, last_r) > 0);
zfree(blum.r);
zfree_random(blum.r);
blum.r = r;
/* free temp storage */
zfree(last_r);
zfree_random(last_r);
/*
* reserved seed
@@ -1741,7 +1745,7 @@ zsrandom2(CONST ZVALUE seed, CONST ZVALUE newn)
math_error("srandom small newn must be [1,20]");
/*NOTREACHED*/
}
zfree(blum.n);
zfree_random(blum.n);
zcopy(random_pregen[set-1].n, &blum.n);
blum.loglogn = random_pregen[set-1].loglogn;
blum.mask = random_pregen[set-1].mask;
@@ -1750,7 +1754,7 @@ zsrandom2(CONST ZVALUE seed, CONST ZVALUE newn)
* reset initial seed as well if seed is 0
*/
if (ziszero(seed)) {
zfree(blum.r);
zfree_random(blum.r);
zcopy(random_pregen[set-1].r, &blum.r);
/*
@@ -1785,7 +1789,7 @@ zsrandom2(CONST ZVALUE seed, CONST ZVALUE newn)
* of two primes.
*/
/* load modulus */
zfree(blum.n);
zfree_random(blum.n);
zcopy(newn, &blum.n);
/*
@@ -1894,11 +1898,11 @@ zsrandom4(CONST ZVALUE seed, CONST ZVALUE ip, CONST ZVALUE iq, long trials)
/*
* form the Blum modulus
*/
zfree(blum.n);
zfree_random(blum.n);
zmul(p, q, &blum.n);
/* free temp storage */
zfree(p);
zfree(q);
zfree_random(p);
zfree_random(q);
/*
* form the loglogn and mask
@@ -2045,7 +2049,7 @@ zrandomskip(long cnt)
/* turn the Blum-Blum-Shub crank */
zsquaremod(blum.r, blum.n, &new_r);
zfree(blum.r);
zfree_random(blum.r);
blum.r = new_r;
cnt -= blum.loglogn;
}
@@ -2057,7 +2061,7 @@ zrandomskip(long cnt)
/* turn the Blum-Blum-Shub crank */
zsquaremod(blum.r, blum.n, &new_r);
zfree(blum.r);
zfree_random(blum.r);
blum.r = new_r;
/* fill the buffer with the unused bits */
@@ -2197,7 +2201,7 @@ zrandom(long cnt, ZVALUE *res)
* turn the Blum-Blum-Shub crank
*/
zsquaremod(blum.r, blum.n, &new_r);
zfree(blum.r);
zfree_random(blum.r);
blum.r = new_r;
/* peal off the bottom loglogn bits */
blum.buffer = (blum.r.v[0] & mask);
@@ -2228,7 +2232,7 @@ zrandom(long cnt, ZVALUE *res)
*/
/* turn the Blum-Blum-Shub crank */
zsquaremod(blum.r, blum.n, &new_r);
zfree(blum.r);
zfree_random(blum.r);
blum.r = new_r;
/* peal off the bottom loglogn bits */
blum.buffer = (blum.r.v[0] & mask);
@@ -2282,13 +2286,13 @@ zrandomrange(CONST ZVALUE low, CONST ZVALUE high, ZVALUE *res)
*/
zsub(high, low, &range);
if (zisone(range)) {
zfree(range);
zfree_random(range);
*res = low;
return;
}
zsub(range, _one_, &rangem1);
bitlen = 1+zhighbit(rangem1);
zfree(rangem1);
zfree_random(rangem1);
/*
* generate a random value between [0, diff)
@@ -2302,7 +2306,7 @@ zrandomrange(CONST ZVALUE low, CONST ZVALUE high, ZVALUE *res)
rval.v = NULL;
do {
if (rval.v != NULL) {
zfree(rval);
zfree_random(rval);
}
zrandom(bitlen, &rval);
} while (zrel(rval, range) >= 0);
@@ -2312,8 +2316,8 @@ zrandomrange(CONST ZVALUE low, CONST ZVALUE high, ZVALUE *res)
* which is the range [low, high)
*/
zadd(rval, low, res);
zfree(rval);
zfree(range);
zfree_random(rval);
zfree_random(range);
}
@@ -2341,8 +2345,8 @@ irandom(long s)
itoz(s, &z1);
zrandomrange(_zero_, z1, &z2);
res = ztoi(z2);
zfree(z1);
zfree(z2);
zfree_random(z1);
zfree_random(z2);
return res;
}
@@ -2376,14 +2380,22 @@ randomcopy(CONST RANDOM *state)
*ret = *state;
if (state->r.v == NULL) {
ret->r.v = NULL;
} else {
if (state->r.v == h_rdefvec) {
ret->r.v = state->r.v;
} else {
zcopy(state->r, &ret->r);
}
}
if (state->n.v == NULL) {
ret->n.v = NULL;
} else {
if (state->n.v == h_ndefvec) {
ret->n.v = state->n.v;
} else {
zcopy(state->n, &ret->n);
}
}
/*
* return copy
@@ -2414,12 +2426,8 @@ randomfree(RANDOM *state)
}
/* free the values */
if (state->n.v != h_ndefvec) {
zfree(state->n);
}
if (state->r.v != h_rdefvec) {
zfree(state->r);
}
zfree_random(state->n);
zfree_random(state->r);
/* free it if it is not pre-defined */
state->seeded = 0;
@@ -2505,9 +2513,43 @@ randomprint(CONST RANDOM *state, int flags)
void
random_libcalc_cleanup(void)
{
/* free if we are seeded now */
if (blum.seeded) {
/* free our state - let zfree_random protect the default state */
randomfree(&blum);
return;
}
/*
* zfree_random - perform a zfree if we are not trying to free static data
*
* given:
* z the ZVALUE to zfree(z) if not pointing to static data
*/
static void
zfree_random(ZVALUE z)
{
if (z.v != h_ndefvec && z.v != h_rdefvec && z.v != h_rdefvec_2 &&
z.v != h_nvec01 && z.v != h_rvec01 &&
z.v != h_nvec02 && z.v != h_rvec02 &&
z.v != h_nvec03 && z.v != h_rvec03 &&
z.v != h_nvec04 && z.v != h_rvec04 &&
z.v != h_nvec05 && z.v != h_rvec05 &&
z.v != h_nvec06 && z.v != h_rvec06 &&
z.v != h_nvec07 && z.v != h_rvec07 &&
z.v != h_nvec08 && z.v != h_rvec08 &&
z.v != h_nvec09 && z.v != h_rvec09 &&
z.v != h_nvec10 && z.v != h_rvec10 &&
z.v != h_nvec11 && z.v != h_rvec11 &&
z.v != h_nvec12 && z.v != h_rvec12 &&
z.v != h_nvec13 && z.v != h_rvec13 &&
z.v != h_nvec14 && z.v != h_rvec14 &&
z.v != h_nvec15 && z.v != h_rvec15 &&
z.v != h_nvec16 && z.v != h_rvec16 &&
z.v != h_nvec17 && z.v != h_rvec17 &&
z.v != h_nvec18 && z.v != h_rvec18 &&
z.v != h_nvec19 && z.v != h_rvec19 &&
z.v != h_nvec20 && z.v != h_rvec20) {
zfree(z);
}
return;
}

View File

@@ -29,11 +29,9 @@
* Happy bit twiddling,
*
* Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo@toad.com
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
* chongo <was here> /\../\
*/
/*
* random number generator - see zrandom.c for details