Compare commits

...

10 Commits

Author SHA1 Message Date
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
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
Landon Curt Noll
9204d2fb8c Release calc version 2.11.0t7.2 2017-05-21 15:38:28 -07:00
114 changed files with 2810 additions and 1244 deletions

70
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: 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: 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 * 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: * cd to the calc source directory, and type:
@@ -66,26 +66,58 @@ 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 * calc -i ignores quit binding or EOF input in some cases. For example:
for builtins are either inconsistent or missing information.
* Many of the LIBRARY sections are incorrect now that libcalc.a echo 'define f(x) { ' > myfile
contains most of the calc system. calc -i read myfile
"./myfile", line 2: End-of-file in function body
Error in commands
>
* There is some places in the source with obscure variable names At this point, calc will re-prompt if you give it an EOF, or
and not much in the way of comments. We need some major cleanup type ^D while using lib/altbind or while ^D is bound to quit.
and documentation.
* On a Dec Alpha, using the Dec Alpha cc (not gcc) make check for * When compiled on Solaris with the Solaris cc using -Xc option
version 2.11.0t5.1 fails in the regression test: (which forces BASEB=16) and without -DFORCE_STDC, calc fails
regression test #8218 because hash(a,s), where a = isqrt(2e1000)
and s = "xyz", returns 1418255679 instead of 2378490456.
From vandermj@molbio.sbphrd.com Tue Oct 5 04:06:52 1999 We are sure some more bugs exist. When you find them, please let
Subject: Re: oops, try calc version 2.10.0t5.1 us know! See the above for details on how to report and were to
Date: Tue, 05 Oct 1999 07:06:30 -0400 EMail your bug reports and hopefully patches to fix them.
Regular cc on Dec alpha, 'make check' dies with: =-=
1804: surd_value(a) == 2+3i Calc Mis-features:
"": line 1706: Calling qfreenum with nozero links!!!
* 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.

182
CHANGES
View File

@@ -1,4 +1,136 @@
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.
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";
}
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: Calc has some new command line flags / command line meaning:
(Thanks goes to Ernest Bowen <ernie@turing.une.edu.au>) (Thanks goes to Ernest Bowen <ernie@turing.une.edu.au>)
@@ -103,6 +235,48 @@ Following is the change from calc version 2.11.0t7 to date:
n == 0 if -c, continue, without -c, stop n == 0 if -c, continue, without -c, stop
n < 0 continue on error, even if -c was given on the command line n < 0 continue on error, even if -c was given on the command line
Calc compilation now stops at the first scanerror.
Restored the feature where -p disables the printing of leading tabs
as of config("tab",0) had been executed. So using calc in a pipe:
calc -p 2+17 | whey
will write '19' instead of '\t19' to the whey command.
Updated calc man page and help/usage file to reflect recent
command line changes.
Converted start_done into a general calc run state enum called
run_state within the calc source.
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.
Following is the change from calc version 2.11.0t1 to 2.11.0t6.3: Following is the change from calc version 2.11.0t1 to 2.11.0t6.3:
@@ -3677,9 +3851,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: 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 The 'show' command by itself will issue an error message
that will remind one of the possible show arguments. that will remind one of the possible show arguments.
(thanks to Ha S. Lam <hl@kuhep4.phsx.ukans.edu>) (thanks to Ha S. Lam <hl@kuhep4.phsx.ukans.edu>)
@@ -3727,9 +3898,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: 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. 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 A number of systems that have both <varargs.h> and <stdarg.h> do

492
Makefile
View File

@@ -106,7 +106,7 @@ LONGLONG_BITS=
# to determine if there is are fgetpos and fsetpos functions. If HAVE_FPOS # 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(). # 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=
#HAVE_FPOS= -DHAVE_NO_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 # -DOFF_T_NON_SCALAR when calc will assume that off_t some sort of
# union or struct which. # 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=
#HAVE_OFFSCL= -DOFF_T_NON_SCALAR #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 # -DFILEPOS_NON_SCALAR when calc will assume that fpos_t exists and is
# some sort of union or struct which. # 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=
#HAVE_POSSCL= -DFILEPOS_NON_SCALAR #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, # to determine if const is supported. If HAVE_CONST is set to -DHAVE_NO_CONST,
# then calc will not use 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=
#HAVE_CONST= -DHAVE_NO_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 # 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. # $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=
#HAVE_UID_T= -DHAVE_NO_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 # of memcpy(), use bfill() instead of memset(), and use index() instead of
# strchr(). # 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=
#HAVE_NEWSTR= -DHAVE_NO_NEWSTR #HAVE_NEWSTR= -DHAVE_NO_NEWSTR
@@ -184,11 +184,83 @@ HAVE_NEWSTR=
# -DHAVE_NO_MEMMOVE, then calc will use internal functions to simulate # -DHAVE_NO_MEMMOVE, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes. # 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=
#HAVE_MEMMOVE= -DHAVE_NO_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 # Some architectures such as Sparc do not allow one to access 32 bit values
# that are not alligned on a 32 bit boundary. # that are not alligned on a 32 bit boundary.
# #
@@ -352,7 +424,7 @@ CALCPAGER= more
#CALCPAGER= cat #CALCPAGER= cat
#CALCPAGER= less #CALCPAGER= less
# Debug/Optimize options for ${CC} # Debug/Optimize options for ${CC} and ${LCC}
# #
#DEBUG= -O #DEBUG= -O
#DEBUG= -O -g #DEBUG= -O -g
@@ -393,7 +465,7 @@ NO_SHARED=
#NO_SHARED= -non_shared #NO_SHARED= -non_shared
# On some systems where you are disabling dynamic shared libs, you may # 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 # System type NO_SHARED recommendation
# #
@@ -516,13 +588,12 @@ ALLOW_CUSTOM= -DCUSTOM
# CFLAGS are all flags given to ${CC} [[often includes CCOPT, CCWARN, CCMISC]] # CFLAGS are all flags given to ${CC} [[often includes CCOPT, CCWARN, CCMISC]]
# ICFLAGS are given to ${CC} for intermediate progs # 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} # LCFLAGS are CC-style flags for ${LINT}
# LDFLAGS are flags given to ${CC} for linking .o files # LDFLAGS are flags given to ${CC} for linking .o files
# ILDFLAGS are flags given to ${CC} for linking .o files for intermediate progs # 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 +611,12 @@ CCMISC=
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
ICFLAGS= ${CCWARN} ${CCMISC} ICFLAGS= ${CCWARN} ${CCMISC}
# #
CCMAIN= ${ICFLAGS}
#
LCFLAGS= LCFLAGS=
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
ILDFLAGS= ILDFLAGS=
# #
CC= ${PURIFY} gcc LCC= gcc
CC= ${PURIFY} ${LCC}
# #
### ###
# #
@@ -562,14 +632,13 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS= #ILDFLAGS=
# #
#CC= ${PURIFY} gcc #LCC= gcc
#CC= ${PURIFY} gcc2 #LCC= gcc2
#CC= ${PURIFY} ${LCC}
# #
### ###
# #
@@ -582,13 +651,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS= #ILDFLAGS=
# #
#CC= ${PURIFY} cc #LCC= cc
#CC= ${PURIFY} ${LCC}
# #
### ###
# #
@@ -613,13 +681,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS= #ILDFLAGS=
# #
#CC= ${PURIFY} cc -n32 -xansi #LCC= cc -n32 -xansi
#CC= ${PURIFY} ${LCC}
# #
### ###
# #
@@ -638,13 +705,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS= #ILDFLAGS=
# #
#CC= ${PURIFY} cc #LCC= cc
#CC= ${PURIFY} ${LCC}
# #
### ###
# #
@@ -657,13 +723,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS= #ILDFLAGS=
# #
#CC= ${PURIFY} cc #LCC= cc
#CC= ${PURIFY} ${LCC}
# #
### ###
# #
@@ -682,13 +747,12 @@ CC= ${PURIFY} gcc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS= #ILDFLAGS=
# #
#CC= ${PURIFY} cc #LCC= cc
#CC= ${PURIFY} ${LCC}
# #
### ###
# #
@@ -702,15 +766,14 @@ CC= ${PURIFY} gcc
#CCMISC= #CCMISC=
# #
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC} -Wno-unused
#
#CCMAIN= ${ICFLAGS}
# #
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS= #ILDFLAGS=
# #
#CC= ${PURIFY} gcc #LCC= gcc
#CC= ${PURIFY} ${LCC}
# #
### ###
# #
@@ -724,15 +787,14 @@ CC= ${PURIFY} gcc
#CCMISC= #CCMISC=
# #
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC} -Wno-unused
#
#CCMAIN= ${ICFLAGS}
# #
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS= #ILDFLAGS=
# #
#CC= ${PURIFY} cc #LCC= cc
#CC= ${PURIFY} ${LCC}
############################################################################## ##############################################################################
#-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-# #-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#
@@ -819,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 \ fposval.h have_const.h have_fpos.h have_malloc.h \
have_memmv.h have_newstr.h have_offscl.h have_posscl.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_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 # we build these .c files during the make
# #
@@ -831,7 +895,9 @@ BUILD_C_SRC= calcerr.c
# #
UTIL_C_SRC= align32.c endian.c longbits.c have_newstr.c have_uid_t.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 \ 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 # these awk and sed tools are used in the process of building BUILD_H_SRC
# and BUILD_C_SRC # and BUILD_C_SRC
@@ -845,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 \ 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_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 \ 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 # these utility progs may be used in the process of building BUILD_H_SRC
# #
UTIL_PROGS= align32 fposval have_uid_t longlong have_const \ 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. # These files are required by the regress.cal regression test.
# #
@@ -887,6 +958,7 @@ CUSTOM_PASSDOWN= Q="${Q}" \
LCFLAGS="${LCFLAGS}" \ LCFLAGS="${LCFLAGS}" \
LDFLAGS="${LDFLAGS}" \ LDFLAGS="${LDFLAGS}" \
ILDFLAGS="${ILDFLAGS}" \ ILDFLAGS="${ILDFLAGS}" \
LCC="${LCC}" \
CC="${CC}" \ CC="${CC}" \
MAKE_FILE=${MAKE_FILE} \ MAKE_FILE=${MAKE_FILE} \
SED=${SED} \ SED=${SED} \
@@ -909,11 +981,11 @@ SAMPLE_PASSDOWN= Q="${Q}" \
CCMISC="${CCMISC}" \ CCMISC="${CCMISC}" \
CFLAGS="${CFLAGS} ${ALLOW_CUSTOM}" \ CFLAGS="${CFLAGS} ${ALLOW_CUSTOM}" \
ICFLAGS="${ICFLAGS}" \ ICFLAGS="${ICFLAGS}" \
CCMAIN="${CCMAIN}" \
LCFLAGS="${LCFLAGS}" \ LCFLAGS="${LCFLAGS}" \
LDFLAGS="${LDFLAGS}" \ LDFLAGS="${LDFLAGS}" \
ILDFLAGS="${ILDFLAGS}" \ ILDFLAGS="${ILDFLAGS}" \
CALC_LIBS="../libcalc.a ../custom/libcustcalc.a" \ CALC_LIBS="../libcalc.a ../custom/libcustcalc.a" \
LCC="${LCC}" \
CC="${CC}" \ CC="${CC}" \
MAKE_FILE=${MAKE_FILE} \ MAKE_FILE=${MAKE_FILE} \
SED=${SED} \ SED=${SED} \
@@ -931,7 +1003,7 @@ C_SRC= ${LIBSRC} ${CALCSRC} ${UTIL_C_SRC}
# These files are found (but not built) in the distribution # These files are found (but not built) in the distribution
# #
DISTLIST= ${C_SRC} ${H_SRC} ${MAKE_FILE} BUGS CHANGES LIBRARY README \ 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 # complete list of .o files
# #
@@ -981,7 +1053,7 @@ calc.1: calc.man ${MAKE_FILE}
## ##
calc.o: calc.c ${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} custom.o: custom.c ${MAKE_FILE}
${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c custom.c ${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c custom.c
@@ -1379,8 +1451,8 @@ longlong.h: longlong.c have_stdlib.h have_string.h ${MAKE_FILE}
${Q}echo '' >> longlong.h ${Q}echo '' >> longlong.h
${Q}echo '/* do we have/want to use a long long type? */' >> longlong.h ${Q}echo '/* do we have/want to use a long long type? */' >> longlong.h
-${Q}rm -f longlong.o longlong -${Q}rm -f longlong.o longlong
-${Q}${CC} ${CCMAIN} longlong.c -c 2>/dev/null; true -${Q}${LCC} ${ICFLAGS} longlong.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} longlong.o -o longlong 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" \ -${Q}${SHELL} -c "./longlong ${LONGLONG_BITS} > ll_tmp 2>/dev/null" \
>/dev/null 2>&1; true >/dev/null 2>&1; true
-${Q}if [ -s ll_tmp ]; then \ -${Q}if [ -s ll_tmp ]; then \
@@ -1418,8 +1490,8 @@ have_fpos.h: have_fpos.c ${MAKE_FILE}
${Q}echo '' >> have_fpos.h ${Q}echo '' >> have_fpos.h
${Q}echo '/* do we have fgetpos & fsetpos functions? */' >> have_fpos.h ${Q}echo '/* do we have fgetpos & fsetpos functions? */' >> have_fpos.h
-${Q}rm -f have_fpos.o have_fpos -${Q}rm -f have_fpos.o have_fpos
-${Q}${CC} ${HAVE_FPOS} ${CCMAIN} have_fpos.c -c 2>/dev/null; true -${Q}${LCC} ${HAVE_FPOS} ${ICFLAGS} have_fpos.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} have_fpos.o -o have_fpos 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" \ -${Q}${SHELL} -c "./have_fpos > fpos_tmp 2>/dev/null" \
>/dev/null 2>&1; true >/dev/null 2>&1; true
-${Q}if [ -s fpos_tmp ]; then \ -${Q}if [ -s fpos_tmp ]; then \
@@ -1459,8 +1531,8 @@ fposval.h: fposval.c have_fpos.h have_offscl.h have_posscl.h \
${Q}echo '' >> fposval.h ${Q}echo '' >> fposval.h
${Q}echo '/* what are our file position & size types? */' >> fposval.h ${Q}echo '/* what are our file position & size types? */' >> fposval.h
-${Q}rm -f fposval.o fposval -${Q}rm -f fposval.o fposval
-${Q}${CC} ${CCMAIN} fposval.c -c 2>/dev/null; true -${Q}${LCC} ${ICFLAGS} fposval.c -c 2>/dev/null; true
-${Q}${CC} ${ILDFLAGS} fposval.o -o fposval 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" \ ${Q}${SHELL} -c "./fposval fposv_tmp >> fposval.h 2>/dev/null" \
>/dev/null 2>&1; true >/dev/null 2>&1; true
${Q}echo '' >> fposval.h ${Q}echo '' >> fposval.h
@@ -1492,8 +1564,8 @@ have_const.h: have_const.c ${MAKE_FILE}
${Q}echo '' >> have_const.h ${Q}echo '' >> have_const.h
${Q}echo '/* do we have or want const? */' >> have_const.h ${Q}echo '/* do we have or want const? */' >> have_const.h
-${Q}rm -f have_const.o have_const -${Q}rm -f have_const.o have_const
-${Q}${CC} ${CCMAIN} ${HAVE_CONST} have_const.c -c 2>/dev/null; true -${Q}${LCC} ${ICFLAGS} ${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} ${ILDFLAGS} have_const.o -o have_const 2>/dev/null; true
-${Q}${SHELL} -c "./have_const > const_tmp 2>/dev/null" \ -${Q}${SHELL} -c "./have_const > const_tmp 2>/dev/null" \
>/dev/null 2>&1; true >/dev/null 2>&1; true
-${Q}if [ -s const_tmp ]; then \ -${Q}if [ -s const_tmp ]; then \
@@ -1531,8 +1603,8 @@ have_offscl.h: have_offscl.c ${MAKE_FILE}
${Q}echo '' >> have_offscl.h ${Q}echo '' >> have_offscl.h
${Q}echo '' >> have_offscl.h ${Q}echo '' >> have_offscl.h
-${Q}rm -f have_offscl.o have_offscl -${Q}rm -f have_offscl.o have_offscl
-${Q}${CC} ${CCMAIN} ${HAVE_OFFSCL} have_offscl.c -c 2>/dev/null; true -${Q}${LCC} ${ICFLAGS} ${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} ${ILDFLAGS} have_offscl.o -o have_offscl 2>/dev/null; true
-${Q}${SHELL} -c "./have_offscl > offscl_tmp 2>/dev/null" \ -${Q}${SHELL} -c "./have_offscl > offscl_tmp 2>/dev/null" \
>/dev/null 2>&1; true >/dev/null 2>&1; true
-${Q}if [ -s offscl_tmp ]; then \ -${Q}if [ -s offscl_tmp ]; then \
@@ -1569,8 +1641,8 @@ have_posscl.h: have_posscl.c have_fpos.h ${MAKE_FILE}
${Q}echo '' >> have_posscl.h ${Q}echo '' >> have_posscl.h
${Q}echo '' >> have_posscl.h ${Q}echo '' >> have_posscl.h
-${Q}rm -f have_posscl.o have_posscl -${Q}rm -f have_posscl.o have_posscl
-${Q}${CC} ${CCMAIN} ${HAVE_POSSCL} have_posscl.c -c 2>/dev/null; true -${Q}${LCC} ${ICFLAGS} ${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} ${ILDFLAGS} have_posscl.o -o have_posscl 2>/dev/null; true
-${Q}${SHELL} -c "./have_posscl > posscl_tmp 2>/dev/null" \ -${Q}${SHELL} -c "./have_posscl > posscl_tmp 2>/dev/null" \
>/dev/null 2>&1; true >/dev/null 2>&1; true
-${Q}if [ -s posscl_tmp ]; then \ -${Q}if [ -s posscl_tmp ]; then \
@@ -1621,8 +1693,8 @@ align32.h: align32.c longbits.h have_unistd.h ${MAKE_FILE}
fi fi
-${Q}if [ X = X${ALIGN32} ]; then \ -${Q}if [ X = X${ALIGN32} ]; then \
rm -f align32.o align32; \ rm -f align32.o align32; \
${CC} ${CCMAIN} ${ALIGN32} align32.c -c 2>/dev/null; \ ${LCC} ${ICFLAGS} ${ALIGN32} align32.c -c 2>/dev/null; \
${CC} ${ILDFLAGS} align32.o -o align32 2>/dev/null; \ ${LCC} ${ILDFLAGS} align32.o -o align32 2>/dev/null; \
${SHELL} -c "./align32 >align32_tmp 2>/dev/null" >/dev/null 2>&1; \ ${SHELL} -c "./align32 >align32_tmp 2>/dev/null" >/dev/null 2>&1; \
if [ -s align32_tmp ]; then \ if [ -s align32_tmp ]; then \
cat align32_tmp >> align32.h; \ cat align32_tmp >> align32.h; \
@@ -1662,8 +1734,8 @@ have_uid_t.h: have_uid_t.c have_unistd.h ${MAKE_FILE}
${Q}echo '' >> have_uid_t.h ${Q}echo '' >> have_uid_t.h
${Q}echo '/* do we have or want uid_t? */' >> 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}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}${LCC} ${ICFLAGS} ${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} ${ILDFLAGS} have_uid_t.o -o have_uid_t 2>/dev/null; true
-${Q}${SHELL} -c "./have_uid_t > uid_tmp 2>/dev/null" \ -${Q}${SHELL} -c "./have_uid_t > uid_tmp 2>/dev/null" \
>/dev/null 2>&1; true >/dev/null 2>&1; true
-${Q}if [ -s uid_tmp ]; then \ -${Q}if [ -s uid_tmp ]; then \
@@ -1701,8 +1773,8 @@ have_newstr.h: have_newstr.c ${MAKE_FILE}
${Q}echo '/* do we have or want memcpy(), memset() & strchr()? */' \ ${Q}echo '/* do we have or want memcpy(), memset() & strchr()? */' \
>> have_newstr.h >> have_newstr.h
-${Q}rm -f have_newstr.o have_newstr -${Q}rm -f have_newstr.o have_newstr
-${Q}${CC} ${CCMAIN} ${HAVE_NEWSTR} have_newstr.c -c 2>/dev/null; true -${Q}${LCC} ${ICFLAGS} ${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} ${ILDFLAGS} have_newstr.o -o have_newstr 2>/dev/null; true
-${Q}${SHELL} -c "./have_newstr > newstr_tmp 2>/dev/null" \ -${Q}${SHELL} -c "./have_newstr > newstr_tmp 2>/dev/null" \
>/dev/null 2>&1; true >/dev/null 2>&1; true
-${Q}if [ -s newstr_tmp ]; then \ -${Q}if [ -s newstr_tmp ]; then \
@@ -1726,7 +1798,7 @@ have_newstr.h: have_newstr.c ${MAKE_FILE}
fi fi
have_memmv.h: have_memmv.c ${MAKE_FILE} 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 'forming have_memmv.h'
${Q}echo '/*' > have_memmv.h ${Q}echo '/*' > have_memmv.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_memmv.h ${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_memmv.h
@@ -1739,19 +1811,19 @@ have_memmv.h: have_memmv.c ${MAKE_FILE}
${Q}echo '' >> have_memmv.h ${Q}echo '' >> have_memmv.h
${Q}echo '/* do we have or want memmove()? */' >> have_memmv.h ${Q}echo '/* do we have or want memmove()? */' >> have_memmv.h
-${Q}rm -f have_memmv.o have_memmv -${Q}rm -f have_memmv.o have_memmv
-${Q}${CC} ${CCMAIN} ${HAVE_MEMMOVE} have_memmv.c -c 2>/dev/null; true -${Q}${LCC} ${ICFLAGS} ${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} ${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 >/dev/null 2>&1; true
-${Q}if [ -s newstr_tmp ]; then \ -${Q}if [ -s memmv_tmp ]; then \
cat newstr_tmp >> have_memmv.h; \ cat memmv_tmp >> have_memmv.h; \
else \ else \
echo '#undef HAVE_MEMMOVE /* no */' >> have_memmv.h; \ echo '#undef HAVE_MEMMOVE /* no */' >> have_memmv.h; \
fi fi
${Q}echo '' >> have_memmv.h ${Q}echo '' >> have_memmv.h
${Q}echo '' >> have_memmv.h ${Q}echo '' >> have_memmv.h
${Q}echo '#endif /* !__HAVE_MEMMV_H__ */' >> 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' ${Q}echo 'have_memmv.h formed'
-@if [ -z "${Q}" ]; then \ -@if [ -z "${Q}" ]; then \
echo ''; \ echo ''; \
@@ -1763,6 +1835,231 @@ have_memmv.h: have_memmv.c ${MAKE_FILE}
true; \ true; \
fi 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 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}rm -f args.h have_args
${Q}echo 'forming args.h' ${Q}echo 'forming args.h'
@@ -1776,8 +2073,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}echo '' >> args.h ${Q}echo '' >> args.h
-${Q}rm -f have_stdvs.o have_stdvs -${Q}rm -f have_stdvs.o have_stdvs
-${Q}${CC} ${CCMAIN} ${HAVE_VSPRINTF} have_stdvs.c -c 2>/dev/null; true -${Q}${LCC} ${ICFLAGS} ${HAVE_VSPRINTF} have_stdvs.c -c \
-${Q}${CC} ${ILDFLAGS} have_stdvs.o -o have_stdvs 2>/dev/null; true 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 \ -${Q}if ./have_stdvs >>args.h 2>/dev/null; then \
touch have_args; \ touch have_args; \
else \ else \
@@ -1785,8 +2083,9 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
fi fi
-${Q}if [ ! -f have_args ] && [ X"${HAVE_VSPRINTF}" = X ]; then \ -${Q}if [ ! -f have_args ] && [ X"${HAVE_VSPRINTF}" = X ]; then \
rm -f have_stdvs.o have_stdvs have_varvs.o have_varvs; \ rm -f have_stdvs.o have_stdvs have_varvs.o have_varvs; \
${CC} ${CCMAIN} -DDONT_HAVE_VSPRINTF have_varvs.c -c 2>/dev/null; \ ${LCC} ${ICFLAGS} -DDONT_HAVE_VSPRINTF have_varvs.c -c \
${CC} ${ILDFLAGS} have_varvs.o -o have_varvs 2>/dev/null; \ 2>/dev/null; \
${LCC} ${ILDFLAGS} have_varvs.o -o have_varvs 2>/dev/null; \
if ./have_varvs >>args.h 2>/dev/null; then \ if ./have_varvs >>args.h 2>/dev/null; then \
touch have_args; \ touch have_args; \
else \ else \
@@ -1865,17 +2164,17 @@ calc_errno.h: calc_errno.c ${MAKE_FILE}
echo 'extern int sys_nerr; ' \ echo 'extern int sys_nerr; ' \
'/* number of system errors */' >> calc_errno.h; \ '/* number of system errors */' >> calc_errno.h; \
else \ else \
${CC} ${CCMAIN} -DTRY_ERRNO_NO_DECL \ ${LCC} ${ICFLAGS} -DTRY_ERRNO_NO_DECL \
calc_errno.c -o calc_errno 2>calc_errno_tmp; \ calc_errno.c -o calc_errno 2>calc_errno_tmp; \
if [ -x ./calc_errno ]; then \ if [ -x ./calc_errno ]; then \
./calc_errno >> calc_errno.h; \ ./calc_errno >> calc_errno.h; \
else \ else \
${CC} ${CCMAIN} -DTRY_ERRNO_STD_DECL \ ${LCC} ${ICFLAGS} -DTRY_ERRNO_STD_DECL \
calc_errno.c -o calc_errno 2>calc_errno_tmp; \ calc_errno.c -o calc_errno 2>calc_errno_tmp; \
if [ -x ./calc_errno ]; then \ if [ -x ./calc_errno ]; then \
./calc_errno >> calc_errno.h; \ ./calc_errno >> calc_errno.h; \
else \ else \
${CC} ${CCMAIN} -DTRY_ERRNO_OLD_DECL \ ${LCC} ${ICFLAGS} -DTRY_ERRNO_OLD_DECL \
calc_errno.c -o calc_errno 2>calc_errno_tmp; \ calc_errno.c -o calc_errno 2>calc_errno_tmp; \
if [ -x ./calc_errno ]; then \ if [ -x ./calc_errno ]; then \
./calc_errno >> calc_errno.h; \ ./calc_errno >> calc_errno.h; \
@@ -1971,16 +2270,16 @@ calcerr.c: calcerr.tbl calcerr_c.sed calcerr_c.awk ${MAKE_FILE}
## ##
endian.o: endian.c have_unistd.h endian.o: endian.c have_unistd.h
${CC} ${CCMAIN} endian.c -c ${LCC} ${ICFLAGS} endian.c -c
endian: endian.o endian: endian.o
${CC} ${ILDFLAGS} endian.o -o endian ${LCC} ${ICFLAGS} endian.o -o endian
longbits.o: longbits.c longlong.h have_unistd.h longbits.o: longbits.c longlong.h have_unistd.h
${CC} ${CCMAIN} longbits.c -c ${LCC} ${ICFLAGS} longbits.c -c
longbits: longbits.o longbits: longbits.o
${CC} ${ILDFLAGS} longbits.o -o longbits ${LCC} ${ICFLAGS} longbits.o -o longbits
## ##
# #
@@ -2297,6 +2596,12 @@ env:
@echo "HAVE_CONST=${HAVE_CONST}"; echo "" @echo "HAVE_CONST=${HAVE_CONST}"; echo ""
@echo "HAVE_UID_T=${HAVE_UID_T}"; echo "" @echo "HAVE_UID_T=${HAVE_UID_T}"; echo ""
@echo "HAVE_NEWSTR=${HAVE_NEWSTR}"; 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 "ALIGN32=${ALIGN32}"; echo ""
@echo "ERRNO_DECL=${ERRNO_DECL}"; echo "" @echo "ERRNO_DECL=${ERRNO_DECL}"; echo ""
@echo "BINDIR=${BINDIR}"; echo "" @echo "BINDIR=${BINDIR}"; echo ""
@@ -2332,10 +2637,10 @@ env:
@echo "CCMISC=${CCMISC}"; echo "" @echo "CCMISC=${CCMISC}"; echo ""
@echo "CFLAGS=${CFLAGS}"; echo "" @echo "CFLAGS=${CFLAGS}"; echo ""
@echo "ICFLAGS=${ICFLAGS}"; echo "" @echo "ICFLAGS=${ICFLAGS}"; echo ""
@echo "CCMAIN=${CCMAIN}"; echo ""
@echo "LCFLAGS=${LCFLAGS}"; echo "" @echo "LCFLAGS=${LCFLAGS}"; echo ""
@echo "LDFLAGS=${LDFLAGS}"; echo "" @echo "LDFLAGS=${LDFLAGS}"; echo ""
@echo "ILDFLAGS=${ILDFLAGS}"; echo "" @echo "ILDFLAGS=${ILDFLAGS}"; echo ""
@echo "LCC=${LCC}"; echo ""
@echo "CC=${CC}"; echo "" @echo "CC=${CC}"; echo ""
@echo "SHELL=${SHELL}"; echo "" @echo "SHELL=${SHELL}"; echo ""
@echo "MAKE=${MAKE}"; echo "" @echo "MAKE=${MAKE}"; echo ""
@@ -3027,6 +3332,10 @@ hash.o: zrand.h
hash.o: zrandom.h hash.o: zrandom.h
have_const.o: have_const.c have_const.o: have_const.c
have_fpos.o: have_fpos.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_memmv.o: have_memmv.c
have_newstr.o: have_newstr.c have_newstr.o: have_newstr.c
have_offscl.o: have_offscl.c have_offscl.o: have_offscl.c
@@ -3037,6 +3346,7 @@ have_stdvs.o: have_string.h
have_stdvs.o: have_unistd.h have_stdvs.o: have_unistd.h
have_uid_t.o: have_uid_t.c have_uid_t.o: have_uid_t.c
have_uid_t.o: have_unistd.h have_uid_t.o: have_unistd.h
have_ustat.o: have_ustat.c
have_varvs.o: have_string.h have_varvs.o: have_string.h
have_varvs.o: have_unistd.h have_varvs.o: have_unistd.h
have_varvs.o: have_varvs.c have_varvs.o: have_varvs.c
@@ -3517,11 +3827,17 @@ quickhash.o: zrandom.h
seed.o: alloc.h seed.o: alloc.h
seed.o: byteswap.h seed.o: byteswap.h
seed.o: endian_calc.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_malloc.h
seed.o: have_memmv.h seed.o: have_memmv.h
seed.o: have_newstr.h seed.o: have_newstr.h
seed.o: have_stdlib.h seed.o: have_stdlib.h
seed.o: have_string.h seed.o: have_string.h
seed.o: have_urandom.h
seed.o: have_ustat.h
seed.o: longbits.h seed.o: longbits.h
seed.o: qmath.h seed.o: qmath.h
seed.o: seed.c seed.o: seed.c

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: 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. We are interested in any/all feedback on recent versions of calc.
In particular we would like to hear about: 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: See the file:
help/todo help/todo
help/wishlist
or run: or run:
calc 'help todo' calc help todo
calc help wishlist
for a wish/todo list. Code contributions are welcome. for a wish/todo list. Code contributions are welcome.
@@ -84,4 +86,4 @@ your full name.
The calc web site is located at: 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

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

View File

@@ -3,7 +3,10 @@
* *
* This file was written by: * 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 * This code has been placed in the public domain. Please do not
* copyright this code. * 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 * so that we can first select the correct hash chain, and
* also so we can quickly compare each element for a match. * also so we can quickly compare each element for a match.
*/ */
hash = (QCKHASH)0; hash = FNV1_32_BASIS;
for (i = 0; i < dim; i++) for (i = 0; i < dim; i++)
hash = hashvalue(&indices[i], hash); hash = hashvalue(&indices[i], hash);

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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> #include <stdio.h>

28
block.c
View File

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

View File

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

177
calc.c
View File

@@ -11,7 +11,6 @@
#include <pwd.h> #include <pwd.h>
#include <sys/types.h> #include <sys/types.h>
#include <ctype.h> #include <ctype.h>
#include <setjmp.h>
#define CALC_C #define CALC_C
#include "calc.h" #include "calc.h"
@@ -37,40 +36,13 @@
#include <stdlib.h> #include <stdlib.h>
#endif #endif
/*
* external definitions and functions
*/
extern int abortlevel; /* current level of aborts */
extern BOOL inputwait; /* TRUE if in a terminal input wait */
extern jmp_buf jmpbuf; /* for errors */
extern int isatty(int tty); /* TRUE if fd is a tty */
extern int p_flag; /* TRUE => pipe mode */
extern int q_flag; /* TRUE => don't execute rc files */
extern int u_flag; /* TRUE => unbuffer stdin and stdout */
extern int d_flag; /* TRUE => disable heading, lib_debug == 0 */
extern int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */
extern char *pager; /* $PAGER or default */
extern int stdin_tty; /* TRUE if stdin is a tty */
extern int interactive; /* TRUE if interactive session (no cmd args) */
extern char *program; /* our name */
extern char cmdbuf[]; /* command line expression */
extern char *version(void); /* return version string */
/* /*
* static definitions and functions * static definitions and functions
*/ */
static char *usage = "usage: %s [-C] [-e] [-h] [-i] [-m mode] [-n] [-p]\n" static char *usage = "usage: %s [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]\n"
"\t[-q] [-u] [-c] [-d] [[--] calc_cmd ...]\n"; "\t[-n] [-p] [-q] [-u] [-v] [[--] calc_cmd ...]\n";
static void intint(int arg); /* interrupt routine */ static void intint(int arg); /* interrupt routine */
static int havecommands;
static int c_flag; /* To permit continuation after error */
static int i_flag; /* To go interactive if permitted */
/* /*
* Top level calculator routine. * Top level calculator routine.
@@ -163,8 +135,7 @@ main(int argc, char **argv)
exit(1); exit(1);
} }
} }
interactive = (optind >= argc); havecommands = (optind < argc);
havecommands = !interactive;
/* /*
* look at the length of any trailing command args * look at the length of any trailing command args
@@ -258,77 +229,103 @@ main(int argc, char **argv)
post_init = TRUE; post_init = TRUE;
} }
/*
* (re)establish the interrupt handler
*/
(void) signal(SIGINT, intint); (void) signal(SIGINT, intint);
if (start_done == 0) { /*
* execute calc code based on the run state
*/
if (run_state == RUN_BEGIN) {
if (!q_flag && allow_read) { if (!q_flag && allow_read) {
start_done = 1; run_state = RUN_RCFILES;
runrcfiles(); runrcfiles();
} }
start_done = 2; run_state = RUN_PRE_CMD_ARGS;
}
if (start_done == 1) {
fprintf(stderr, "Execution error in rcfiles\n");
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE);
start_done = 2;
} else {
if ((havecommands && !i_flag) || !stdin_tty)
start_done = 7;
else if (havecommands)
start_done = 4;
else
start_done = 2;
}
}
if (start_done == 2) {
if (havecommands) {
start_done = 3;
(void) openstring(cmdbuf);
getcommands(FALSE);
}
start_done = 4;
}
if (start_done == 3) {
fprintf(stderr, "Execution error in commands\n");
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE);
start_done = 4;
}
else {
closeinput();
if (!stdin_tty || !i_flag)
start_done = 7;
else
start_done = 4;
}
}
if (start_done == 4) {
if (stdin_tty && ((havecommands && !i_flag) || p_flag))
start_done = 6;
else
openterminal();
}
else if (start_done == 5) {
if (!stdin_tty && (!c_flag || stoponerror) && stoponerror >= 0) {
start_done = 7;
}
else if ((c_flag && !stoponerror) || stoponerror < 0)
getcommands(FALSE);
else
reinitialize();
} }
if (start_done < 6) { while (run_state == RUN_RCFILES) {
start_done = 5; fprintf(stderr, "Error in rcfiles\n");
getcommands(TRUE); 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 * all done
*/ */
libcalc_call_me_last(); libcalc_call_me_last();
return (start_done - 6) ? 1 : 0; return (run_state == RUN_EXIT_WITH_ERROR ||
run_state == RUN_UNKNOWN) ? 1 : 0;
} }

48
calc.h
View File

@@ -10,6 +10,7 @@
#if !defined(__CALC_H__) #if !defined(__CALC_H__)
#define __CALC_H__ #define __CALC_H__
#include <setjmp.h>
#include "value.h" #include "value.h"
@@ -112,7 +113,7 @@ extern void trimconstants(void);
/* /*
* Input routines. * Input routines.
*/ */
extern int openstring(char *str); extern int openstring(char *str, long num);
extern int openterminal(void); extern int openterminal(void);
extern int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok); extern int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok);
extern char *nextline(void); extern char *nextline(void);
@@ -121,12 +122,12 @@ extern void reread(void);
extern void resetinput(void); extern void resetinput(void);
extern void setprompt(char *); extern void setprompt(char *);
extern BOOL inputisterminal(void); extern BOOL inputisterminal(void);
extern int inputlevel(void);
extern char *inputname(void); extern char *inputname(void);
extern long linenumber(void); extern long linenumber(void);
extern void runrcfiles(void); extern void runrcfiles(void);
extern void closeinput(void); extern void closeinput(void);
/* /*
* Other routines. * Other routines.
*/ */
@@ -140,21 +141,39 @@ extern void libcalc_call_me_first(void);
extern void libcalc_call_me_last(void); extern void libcalc_call_me_last(void);
extern void showerrors(void); extern void showerrors(void);
/* /*
* Initialization * Initialization
*/ */
extern void initialize(void); extern void initialize(void);
extern void reinitialize(void); extern void reinitialize(void);
extern int isatty(int tty); /* TRUE if fd is a tty */
extern char *version(void); /* return version string */
extern int post_init; /* TRUE => setjmp for math_error is ready */
/* /*
* Global data definitions. * global flags and definitions
*/ */
extern int abortlevel; /* current level of aborts */
extern BOOL inputwait; /* TRUE if in a terminal input wait */
extern jmp_buf jmpbuf; /* for errors */
extern int p_flag; /* TRUE => pipe mode */
extern int q_flag; /* TRUE => don't execute rc files */
extern int u_flag; /* TRUE => unbuffer stdin and stdout */
extern int d_flag; /* TRUE => disable heading, lib_debug == 0 */
extern int c_flag; /* TRUE => continue after error if permitted */
extern int i_flag; /* TRUE => try to go interactive after error */
extern int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */
extern char *pager; /* $PAGER or default */
extern int stdin_tty; /* TRUE if stdin is a tty */
extern int havecommands; /* TRUE if have cmd args) */
extern char *program; /* our name */
extern char cmdbuf[]; /* command line expression */
extern int abortlevel; /* current level of aborts */ extern int abortlevel; /* current level of aborts */
extern BOOL inputwait; /* TRUE if in a terminal input wait */ extern BOOL inputwait; /* TRUE if in a terminal input wait */
extern VALUE *stack; /* execution stack */ extern VALUE *stack; /* execution stack */
extern int start_done; /* TRUE => start up processing finished */
extern int dumpnames; /* TRUE => dump names rather than indices */ extern int dumpnames; /* TRUE => dump names rather than indices */
extern char *calcpath; /* $CALCPATH or default */ extern char *calcpath; /* $CALCPATH or default */
@@ -172,8 +191,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_write; /* FALSE => may not open any files for writing */
extern int allow_exec; /* FALSE => may not execute any commands */ extern int allow_exec; /* FALSE => may not execute any commands */
extern int post_init; /* TRUE => setjmp for math_error is ready */ /*
* calc startup and run state
*/
typedef enum {
RUN_UNKNOWN = -1, /* unknown or unset start state */
RUN_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 * calc version information

535
calc.man
View File

@@ -1,190 +1,356 @@
.\" .\"
.\" Copyright (c) 1994 David I. Bell and Landon Curt Noll .\" Copyright (c) 1993 David I. Bell and Landon Curt Noll
.\" Original man page dated 15nov93
.\" Copyright (c) 1999 David I. Bell and Landon Curt Noll
.\" Permission is granted to use, distribute, or modify this source, .\" Permission is granted to use, distribute, or modify this source,
.\" provided that this copyright notice remains intact. .\" provided that this copyright notice remains intact.
.\" .\"
.\" calculator by David I. Bell .\" calculator by David I. Bell
.\" man page by Landon Noll .\" man page by Landon Noll
.TH calc 1 "^..^" "15nov93" .TH calc 1 "^..^" "15Oct1999"
.SH NAME .SH NAME
calc \- arbitrary precision calculator calc \- arbitrary precision calculator
.SH SYNOPSIS .SH SYNOPSIS
\fIcalc\fP \fIcalc\fP
[\fI\-h\fP] .RB [ \-c ]
[\fI\-m mode\fP] .RB [ \-C ]
[\fI\-p\fP] .RB [ \-d ]
[\fI\-q\fP] .RB [ \-e ]
[\fI\-u\fP] .RB [ \-h ]
[\fI\-v\fP] .RB [ \-i ]
[\fIcalc_cmd \&.\|.\|.\fp] .RB [ \-m\ \&mode ]
.br
.in +5n
.RB [ \-n ]
.RB [ \-p ]
.RB [ \-q ]
.RB [ \-u ]
.RB [ \-v ]
.RB [ calc_cmd\ \&.\|.\|. ]
.in -5n
.SH DESCRIPTION .SH DESCRIPTION
\& \&
.br .br
CALC COMMAND LINE CALC COMMAND LINE
.PP .PP
.TP .TP
\fI\-h\fP .B \-c
Print a help message. Continue reading command lines even after an execution
This option implies \fI \-q\fP. error has caused the abandonment of a line.
This is equivalent to the calc command \fIhelp help\fP. .sp 1
The help facility is disabled unless the \fImode\fP is 5 or 7. For example:
See \fI\-m\fP below. .sp 1
.sp .in +5n
.TP
\fI\-m mode\fP
This flag sets the permission mode of calc.
It controls the ability for \fIcalc\fP to open files
and execute programs.
\fIMode\fP may be a number from 0 to 7.
.sp
The \fImode\fP value is interpreted in a way similar
to that of the \fRchmod(1)\fP octal mode:
.sp
.in +0.5i
.nf .nf
0 do not open any file, do not execute progs calc read many_errors.cal
1 do not open any file
2 do not open files for reading, do not execute progs
3 do not open files for reading
4 do not open files for writing, do not execute progs
5 do not open files for writing
6 do not execute any program
7 allow everything (default mode)
.fi .fi
.in -0.5i .in -5n
.sp .sp 1
If one wished to run calc from a privledged user, one might will cause
want to use \fI\-m 0\fP in an effort to make calc more secure. .B calc
.sp to abort on the first error, whereas:
\fIMode\fP bits for reading and writing apply only on an open. .sp 1
.in +5n
.nf
calc -c read many_errors.cal
.fi
.in -5n
.sp 1
will
cause
.B calc
to try to process each line being read
despite the errors that it encounters.
.TP
.B \-C
Permit the execution of custom builtin functions. Without
this flag, calling the custom() builtin function will
simply generate an error.
.sp 1
Use if this flag may cause
.B calc
to execute functions that
are non-standard and that are not portable. Custom builtin
functions are disabled by default for this reason.
.TP
.B \-d
Disable the printing of the opening title. The printing
of library debug and informational messages is also disabled
as if \fBconfig("lib_debug", 0)\fP had been executed.
.sp 1
For example:
.sp 1
.in +5n
calc 'read qtime; qtime(2)'
.in -5n
.sp 1
will output something like:
.sp 1
.in +5n
.nf
qtime(utc_hr_offset) defined
It's nearly ten past six.
.fi
.in -5n
.sp 1
whereas:
.sp 1
.in +5n
.nf
calc -d 'read qtime; qtime(2)'
.fi
.in -5n
.sp 1
will just say:
.sp 1
.in +5n
.nf
It's nearly ten past six.
.fi
.in -5n
.sp 1
.TP
.B \-e
Ignore any environment variables on startup.
The getenv() builtin will still return values, however.
.TP
.B \-h
Print a help message. This option implies
.BR \-q .
This
is equivalent to the
.B calc
command help help.
The help facility is disabled unless the mode is 5 or 7.
See
.BR \-m .
.TP
.B \-i
Become interactive if possible.
Be default, if
.I calc_cmd
args are given,
.B calc
will execute them and exit.
This flag args are given,
.B calc
will execute them and exit.
This flag will cause
.B calc
to drop into interactive mode after the
commands are executed.
.sp 1
For example:
.sp 1
.in +5n
.nf
calc 2+5
.fi
.in -5n
.sp 1
will print the value 7 and exit whereas:
.sp 1
.in +5n
.nf
calc -i 2+5
.fi
.in -5n
.sp 1
will print the value 7 and prompt the user for more
.B calc
commands.
.TP
.BR \-m " mode"
This flag sets the permission mode of
.BR calc .
It controls the ability for
.B calc
to open files and execute programs.
Mode may be a number from 0 to 7.
.sp 1
The mode value is interpreted in a way similar to that
of the
.BR chmod (1)
octal mode:
.sp 1
.in +5n
.nf
0 do not open any file, do not execute progs
1 do not open any file
2 do not open files for reading, do not execute progs
3 do not open files for reading
4 do not open files for writing, do not execute progs
5 do not open files for writing
6 do not execute any program
7 allow everything (default mode)
.fi
.in -5n
.sp 1
If one wished to run
.B calc
from a privileged user, one might want to use
.B \-m
0 in an effort to make
.B calc
somewhat more secure.
.sp 1
Mode bits for reading and writing apply only on an
open.
Files already open are not effected. Files already open are not effected.
Thus if one wanted to use the \fI\-m 0\fP in an effort to make Thus if one wanted to use the
\fIcalc\fP more secure, but still wanted to read and write a specific .B \-m
file, one might want to do: 0 in an effort to make
.sp .B calc
.in +0.5i somewhat more secure, but still wanted to read and write a specific
file, one might want to do in
.BR sh (1),
.BR ksh (1),
.BR bash (1)-like
shells:
.sp 1
.in +5n
.nf .nf
\fRcalc \-m 0 3<a.file\fP calc -m 0 3<a.file
.fi .fi
.in -0.5i .in -5n
.sp .sp 1
Files presented to \fIcalc\fP in this way are opened in an unknown mode. Files presented to
\fICalc\fP will attempt to read or write them if directed. .B calc
.sp in this way are opened in an
If the \fImode\fP disables opening of files for reading, then unknown mode.
the startup library scripts are disabled as of \fI\-q\fP was given. .B Calc
The reading of key bindings is also disabled when the \fImode\fP will attempt to read or write them if directed.
disables opening of files for reading. .sp 1
If the mode disables opening of files for reading, then
the startup library scripts are disabled as of
.B \-q
was given.
The reading of key bindings is also disabled
when the mode disables opening of files for reading.
.TP .TP
\fI \-p\fP .B \-n
Pipe processing is enabled by use of \-p. For example: Use the new configuration defaults instead of the old
.sp default classic defaults.
.in +0.5i This flag as the same effect
as executing \fBconfig("all", "newcfg")\fP at startup time.
.TP
.B \-p
Pipe processing is enabled by use of
.BR \-p .
For example:
.sp 1
.in +5n
.nf .nf
\fRecho "print 2^21701\-1, 2^23209\-1" | calc \-p | fizzbin\fP calc -p '2^21701-1' | fizzbin
.fi .fi
.in -0.5i .in -5n
.sp .sp 1
In pipe mode, \fIcalc\fP does not prompt, does not print leading tabs In pipe mode,
and does not print the initial header. .B calc
does not prompt, does not print leading
tabs and does not print the initial header.
The
.B \-p
flag overrides
.BR \-i .
.TP .TP
\fI \-q\fP .B \-q
Disable the use of the \fI$CALCRC\fP startup scripts. Disable the use of the $CALCRC startup scripts.
.TP .TP
\fI \-u\fP .B \-u
Disable buffering of stdin and stdout. Disable buffering of stdin and stdout.
.TP .TP
\fI \-v\fP .B \-v
Print the version and exit. Print the
.B calc
version number and exit.
.PP .PP
Without \fIcalc_cmd\fPs, \fIcalc\fP operates interactively. Without
If one or more \fIcalc_cmd\fPs are given on the command line, .IR calc_cmd ,
\fIcalc\fP will execute them and exit. .B calc
The printing of leading tabs on output is disabled operates interactively.
as if \fIconfig("tab",0)\fP had been executed. If one or more
.I calc_cmd
are given on the command line,
.B calc
will execute them and exit.
If
.B \-i
is given,
.B calc
will attempt to become interactive
even of one or more
.I calc_cmd
are given on the command line.
.PP .PP
Normally on startup, \fIcalc\fP attempts to execute a collection Normally on startup,
of library scripts. .B calc
The environment variable \fI$CALCRC\fP (if non-existent then attempts to execute a collection of
a compiled in value) contains a \fI:\fP separated list of library scripts.
startup library scripts. The environment variable $CALCRC (if non-existent
No error conditions are produced if these startup library scripts then a compiled in value) contains a : separated list of startup
are not found. library scripts.
No error conditions are produced if these startup
library scripts are not found.
.PP .PP
If the \fImode\fP disables opening of files for reading, then If the mode disables opening of files for reading, then the startup
the startup library scripts are disabled as of \fI\-q\fP was given library scripts are disabled as of
and \fI$CALCRC\fP as well as the default compiled in value are ignored. .B \-q
was given and $CALCRC as well
as the default compiled in value are ignored.
.PP .PP
Filenames are subject to ``~'' expansion (see below). Filenames are subject to ``~'' expansion (see below).
The environment variable \fI$CALCPATH\fP (if non-existent then The
a compiled in value) contains a \fI:\fP separated list of search environment variable $CALCPATH (if non-existent then a compiled in
directories. value) contains a : separated list of search directories.
If a file does not begin with \fI/\fP, \fI~\fP or \fI./\fP, If a
then it is searched for under each directory listed in the \fI$CALCPATH\fP. file does not begin with /, ~ or ./, then it is searched for under
It is an error if no such readable file is found. each directory listed in the $CALCPATH.
It is an error if no such
readable file is found.
.PP .PP
Calc treats all open files, other than stdin, stdout and stderr .B Calc
as files available for reading and writing. treats all open files, other than stdin, stdout and
One may present calc with an already open file in the following way: stderr as files available for reading and writing.
.sp One may
.in +0.5i present
.B calc
with an already open file using
.BR sh (1),
.BR ksh (1),
.BR bash (1)-like
shells is to:
.sp 1
.in +5n
calc 3<open_file 4<open_file2
.in -5n
.sp 1
For more information use the following
.B calc
commands:
.sp 1
.in +5n
.nf .nf
\fRcalc 3<open_file 4<open_file2\fP
.fi
.in -0.5i
.PP
For more information use the following calc commands:
.PP
.in 1.0i
help usage
.br
help help help help
.br help overview
help usage
help environment help environment
.in -1.0i help config
.PP .fi
OVERVIEW .in -5n
.PP .sp 1
\fICalc\fP is arbitrary precision arithmetic system that uses
a C-like language.
\fICalc\fP is useful as a calculator, an algorithm prototyped
and as a mathematical research tool.
More importantly, \fIcalc\fP provides one with a machine
independent means of computation.
.PP
\fICalc\fP comes with a rich set of builtin mathematical
and programmatic functions.
.PP
\fICalc\fP is distributed with library of scripts.
Written in the same C-like language, library scripts may be
read in and executed during a \fIcalc\fP session.
These library scripts are also provided because they are
useful and to serve as examples of the \fIcalc\fP language.
One may further extend \fIcalc\fP thru the
use of user defined scripts.
.PP
Internally calc represents numeric values as fractions reduced to their
lowest terms.
The numerators and denominators of these factions may grow to
arbitrarily large values.
Numeric values read in are automatically converted into rationals.
The user need not be aware of this internal representation.
.PP
For more information use the following calc commands:
.PP
.in 1.0i
help intro
.br
help builtin
.br
help stdlib
.br
help define
.br
show builtins
.br
show functions
.in -1.0i
.PP .PP
DATA TYPES DATA TYPES
.PP .PP
@@ -199,7 +365,9 @@ multiplication, division, negation, squaring, modulus,
rounding, exponentiation, equality, comparison, printing rounding, exponentiation, equality, comparison, printing
and so on. and so on.
.PP .PP
For more information use the following calc commands: For more information use the following
.B calc
commands:
.PP .PP
.in 1.0i .in 1.0i
help types help types
@@ -220,7 +388,9 @@ procedure.
Values may be grouped together in a matrix, or into a Values may be grouped together in a matrix, or into a
a list that permits stack and queue style operations. a list that permits stack and queue style operations.
.PP .PP
For more information use the following calc commands: For more information use the following
.B calc
commands:
.PP .PP
.in 1.0i .in 1.0i
help variable help variable
@@ -256,7 +426,9 @@ For example:
~chongo/lib/fft_multiply.cal ~chongo/lib/fft_multiply.cal
.in -1.0i .in -1.0i
.PP .PP
For more information use the following calc command: For more information use the following
.B calc
command:
.PP .PP
.in 1.0i .in 1.0i
help file help file
@@ -275,7 +447,9 @@ These include commands such as function definition, help,
reading in library scripts, dump files to a file, error notification, reading in library scripts, dump files to a file, error notification,
configuration control and status. configuration control and status.
.PP .PP
For more information use the following calc command: For more information use the following
.B calc
command:
.PP .PP
.in 1.0i .in 1.0i
help command help command
@@ -295,7 +469,8 @@ help config
.PD 0 .PD 0
.TP 20 .TP 20
${LIBDIR}/*.cal ${LIBDIR}/*.cal
library scripts shipped with calc library scripts shipped with
.B calc
.br .br
.sp .sp
.TP 20 .TP 20
@@ -323,7 +498,9 @@ Default value: ${CALCPATH}
.TP 5 .TP 5
CALCRC CALCRC
On startup (unless \-h or \-q was given on the command On startup (unless \-h or \-q was given on the command
line), calc searches for files along this :-separated line),
.B calc
searches for files along this :-separated
environment variable. environment variable.
.br .br
.sp .sp
@@ -333,7 +510,9 @@ Default value: ${CALCRC}
.TP 5 .TP 5
CALCBINDINGS CALCBINDINGS
On startup (unless \fI\-h\fP or \fI\-q\fP was given on the command On startup (unless \fI\-h\fP or \fI\-q\fP was given on the command
line, or \fI\-m\fP disallows opening files for reading), calc reads line, or \fI\-m\fP disallows opening files for reading),
.B calc
reads
key bindings from the filename specified key bindings from the filename specified
by this environment variable. by this environment variable.
.br .br
@@ -343,9 +522,12 @@ Default value: ${CALCBINDINGS}
.SH CREDIT .SH CREDIT
\& \&
.br .br
The majority of calc was written by David I. Bell. The majority of
.B calc
was written by David I. Bell.
.sp .sp
Calc archives and calc-tester mailing list maintained by Landon Curt Noll. .B Calc
archives and calc-tester mailing list maintained by Landon Curt Noll.
.sp .sp
Thanks for suggestions and encouragement from Peter Miller, Thanks for suggestions and encouragement from Peter Miller,
Neil Justusson, and Landon Noll. Neil Justusson, and Landon Noll.
@@ -378,30 +560,27 @@ Copyright (c) 19xx Ernest Bowen and Landon Curt Noll
Permission is granted to use, distribute, or modify this source, Permission is granted to use, distribute, or modify this source,
provided that this copyright notice remains intact. provided that this copyright notice remains intact.
.sp .sp
Send calc comments, suggestions, bug fixes, enhancements Send comments, suggestions, bug fixes, enhancements
and interesting calc scripts that you would like you see included and interesting
.B calc
scripts that you would like you see included
in future distributions to: in future distributions to:
.sp .sp
.in +0.5i .in +0.5i
dbell@auug.org.au calc-tester@postofc.corp.sgi.com
.br
chongo@toad.com
.in -0.5i .in -0.5i
.sp .sp
Landon Noll maintains the official calc ftp archive at: Landon Noll maintains the the
.B calc
web site is located at:
.sp .sp
.in +0.5i .in +0.5i
ftp://ftp.uu.net/pub/calc http://reality.sgi.com/chongo/tech/comp/calc
.in -0.5i .in -0.5i
.sp .sp
Alpha test versions, complete with bugs, untested code and One may join the
experimental features may be fetched (if you are brave) under: .B calc
.sp testing group by sending a request to:
.in +0.5i
http://reality.sgi.com/chongo/calc/
.in -0.5i
.sp
One may join the calc testing group by sending a request to:
.sp .sp
.in +0.5i .in +0.5i
calc-tester-request@postofc.corp.sgi.com calc-tester-request@postofc.corp.sgi.com
@@ -410,14 +589,14 @@ calc-tester-request@postofc.corp.sgi.com
Your message body (not the subject) should consist of: Your message body (not the subject) should consist of:
.sp .sp
.in +0.5i .in +0.5i
.nf
subscribe calc-tester address subscribe calc-tester address
.br
end end
.br
name your_full_name name your_full_name
.fi
.in -0.5i
.sp .sp
where "address" is your EMail address and "your_full_name" where "address" is your EMail address and "your_full_name"
is your full name. is your full name.
.in -0.5i
.sp .sp
Enjoy! Share and Enjoy! :\-)

View File

@@ -31,7 +31,7 @@ static void getshowstatement(void);
static void getfunction(void); static void getfunction(void);
static void ungetfunction(void); static void ungetfunction(void);
static void getbody(LABEL *contlabel, LABEL *breaklabel, static void getbody(LABEL *contlabel, LABEL *breaklabel,
LABEL *nextcaselabel, LABEL *defaultlabel, BOOL toplevel); LABEL *nextcaselabel, LABEL *defaultlabel);
static void getdeclarations(int symtype); static void getdeclarations(int symtype);
static void getsimpledeclaration (int symtype); static void getsimpledeclaration (int symtype);
static int getonevariable (int symtype); static int getonevariable (int symtype);
@@ -125,6 +125,7 @@ getcommands(BOOL toplevel)
switch (opensearchfile(name,calcpath,CALCEXT,rdonce)) { switch (opensearchfile(name,calcpath,CALCEXT,rdonce)) {
case 0: case 0:
getcommands(FALSE); getcommands(FALSE);
closeinput();
break; break;
case 1: case 1:
/* previously read and -once was given */ /* previously read and -once was given */
@@ -189,22 +190,26 @@ evaluate(BOOL nestflag)
funcname = (nestflag ? "**" : "*"); funcname = (nestflag ? "**" : "*");
beginfunc(funcname, nestflag); beginfunc(funcname, nestflag);
if (nestflag) if (gettoken() == T_LEFTBRACE) {
(void) tokenmode(TM_DEFAULT); getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL, NULL_LABEL);
while (loop) { } else {
switch (gettoken()) { if (nestflag)
case T_SEMICOLON: (void) tokenmode(TM_DEFAULT);
break; rescantoken();
while (loop) {
switch (gettoken()) {
case T_SEMICOLON:
break;
case T_NEWLINE:
case T_EOF:
loop = 0;
break;
case T_NEWLINE: default:
case T_EOF: rescantoken();
loop = 0; getstatement(NULL_LABEL, NULL_LABEL,
break; NULL_LABEL, NULL_LABEL);
}
default:
rescantoken();
getstatement(NULL_LABEL, NULL_LABEL,
NULL_LABEL, NULL_LABEL);
} }
} }
addop(OP_UNDEF); addop(OP_UNDEF);
@@ -321,13 +326,11 @@ getfunction(void)
} }
switch (gettoken()) { switch (gettoken()) {
case T_ASSIGN: case T_ASSIGN:
rescantoken();
getsimplebody(); getsimplebody();
break; break;
case T_LEFTBRACE: case T_LEFTBRACE:
rescantoken();
getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL, getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL,
NULL_LABEL, TRUE); NULL_LABEL);
break; break;
default: default:
scanerror(T_NULL, scanerror(T_NULL,
@@ -346,18 +349,9 @@ getfunction(void)
static void static void
getsimplebody(void) getsimplebody(void)
{ {
if (gettoken() != T_ASSIGN) {
scanerror(T_SEMICOLON,
"Missing equals for simple function body");
return;
}
(void) tokenmode(TM_NEWLINES); (void) tokenmode(TM_NEWLINES);
(void) getexprlist(); (void) getexprlist();
addop(OP_RETURN); addop(OP_RETURN);
if (gettoken() != T_SEMICOLON)
rescantoken();
if (gettoken() != T_NEWLINE)
scanerror(T_NULL, "Illegal function definition");
} }
@@ -368,14 +362,10 @@ getsimplebody(void)
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
static void static void
getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel, BOOL toplevel) getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel)
{ {
int oldmode; int oldmode;
if (gettoken() != T_LEFTBRACE) {
scanerror(T_SEMICOLON, "Missing left brace for function body");
return;
}
oldmode = tokenmode(TM_DEFAULT); oldmode = tokenmode(TM_DEFAULT);
while (TRUE) { while (TRUE) {
switch (gettoken()) { switch (gettoken()) {
@@ -383,6 +373,10 @@ getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaul
(void) tokenmode(oldmode); (void) tokenmode(oldmode);
return; return;
case T_EOF:
scanerror(T_SEMICOLON, "End-of-file in function body");
return;
default: default:
rescantoken(); rescantoken();
getstatement(contlabel, breaklabel, nextcaselabel, defaultlabel); getstatement(contlabel, breaklabel, nextcaselabel, defaultlabel);
@@ -598,8 +592,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
break; break;
case T_LEFTBRACE: case T_LEFTBRACE:
rescantoken(); getbody(contlabel, breaklabel, nextcaselabel, defaultlabel);
getbody(contlabel, breaklabel, nextcaselabel, defaultlabel, FALSE);
return; return;
case T_IF: case T_IF:
@@ -1004,8 +997,7 @@ getoneobj(long index, int symtype)
if (symtype == SYM_UNDEFINED) { if (symtype == SYM_UNDEFINED) {
rescantoken(); rescantoken();
(void) getidexpr(TRUE, TRUE); (void) getidexpr(TRUE, TRUE);
} } else {
else {
symname = tokensymbol(); symname = tokensymbol();
definesymbol(symname, symtype); definesymbol(symname, symtype);
usesymbol(symname, FALSE); usesymbol(symname, FALSE);
@@ -1089,8 +1081,7 @@ getonematrix(int symtype)
if (symtype == SYM_UNDEFINED) { if (symtype == SYM_UNDEFINED) {
rescantoken(); rescantoken();
(void) getidexpr(FALSE, TRUE); (void) getidexpr(FALSE, TRUE);
} } else {
else {
name = tokensymbol(); name = tokensymbol();
definesymbol(name, symtype); definesymbol(name, symtype);
usesymbol(name, FALSE); usesymbol(name, FALSE);
@@ -1175,9 +1166,9 @@ creatematrix(void)
switch (gettoken()) { switch (gettoken()) {
case T_RIGHTBRACKET: case T_RIGHTBRACKET:
addopone(OP_MATCREATE, dim); addopone(OP_MATCREATE, dim);
if (gettoken() == T_LEFTBRACKET) if (gettoken() == T_LEFTBRACKET) {
creatematrix(); creatematrix();
else { } else {
rescantoken(); rescantoken();
addop(OP_ZERO); addop(OP_ZERO);
} }
@@ -1353,8 +1344,7 @@ getopassignment(void)
while (gettoken() == T_ASSIGN) while (gettoken() == T_ASSIGN)
getinitlist(); getinitlist();
rescantoken(); rescantoken();
} } else {
else {
rescantoken(); rescantoken();
(void) getassignment(); (void) getassignment();
} }

View File

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

View File

@@ -28,12 +28,10 @@
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo
* *
* chongo@toad.com * chongo <was here> /\../\
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
*/ */
@@ -136,13 +134,31 @@ struct config {
int blkverbose; /* TRUE => print all lines if a block */ int blkverbose; /* TRUE => print all lines if a block */
int blkbase; /* block output base */ int blkbase; /* block output base */
int blkfmt; /* block output style */ int blkfmt; /* block output style */
int lib_debug; /* library debug: <0 none, 0 default, >0 more */ int lib_debug; /* library debug, see LIB_DEBUG_XXX below */
int calc_debug; /* internal debug: <0 none, 0 default,>0 more */ int calc_debug; /* internal debug, see CALC_DEBUG_XXX below */
int user_debug; /* user defined debug value: 0 default */ int user_debug; /* user defined debug value: 0 default */
}; };
typedef struct config CONFIG; 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 * global configuration states and aliases
*/ */

View File

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

View File

@@ -28,15 +28,12 @@
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo
* *
* chongo@toad.com * chongo <was here> /\../\
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
*/ */
/* /*
* Be careful what you put in this file, upper .c files include * Be careful what you put in this file, upper .c files include
* this file even when CUSTOM is not defined (ALLOW_CUSTOM is empty). * 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 # OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE. # 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 The following custom calc library files are provided because they serve
as examples of how use the custom interface. The custom interface as examples of how use the custom interface. The custom interface

View File

@@ -26,12 +26,10 @@
# #
# Happy bit twiddling, # Happy bit twiddling,
# #
# Landon Curt Noll # Landon Curt Noll
# http://reality.sgi.com/chongo
# #
# chongo@toad.com # chongo <was here> /\../\
# ...!{pyramid,sun,uunet}!hoptoad!chongo
#
# chongo was here /\../\
############################################################################## ##############################################################################
#-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-# #-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-#
@@ -421,9 +419,13 @@ depend:
else \ else \
rm -f Makefile.tmp; \ rm -f Makefile.tmp; \
mv Makefile Makefile.tmp; \ mv Makefile Makefile.tmp; \
sccs edit Makefile; \ if [ -d RCS ]; then; \
co -l Makefile; \
fi ;\
mv Makefile.tmp Makefile; \ 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 fi
## ##
@@ -590,8 +592,28 @@ c_help.o: ../string.h
c_help.o: ../value.h c_help.o: ../value.h
c_help.o: ../zmath.h c_help.o: ../zmath.h
c_help.o: c_help.c 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: ../custom.h
c_pzasusb8.o: ../endian_calc.h
c_pzasusb8.o: ../hash.h
c_pzasusb8.o: ../have_const.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: ../value.h
c_pzasusb8.o: ../zmath.h c_pzasusb8.o: ../zmath.h
c_pzasusb8.o: c_pzasusb8.c 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 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ chongo@toad.com * chongo was here /\../\ http://reality.sgi.com/chongo
*/ */
/* /*
* argv - print information about various args * argv - print information about various args

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -10,7 +10,7 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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 * halflen - determine the length of numeric value in HALFs

19
file.c
View File

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

241
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 int filescan(FILEID id, int count, VALUE **vals);
static VALUE f_eval(VALUE *vp); static VALUE f_eval(VALUE *vp);
static VALUE f_fsize(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; 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 * 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 *oldfunc;
FUNC *newfunc; FUNC *newfunc;
VALUE result; VALUE result;
char *cp; char *str;
long num;
if (vp->v_type != V_STR) if (vp->v_type != V_STR)
return error_value(E_EVAL2); return error_value(E_EVAL2);
cp = vp->v_str->s_str; str = vp->v_str->s_str;
switch (openstring(cp)) { num = vp->v_str->s_len;
switch (openstring(str, num)) {
case -2: case -2:
return error_value(E_EVAL3); return error_value(E_EVAL3);
case -1: case -1:
@@ -153,6 +169,7 @@ f_eval(VALUE *vp)
oldfunc = curfunc; oldfunc = curfunc;
enterfilescope(); enterfilescope();
if (evaluate(TRUE)) { if (evaluate(TRUE)) {
closeinput();
exitfilescope(); exitfilescope();
freevalue(stack--); freevalue(stack--);
newfunc = curfunc; newfunc = curfunc;
@@ -164,6 +181,7 @@ f_eval(VALUE *vp)
free(newfunc); free(newfunc);
return result; return result;
} }
closeinput();
exitfilescope(); exitfilescope();
newfunc = curfunc; newfunc = curfunc;
curfunc = oldfunc; curfunc = oldfunc;
@@ -1506,16 +1524,12 @@ static VALUE
f_hash(int count, VALUE **vals) f_hash(int count, VALUE **vals)
{ {
QCKHASH hash; QCKHASH hash;
long lhash;
VALUE result; VALUE result;
hash = (QCKHASH)0; hash = FNV1_32_BASIS;
while (count-- > 0) while (count-- > 0)
hash = hashvalue(*vals++, hash); hash = hashvalue(*vals++, hash);
lhash = (long) hash; result.v_num = utoq((FULL) hash);
if (lhash < 0)
lhash = -lhash;
result.v_num = itoq(lhash);
result.v_type = V_NUM; result.v_type = V_NUM;
return result; return result;
} }
@@ -1622,8 +1636,7 @@ f_avg(int count, VALUE **vals)
if ((*vals)->v_type == V_LIST) { if ((*vals)->v_type == V_LIST) {
addlistitems((*vals)->v_list, &sum); addlistitems((*vals)->v_list, &sum);
n += countlistitems((*vals++)->v_list); n += countlistitems((*vals++)->v_list);
} } else {
else {
addvalue(&sum, *vals++, &tmp); addvalue(&sum, *vals++, &tmp);
freevalue(&sum); freevalue(&sum);
sum = tmp; sum = tmp;
@@ -1672,8 +1685,7 @@ f_hmean(int count, VALUE **vals)
if ((*vals)->v_type == V_LIST) { if ((*vals)->v_type == V_LIST) {
addlistinv((*vals)->v_list, &sum); addlistinv((*vals)->v_list, &sum);
n += countlistitems((*vals++)->v_list); n += countlistitems((*vals++)->v_list);
} } else {
else {
invertvalue(*vals++, &tmp1); invertvalue(*vals++, &tmp1);
addvalue(&sum, &tmp1, &tmp2); addvalue(&sum, &tmp1, &tmp2);
freevalue(&tmp1); freevalue(&tmp1);
@@ -3824,9 +3836,9 @@ f_search(int count, VALUE **vals)
start = qlink(start); start = qlink(start);
} }
if (end) { if (end) {
if (!qispos(end)) if (!qispos(end)) {
end = qqadd(size, end); end = qqadd(size, end);
else { } else {
if (qrel(end, size) > 0) if (qrel(end, size) > 0)
end = qlink(size); end = qlink(size);
else else
@@ -3848,8 +3860,7 @@ f_search(int count, VALUE **vals)
if (count == 2 || (count == 4 && end != NULL)) { if (count == 2 || (count == 4 && end != NULL)) {
start = qalloc(); start = qalloc();
start->num = pos; start->num = pos;
} } else {
else {
end = qalloc(); end = qalloc();
end->num = pos; end->num = pos;
} }
@@ -3987,9 +3998,9 @@ f_rsearch(int count, VALUE **vals)
start = qlink(start); start = qlink(start);
} }
if (end) { if (end) {
if (!qispos(end)) if (!qispos(end)) {
end = qqadd(size, end); end = qqadd(size, end);
else { } else {
if (qrel(end, size) > 0) if (qrel(end, size) > 0)
end = qlink(size); end = qlink(size);
else else
@@ -4011,8 +4022,7 @@ f_rsearch(int count, VALUE **vals)
if (count == 2 || (count == 4 && end != NULL)) { if (count == 2 || (count == 4 && end != NULL)) {
start = qalloc(); start = qalloc();
start->num = pos; start->num = pos;
} } else {
else {
end = qalloc(); end = qalloc();
end->num = pos; end->num = pos;
} }
@@ -4024,8 +4034,7 @@ f_rsearch(int count, VALUE **vals)
if (count < 4) { if (count < 4) {
end = start; end = start;
start = NULL; start = NULL;
} } else {
else {
qtmp = qsub(end, qlen); qtmp = qsub(end, qlen);
qfree(end); qfree(end);
end = qtmp; end = qtmp;
@@ -4616,9 +4625,9 @@ f_strerror(int count, VALUE **vals)
if (count > 0) { if (count > 0) {
vp = vals[0]; vp = vals[0];
if (vp->v_type < 0) if (vp->v_type < 0) {
i = (long) -vp->v_type; i = (long) -vp->v_type;
else { } else {
if (vp->v_type != V_NUM || qisfrac(vp->v_num)) if (vp->v_type != V_NUM || qisfrac(vp->v_num))
return error_value(E_STRERROR1); return error_value(E_STRERROR1);
i = qtoi(vp->v_num); i = qtoi(vp->v_num);
@@ -4729,12 +4738,12 @@ f_error(int count, VALUE **vals)
if (count > 0) { if (count > 0) {
vp = vals[0]; vp = vals[0];
if (vp->v_type <= 0) if (vp->v_type <= 0) {
r = (long) -vp->v_type; r = (long) -vp->v_type;
else { } else {
if (vp->v_type != V_NUM || qisfrac(vp->v_num)) if (vp->v_type != V_NUM || qisfrac(vp->v_num)) {
r = E_ERROR1; r = E_ERROR1;
else { } else {
r = qtoi(vp->v_num); r = qtoi(vp->v_num);
if (r < 0 || r >= 32768) if (r < 0 || r >= 32768)
r = E_ERROR2; r = E_ERROR2;
@@ -5524,28 +5533,26 @@ f_tail(VALUE *v1, VALUE *v2)
res.v_type = v1->v_type; res.v_type = v1->v_type;
switch (v1->v_type) { switch (v1->v_type) {
case V_LIST: case V_LIST:
if (n == 0) if (n == 0) {
res.v_list = listalloc(); res.v_list = listalloc();
else if (n > 0) { } else if (n > 0) {
res.v_list = listsegment(v1->v_list, res.v_list = listsegment(v1->v_list,
v1->v_list->l_count - n, v1->v_list->l_count - n,
v1->v_list->l_count - 1); v1->v_list->l_count - 1);
} } else {
else {
res.v_list = listsegment(v1->v_list, res.v_list = listsegment(v1->v_list,
v1->v_list->l_count - 1, v1->v_list->l_count - 1,
v1->v_list->l_count + n); v1->v_list->l_count + n);
} }
return res; return res;
case V_STR: case V_STR:
if (n == 0) if (n == 0) {
res.v_str = slink(&_nullstring_); res.v_str = slink(&_nullstring_);
else if (n > 0) { } else if (n > 0) {
res.v_str = stringsegment(v1->v_str, res.v_str = stringsegment(v1->v_str,
v1->v_str->s_len - n, v1->v_str->s_len - n,
v1->v_str->s_len - 1); v1->v_str->s_len - 1);
} } else {
else {
res.v_str = stringsegment(v1->v_str, res.v_str = stringsegment(v1->v_str,
v1->v_str->s_len - 1, v1->v_str->s_len - 1,
v1->v_str->s_len + n); v1->v_str->s_len + n);
@@ -5875,6 +5882,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 static VALUE
f_access(int count, VALUE **vals) f_access(int count, VALUE **vals)
{ {
@@ -5977,8 +5995,7 @@ f_putenv(int count, VALUE **vals)
/* return putenv result */ /* return putenv result */
result.v_type = V_NUM; result.v_type = V_NUM;
result.v_num = itoq((long) putenv(putenv_str)); result.v_num = itoq((long) malloced_putenv(putenv_str));
free(putenv_str);
return result; return result;
} }
@@ -6020,6 +6037,9 @@ f_system(VALUE *vp)
/*NOTREACHED*/ /*NOTREACHED*/
} }
result.v_type = V_NUM; 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)); result.v_num = itoq((long) system(vp->v_str->s_str));
return result; return result;
} }
@@ -6960,6 +6980,8 @@ static CONST struct builtin builtins[] = {
"integral log of a number base 2"}, "integral log of a number base 2"},
{"im", 1, 1, 0, OP_IM, 0, 0, {"im", 1, 1, 0, OP_IM, 0, 0,
"imaginary part of complex number"}, "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", 2, IN, FA, OP_NOP, 0, f_listinsert,
"insert values c ... into list a at position b"}, "insert values c ... into list a at position b"},
{"int", 1, 1, 0, OP_INT, qint, 0, {"int", 1, 1, 0, OP_INT, qint, 0,
@@ -7522,4 +7544,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 */ #endif /* FUNCLIST */

View File

@@ -46,16 +46,21 @@ int
main(void) main(void)
{ {
#if defined(HAVE_NO_CONST) #if defined(HAVE_NO_CONST)
printf("#undef HAVE_CONST /* no */\n"); printf("#undef HAVE_CONST /* no */\n");
printf("#undef CONST\n"); printf("#undef CONST\n");
printf("#define CONST /* no */\n"); printf("#define CONST /* no */\n");
#else /* HAVE_NO_CONST */ #else /* HAVE_NO_CONST */
const char * const str = "const"; const char * const str = "const";
printf("#define HAVE_CONST /* yes */\n"); printf("#define HAVE_CONST /* yes */\n");
printf("#undef CONST\n"); printf("#undef CONST\n");
printf("#define CONST %s /* yes */\n", str); printf("#define CONST %s /* yes */\n", str);
#endif /* HAVE_NO_CONST */ #endif /* HAVE_NO_CONST */
/* exit(0); */ /* exit(0); */
return 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() * have_memmv - Determine if we memmove()
* *
* usage: * usage:
* have_newstr * have_memmv
* *
* Not all systems with memcpy() have memmove() functions, so this may not * Not all systems with memcpy() have memmove() functions, so this may not
* compile on your system. * compile on your system.
@@ -48,12 +48,17 @@ int
main(void) main(void)
{ {
#if defined(HAVE_NO_MEMMOVE) #if defined(HAVE_NO_MEMMOVE)
printf("#undef HAVE_MEMMOVE /* no */\n"); printf("#undef HAVE_MEMMOVE /* no */\n");
#else /* HAVE_NO_MEMMOVE */ #else /* HAVE_NO_MEMMOVE */
(void) memmove(dest, src, MOVELEN); (void) memmove(dest, src, MOVELEN);
printf("#define HAVE_MEMMOVE /* yes */\n"); printf("#define HAVE_MEMMOVE /* yes */\n");
#endif /* HAVE_NO_MEMMOVE */ #endif /* HAVE_NO_MEMMOVE */
/* exit(0); */ /* exit(0); */
return 0; return 0;
} }

View File

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

View File

@@ -51,15 +51,20 @@ int
main(void) main(void)
{ {
#if defined(HAVE_NO_UID_T) #if defined(HAVE_NO_UID_T)
printf("#undef HAVE_UID_T /* no */\n"); printf("#undef HAVE_UID_T /* no */\n");
#else /* HAVE_NO_UID_T */ #else /* HAVE_NO_UID_T */
uid_t curds; uid_t curds;
extern uid_t geteuid(); extern uid_t geteuid();
curds = geteuid(); curds = geteuid();
printf("#define HAVE_UID_T /* yes */\n"); printf("#define HAVE_UID_T /* yes */\n");
#endif /* HAVE_NO_UID_T */ #endif /* HAVE_NO_UID_T */
/* exit(0); */ /* exit(0); */
return 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_list ap;
va_start(ap); va_start(ap);
#if !defined(DONT_HAVE_VSPRINTF) #if !defined(DONT_HAVE_VSPRINTF)
vsprintf(buf, fmt, ap); vsprintf(buf, fmt, ap);
#else #else
sprintf(buf, fmt, ap); sprintf(buf, fmt, ap);
#endif #endif
va_end(ap); va_end(ap);
} }

3
help.c
View File

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

View File

@@ -74,7 +74,7 @@ STD_HELP_FILES_12= archive
BLT_HELP_FILES_13= bugs changes 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 # 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 Alpha test versions, complete with bugs, untested code and
experimental features may be fetched (if you are brave) under: 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: 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" where "address" is your EMail address and "your_full_name"
is 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 chongo <was here> /\../\
for details.
Landon Curt Noll <chongo@toad.com> /\oo/\

View File

@@ -40,9 +40,9 @@ Configuration parameters
"blkverbose" TRUE=>print all lines, FALSE=>skip duplicates "blkverbose" TRUE=>print all lines, FALSE=>skip duplicates
"blkbase" block output base "blkbase" block output base
"blkfmt" block output format "blkfmt" block output format
"lib_debug" calc library script debug level "lib_debug" controls library script debug information
"calc_debug" internal calc debug level "calc_debug" controls internal calc debug information
"user_debug" user defined debug level "user_debug" for user defined debug information
The "all" config value allows one to save/restore the configuration The "all" config value allows one to save/restore the configuration
@@ -78,7 +78,8 @@ Configuration parameters
The "newstd" is not backward compatible with the historic The "newstd" is not backward compatible with the historic
configuration. Even so, some people prefer this configuration configuration. Even so, some people prefer this configuration
and place the config("all", "newstd") command in their CALCRC 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 When nonzero, the "trace" parameter activates one or more features
that may be useful for debugging. These features correspond to that may be useful for debugging. These features correspond to
@@ -103,9 +104,12 @@ Configuration parameters
the decimal point to be printed in real or exponential mode in the decimal point to be printed in real or exponential mode in
normal unformatted printing (print, strprint, fprint) or in normal unformatted printing (print, strprint, fprint) or in
formatted printing (printf, strprintf, fprintf) when precision is not formatted printing (printf, strprintf, fprintf) when precision is not
specified. The initial value is 20. This parameter does not change specified. The initial value for oldstd is 20, for newstd 10.
the stored value of a number. Where rounding is necessary, the type The parameter may be changed to the value d by either
of rounding to be used is controlled by "outround". 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 The "epsilon" parameter specifies the default accuracy for the
calculation of functions for which exact values are not possible or calculation of functions for which exact values are not possible or
@@ -118,9 +122,10 @@ Configuration parameters
absolute value of the remainder usually does not exceed epsilon/2. absolute value of the remainder usually does not exceed epsilon/2.
Functions which require an epsilon value accept an Functions which require an epsilon value accept an
optional argument which overrides this default epsilon value for optional argument which overrides this default epsilon value for
that single call. (The value v can be assigned to the "epsilon" 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 parameter by either config("epsilon", v) or epsilon(v); each of
current value obtained by epsilon() as well as by config("epsilon").) 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 For the transcendental functions and the functions sqrt() and
appr(), the calculated value is always a multiple of epsilon. appr(), the calculated value is always a multiple of epsilon.
@@ -311,67 +316,64 @@ Configuration parameters
The default "blkfmt" is "hd". The default "blkfmt" is "hd".
With regards to "lib_debug", "calc_debug" and "user_debug": The "lib_debug" parameter is intended for controlling the possible
higher absolute values result in more detailed debugging and display of special information relating to functions, objects, and
more verbose debug messages. The default value is 0 in which other structures created by instructions in calc scripts.
a very amount of debugging will be performed with nil messages. Zero value of config("lib_debug") means that no such information
The -1 value is reserved for no debugging or messages. Any is displayed. For other values, the non-zero bits which currently
value <-1 will perform debugging silently (presumably collecting have meanings are as follows:
data to be displayed at a later time). Values >0 result in a
greater degree of debugging and more verbose messages.
The "lib_debug" is reserved by convention for calc library scripts. n Meaning of bit n of config("lib_debug")
This config parameter takes the place of the lib_debug global variable.
By convention, "lib_debug" has the following meanings:
<-1 no debug messages are printed though some internal 0 When a function is defined, redefined or undefined at
debug actions and information may be collected 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 The value for config("lib_debug") in both oldstd and newstd is 3,
printed at the time of the read (default) 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 The "calc_debug" is intended for controlling internal calc routines
printed at the time of the read in addition that test its operation, or collect or display information that
to other debug messages 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. n Meaning of bit n of config("calc_debug")
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:
<-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 2 some details of shs, shs1 and md5 hash states are included
in alpha test code). The only output is as a result of in the output when these are printed
internal fatal errors (typically either math_error() or
exit() will be called). (default)
>0 a greater degree of debugging is performed and more 3 when a function constructs a block value, tests are
verbose messages are printed (regress.cal uses 1). 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 The "user_debug" is provided for use by users. Calc ignores this value
other than to set it to 0 by default (for both "oldstd" and "newstd"). other than to set it to 0 by default (for both "oldstd" and "newstd").
No calc code or shipped library will change this value other than No calc code or shipped library should change this value. Users
during startup or during a config("all", xyz) call. should feel free to use it in any way. In particular they may
use particular bits for special purposes as with "calc_debug", or
The following is suggested as a convention for use of "user_debug". they may use it to indicate a debug level with larger values
These are only suggestions: feel free to use it as you like: indicating more stringent and more informative tests with presumably
slower operation or more memory usage, and a particular value (like
<-1 no debug messages are printed though some internal -1 or 0) corresponding to "no tests".
debug actions and information may be collected
-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
The following are synonyms for true: The following are synonyms for true:

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 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 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 You should also consider joining the calc testing group by sending a
request to: 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 work by a number of people. It would not be what it is today without
your efforts and submissions! 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 interesting calc scripts that you would like you see included in
future distributions to: future distributions to:
dbell@auug.org.au calc-tester@postofc.corp.sgi.com
chongo@toad.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 Alpha test versions, complete with bugs, untested code and
experimental features may be fetched (if you are brave) under: 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: One may join the calc testing group by sending a request to:

View File

@@ -1,5 +1,5 @@
NAME NAME
hash - hash value hash - FNV-1 hash value
SYNOPSIS SYNOPSIS
hash(x_1 [, x_2, x_3, ...]) hash(x_1 [, x_2, x_3, ...])
@@ -12,10 +12,32 @@ TYPES
DESCRIPTION DESCRIPTION
Returns a hash value for one or more values of arbitrary types. 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 EXAMPLE
> a = isqrt(2e1000); s = "xyz"; > a = isqrt(2e1000); s = "xyz";
> hash(a,s) > hash(a,s)
870000771 2378490456
LIMITS LIMITS
The number of arguments is not to exceed 100. The number of arguments is not to exceed 100.
@@ -24,3 +46,4 @@ LIBRARY
none none
SEE ALSO SEE ALSO
sha, sha1, md5

View File

@@ -42,7 +42,8 @@ following topics:
changes recent changes to calc changes recent changes to calc
contrib how to contribute scripts, code or custom functions contrib how to contribute scripts, code or custom functions
credit who wrote calc and who helped 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) full all of the above (in the above order)

236
help/todo
View File

@@ -1,183 +1,70 @@
Needed enhancements Calc Todo Items:
Send calc comments, suggestions, bug fixes, enhancements and The following items should be addressed sometime in the short to
interesting calc scripts that you would like you see included in medium term future, if not before the next release.
future distributions to:
dbell@auug.org.au Code contributions are welcome. Send patches to:
chongo@toad.com
The following items are in the calc wish list. Programs like this calc-tester@postofc.corp.sgi.com
can be extended and improved forever.
* In general use faster algorithms for large numbers when they See also the 'wishlist' help files for the calc enhancement wish list.
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 Very High priority items:
'eval' function, division by zeroes, and so on can be caught.
This should be done using syntax similar to:
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, * Write the help file for the stoponerror() builtin function.
breakpoints inserted, variables displayed, and so on.
* Figure out how to write all variables out to a file, including * Update the errmax about the meaning of errmax(-1).
deeply nested arrays, lists, and objects.
Add the ability to read and write a value in some binary form. * Fix any 'Known bugs' as noted in the BUGS file or as
Clearly this is easy for non-neg integers. The question of displayed by 'calc help bugs'.
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 High priority items:
file or piped into a command.
* Add some kind of #include and #define facility. Perhaps use * Verify, complete or fix the 'SEE ALSO' help file sections.
the C pre-processor itself?
* Support a more general input and output base mode other than * Verify, complete or fix the 'LIBRARY' help file sections.
just dec, hex or octal.
* Implement a form of symbolic algebra. Work on this has already * Verify, complete or fix the 'LIMITS' help file sections.
begun. This will use backquotes to define expressions, and new
functions will be able to act on expressions. For example:
x = `hello * strlen(mom)`; * Verify, complete or fix the 'SYNOPSIS' and 'TYPES' help file sections.
x = sub(x, `hello`, `hello + 1`);
x = sub(x, `hello`, 10, `mom`, "curds");
eval(x);
prints 55. * Where reasonable, be sure that regress.cal tests builtin functions.
* Place the results of previous commands into a parallel history list. * Perform a code coverage analysis of the 'make check' action
Add a binding that returns the saved result of the command so and improve the coverage (within reason) of the regress.cal suite.
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, * Create a Linux rpm (Red Hat Package Manager) package for calc.
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. * Address, if possible and reasonable, any Calc Mis-features
as noted in the BUGS file or as displayed by 'calc help bugs'.
One may need to remove a large value from the history list if * The shell script that is currently constructed to display a help
it is very large. Deleting the value would replace the history file (in help.c) is a gross hack. That code should be replaced
entry with a null value. 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.
* Add a binding to delete a command from the history list. * 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.
Since you can delete values, you might as well be able to * Consider using configure to build the calc Makefile.
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. Medium priority items:
* Add a builtin that returns a value from the history list. * Complete the use of CONST where appropriate:
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:
CONST is beginning to be used with read-only tables and some CONST is beginning to be used with read-only tables and some
function arguments. This allows certain compilers to better function arguments. This allows certain compilers to better
@@ -196,48 +83,13 @@ Needed enhancements
at by 'fizbin' and the HALF array pointer at by 'data' should be at by 'fizbin' and the HALF array pointer at by 'data' should be
treated as read-only. 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. * 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 on ZVALUE, NUMBER and perhaps COMPLEX (without all of the
other stuff) in a separate library. 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 * Add a builtin function to access the 64 bit FNV hash which
is currently being used internally in seed.c.
* clean the source code and document it better

View File

@@ -2,7 +2,22 @@ Calc command line
Calc has the following command line: Calc has the following command line:
calc [-C] [-e] [-h] [-i] [-m mode] [-n] [-p] [-q] [-u] [calc_cmd ...] calc [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]
[-n] [-p] [-q] [-u] [-v] [calc_cmd ...]
-c Continue reading command lines even after an execution
error has caused the abandonment of a line.
For example:
calc read many_errors.cal
will cause calc to abort on the first error, whereas:
calc -c read many_errors.cal
will cause calc to try to process each line being read
despite the errors that it encounters.
-C Permit the execution of custom builtin functions. Without -C Permit the execution of custom builtin functions. Without
this flag, calling the custom() builtin function will this flag, calling the custom() builtin function will
@@ -12,6 +27,27 @@ Calc command line
are non-standard and that are not portable. Custom builtin are non-standard and that are not portable. Custom builtin
functions are disabled by default for this reason. functions are disabled by default for this reason.
-d Disable the printing of the opening title. The printing
of library debug and informational messages is also disabled
as if config("lib_debug",0) had been executed.
For example:
calc 'read qtime; qtime(2)'
will output something like:
qtime(utc_hr_offset) defined
It's nearly ten past six.
whereas:
calc -d 'read qtime; qtime(2)'
will just say:
It's nearly ten past six.
-e Ignore any environment variables on startup. The -e Ignore any environment variables on startup. The
getenv() builtin will still return values, however. getenv() builtin will still return values, however.
@@ -19,7 +55,21 @@ Calc command line
is equivalent to the calc command help help. The help is equivalent to the calc command help help. The help
facility is disabled unless the mode is 5 or 7. See -m. facility is disabled unless the mode is 5 or 7. See -m.
-i Do not about if the error count exceeds maxerr(). -i Become interactive if possible. Be default, if calc_cmd
args are given, calc will execute them and exit. This flag
will cause calc to drop into interactive mode after the
commands are executed.
For example:
calc 2+5
will print the value 7 and exit whereas:
calc -i 2+5
will print the value 7 and prompt the user for more
calc commands.
-m mode -m mode
This flag sets the permission mode of calc. It This flag sets the permission mode of calc. It
@@ -38,7 +88,7 @@ Calc command line
6 do not execute any program 6 do not execute any program
7 allow everything (default mode) 7 allow everything (default mode)
If one wished to run calc from a privledged user, one If one wished to run calc from a privileged user, one
might want to use -m 0 in an effort to make calc more might want to use -m 0 in an effort to make calc more
secure. secure.
@@ -46,7 +96,7 @@ Calc command line
open. Files already open are not effected. Thus if one open. Files already open are not effected. Thus if one
wanted to use the -m 0 in an effort to make calc more wanted to use the -m 0 in an effort to make calc more
secure, but still wanted to read and write a specific secure, but still wanted to read and write a specific
file, one might want to do: file, one might want to do in sh, ksh, bash-like shells:
calc -m 0 3<a.file calc -m 0 3<a.file
@@ -59,25 +109,28 @@ Calc command line
given. The reading of key bindings is also disabled given. The reading of key bindings is also disabled
when the mode disables opening of files for reading. when the mode disables opening of files for reading.
-n Use the new configutation defaults instead of the old -n Use the new configuration defaults instead of the old
default classic defaults. This flag as the same effect default classic defaults. This flag as the same effect
as executing config("all", "newcfg") at startup time. as executing config("all", "newcfg") at startup time.
-p Pipe processing is enabled by use of -p. For example: -p Pipe processing is enabled by use of -p. For example:
echo "print 2^21701-1, 2^23209-1" | calc -p | fizzbin calc -p '2^21701-1' | fizzbin
In pipe mode, calc does not prompt, does not print In pipe mode, calc does not prompt, does not print leading
leading tabs and does not print the initial header. tabs and does not print the initial header. The -p flag
overrides -i.
-q Disable the use of the $CALCRC startup scripts. -q Disable the use of the $CALCRC startup scripts.
-u Disable buffering of stdin and stdout. -u Disable buffering of stdin and stdout.
-v Print calc version number and exit.
Without `calc_cmd', calc operates interactively. If one or more Without `calc_cmd', calc operates interactively. If one or more
`calc_cmd' are given on the command line, calc will execute them and `calc_cmd' are given on the command line, calc will execute them and
exit. The printing of leading tabs on output is disabled as if exit. If -i is given, calc will attempt to become interactive
config("tab",0) had been executed. even of one or more `calc_cmd' are given on the command line.
Normally on startup, calc attempts to execute a collection of Normally on startup, calc attempts to execute a collection of
library scripts. The environment variable $CALCRC (if non-existent library scripts. The environment variable $CALCRC (if non-existent
@@ -98,7 +151,8 @@ Calc command line
Calc treats all open files, other than stdin, stdout and Calc treats all open files, other than stdin, stdout and
stderr as files available for reading and writing. One may stderr as files available for reading and writing. One may
present calc with an already open file in the following way: present calc with an already open file using sh, ksh or bash-like
shells is to:
calc 3<open_file 4<open_file2 calc 3<open_file 4<open_file2

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.

3
hist.c
View File

@@ -455,8 +455,9 @@ do_bind_line(KEY_MAP *map, char *line)
if (*cp == '?') { if (*cp == '?') {
key = 0177; key = 0177;
cp++; cp++;
} else } else {
key = CONTROL(*cp++); key = CONTROL(*cp++);
}
} }
else if (key == '\\') else if (key == '\\')
key = *cp++; key = *cp++;

82
input.c
View File

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

View File

@@ -50,37 +50,41 @@ version of read:
This will cause the needed library files to be read once. If these 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. 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 "lib_debug" parameter is intended for controlling the possible
the verbosity of debug information printed by lib files. By default, display of special information relating to functions, objects, and
the "lib_debug" has a value of 0. 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 n Meaning of bit n of config("lib_debug")
global variable. By convention, "lib_debug" has the following meanings:
<-1 no debug messages are printed though some internal 0 When a function is defined, redefined or undefined at
debug actions and information may be collected 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 The value for config("lib_debug") in both oldstd and newstd is 3,
printed at the time of the read (default) 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 Sometimes the information printed is not enough. In addition to the
printed at the time of the read in addition standard information, one might want to print:
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:
* useful obj definitions * useful obj definitions
* functions with optional args * functions with optional args
* functions with optional args where the param() interface is used * functions with optional args where the param() interface is used
For these cases we suggest that you place at the bottom of your code 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 "obj xyz defined";
print "funcA([val1 [, val2]]) defined"; print "funcA([val1 [, val2]]) defined";
print "funcB(size, mass, ...) defined"; print "funcB(size, mass, ...) defined";

View File

@@ -86,7 +86,7 @@
* i.e., any value that is 301 mod 420. * i.e., any value that is 301 mod 420.
* *
* Written by: Ernest W Bowen <ernie@neumann.une.edu.au> * 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 */ 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(r1,m1 [,r2,m2 ...]) defined";
print "chrem(rlist [,mlist]) defined"; print "chrem(rlist [,mlist]) defined";
} }

View File

@@ -111,6 +111,6 @@ define fixdms(a)
a.deg %= 360; a.deg %= 360;
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "obj dms {deg, min, sec} defined"; 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 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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 * lucas - perform a Lucas primality test on h*2^n-1
@@ -1024,7 +1027,7 @@ gen_v1(h, n)
define define
ldebug(funct, str) ldebug(funct, str)
{ {
if (config("lib_debug") > 0) { if (config("lib_debug") & 3) {
print "DEBUG:", funct:":", str; print "DEBUG:", funct:":", str;
} }
return; return;

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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 * 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 */ /* skip primes where h>=2^n */
if (highbit(h_p[i]) >= n_p[i]) { 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"; print "h>=2^n skip:", h_p[i]:"*2^":n_p[i]:"-1";
} }
continue; continue;

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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 * 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[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; 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 "d_val[100] defined";
print "a_val[100] defined"; print "a_val[100] defined";
print "b_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 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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; return q;
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "mfactor(n [, start_k=1 [, rept_loop=10000 [, p_elim=17]]])" 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 "obj mod {a} defined";
print "mod_value defined"; print "mod_value defined";
print "set mod_value as needed"; 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); b=pol(5,16,8,1);
c=pol(1+2i,3+4i,5+6i); c=pol(1+2i,3+4i,5+6i);
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "obj poly {p} defined"; print "obj poly {p} defined";
} }

View File

@@ -7,7 +7,7 @@
* utc_hr_offset Offset from UTC in hours. * utc_hr_offset Offset from UTC in hours.
* *
* Written by: Klaus Alexander Seistrup <kseis@magnetic-ink.dk> * 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: * See:
* http://www.magnetic-ink.dk/download/qtime.html * http://www.magnetic-ink.dk/download/qtime.html

View File

@@ -195,6 +195,6 @@ define quat_shift(a, b)
return x.s; return x.s;
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "obj quat {s, v} defined"; 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 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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 */ /* obtain our required libs */

View File

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

View File

@@ -28,8 +28,8 @@ global ecnt; /* expected value of errcount() */
ecnt = 0; /* clear expected errcount() value */ ecnt = 0; /* clear expected errcount() value */
initcfg = config("all", "oldstd"); /* set config to startup default */ initcfg = config("all", "oldstd"); /* set config to startup default */
initcfg = config("lib_debug", -4); /* disable lib startup messages */ initcfg = config("lib_debug", 0); /* disable lib startup messages */
initcfg = config("calc_debug", 1); /* enable more internal debugging */ initcfg = config("calc_debug", 0); /* disable internal debugging */
initcfg = config("all"); /* save state for later use */ initcfg = config("all"); /* save state for later use */
print '003: parsed global definitions'; print '003: parsed global definitions';
@@ -4223,7 +4223,7 @@ define test_random()
/* test range interface some more */ /* test range interface some more */
tmp = srandom(state1); 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(-46,46) == -0x7, '5370: random(-46,46) == -0x7');
vrfy(random(21701,23209) == 23061, vrfy(random(21701,23209) == 23061,
'5371: random(21701,23209) == 23061'); '5371: random(21701,23209) == 23061');
@@ -6861,7 +6861,7 @@ print '181: parsed test_ptr()';
*/ */
define test_newstring() define test_newstring()
{ {
local A, B, C, D, S, p; local A, B, C, D, S, p, q;
print '7700: Beginning test_newstring'; print '7700: Beginning test_newstring';
@@ -6953,7 +6953,14 @@ define test_newstring()
print '7762: setbit(A, 16, 0);'; print '7762: setbit(A, 16, 0);';
vrfy(A == "A\255fdef", '7763: A == "A\255fdef"'); 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()'; print '182: parsed test_newstring()';
@@ -7115,6 +7122,8 @@ print '188: parsed test_natnumset()';
*/ */
define test_somenew() define test_somenew()
{ {
local a, s;
print '8200: Starting test_somenew'; print '8200: Starting test_somenew';
vrfy(char(-1) == char(255), '8201: char(-1) == char(255)'); vrfy(char(-1) == char(255), '8201: char(-1) == char(255)');
@@ -7139,7 +7148,13 @@ define test_somenew()
vrfy(1/(1/0) == 0, '8215: 1/(1/0) == 0'); vrfy(1/(1/0) == 0, '8215: 1/(1/0) == 0');
vrfy(inverse(1/0) == 0, '8216: inverse(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) == 2378490456, '8218: hash(a,s) == 2378490456');
vrfy(hash("curds n whey") == 2376141927,
'8219: hash("curds n whey") == 2376141927');
print '8220: Ending test_somenew';
} }
print '189: parsed test_somenew()'; print '189: parsed test_somenew()';
@@ -7195,16 +7210,27 @@ print '1700: Beginning read test';
value = 0; value = 0;
vrfy(value == 0, '1701: value == 0'); vrfy(value == 0, '1701: value == 0');
read "test1700"; read "test1700";
vrfy(value == 1, '1702: value == 1'); print '1702: read "test1700";';
read -once "test1700";
vrfy(value == 1, '1703: value == 1'); vrfy(value == 1, '1703: value == 1');
read -once "test1700";
print '1704: read -once "test1700";';
vrfy(value == 1, '1705: value == 1');
read "test1700.cal"; read "test1700.cal";
vrfy(value == 2, '1704: value == 2'); print '1706: read "test1700.cal";';
vrfy(value == 2, '1707: value == 2');
read -once "test1700.cal"; 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"; read "test1700.cal";
vrfy(value == 3, '1706: value == 3'); print '1710: read "test1700.cal";';
print '1707: Ending read test'; 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; print;
return test_obj(); return test_obj();
@@ -7279,6 +7305,9 @@ print;
return test_size(); return test_size();
print; print;
/*
* 5800 assignment tests
*/
return test_assign(5800, 1); return test_assign(5800, 1);
define xy5800_assign(a,b) { }; define xy5800_assign(a,b) { };
print '5812: define xy5800_assign(a,b) { }'; print '5812: define xy5800_assign(a,b) { }';
@@ -7323,7 +7352,7 @@ X5800 = obj xy5800 = {1,2};
print '5864: X5800 = obj xy5800 = {1,2}'; print '5864: X5800 = obj xy5800 = {1,2}';
vrfy(X5800 == (obj xy5800 = {1,2}), vrfy(X5800 == (obj xy5800 = {1,2}),
'5865: X5800 == (obj xy5800 = {1,2})'); '5865: X5800 == (obj xy5800 = {1,2})');
print '5899: End of 5800 sequence'; print '5866: End of 5800 sequence';
print; print;
return test_is(); return test_is();
@@ -7393,6 +7422,26 @@ print;
return test_somenew(); 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';
/* /*
* read various calc libs * read various calc libs
* *

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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; p = 2*fp+1;
} while (ptest(p,1,0) == 0); } while (ptest(p,1,0) == 0);
} while(ptest(p, trials) == 0 || ptest(fp, trials) == 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; print "/* 1st Blum prime */ p=", p;
} }
@@ -124,7 +127,7 @@ define seedrandom(seed1, seed2, size, trials)
q = 2*fq+1; q = 2*fq+1;
} while (ptest(q,1,0) == 0); } while (ptest(q,1,0) == 0);
} while(ptest(q, trials) == 0 || ptest(fq, trials) == 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; print "/* 2nd Blum prime */ q=", q;
} }
@@ -134,7 +137,7 @@ define seedrandom(seed1, seed2, size, trials)
n = p*q; /* the Blum modulus */ n = p*q; /* the Blum modulus */
binsize = highbit(n)+1; /* smallest power of 2 > p*q */ binsize = highbit(n)+1; /* smallest power of 2 > p*q */
r = pmod(rand(1<<ceil(binsize*4/5), 1<<(binsize-2)), 2, n); 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 "/* seed quadratic residue */ r=", r;
print "/* newn", binsize, "bit quadratic residue*/ newn=", n; print "/* newn", binsize, "bit quadratic residue*/ newn=", n;
} }
@@ -151,6 +154,6 @@ define seedrandom(seed1, seed2, size, trials)
return old_state; return old_state;
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "seedrandom(seed1, seed2, size [, trials]) defined"; 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); 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 "obj surd {a, b} defined";
print "surd_type defined"; print "surd_type defined";
print "set surd_type as needed"; print "set surd_type as needed";

View File

@@ -3,8 +3,10 @@
* Permission is granted to use, distribute, or modify this source, * Permission is granted to use, distribute, or modify this source,
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Landon Curt Noll * 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. * 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, * Permission is granted to use, distribute, or modify this source,
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * 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. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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. * This library is used by the 5200 series of the regress.cal test suite.
*/ */

View File

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

View File

@@ -63,8 +63,8 @@ int new_std = FALSE; /* TRUE (-n) => use newstd configuration */
int abortlevel; /* current level of aborts */ int abortlevel; /* current level of aborts */
BOOL inputwait; /* TRUE if in a terminal input wait */ BOOL inputwait; /* TRUE if in a terminal input wait */
jmp_buf jmpbuf; /* for errors */ jmp_buf jmpbuf; /* for errors */
int start_done = FALSE; /* TRUE => start up processing finished */ run run_state = RUN_UNKNOWN; /* calc startup and run state */
char *program = "calc"; /* our name */ char *program = "calc"; /* our name */
char cmdbuf[MAXCMD+1+1+1]; /* command line expression + "\n\0" + guard */ char cmdbuf[MAXCMD+1+1+1]; /* command line expression + "\n\0" + guard */
@@ -83,8 +83,8 @@ int p_flag = FALSE; /* TRUE => pipe mode */
int q_flag = FALSE; /* TRUE => don't execute rc files */ int q_flag = FALSE; /* TRUE => don't execute rc files */
int u_flag = FALSE; /* TRUE => unbuffer stdin and stdout */ int u_flag = FALSE; /* TRUE => unbuffer stdin and stdout */
int d_flag = FALSE; /* TRUE => disable heading, lib_debug == 0 */ int d_flag = FALSE; /* TRUE => disable heading, lib_debug == 0 */
int c_flag = FALSE; /* TRUE => continue on error if permitted */
int stoponerror = FALSE; /* >0 => stop, <0 => continue on error */ int i_flag = FALSE; /* TRUE => go interactive if permitted */
/* /*
* global values * global values
@@ -96,8 +96,9 @@ char *home; /* $HOME or default */
char *pager; /* $PAGER or default */ char *pager; /* $PAGER or default */
char *shell; /* $SHELL or default */ char *shell; /* $SHELL or default */
int stdin_tty = FALSE; /* TRUE if stdin is a tty */ int stdin_tty = FALSE; /* TRUE if stdin is a tty */
int interactive = FALSE; /* TRUE if interactive session (no cmd args) */ int havecommands = FALSE; /* TRUE if have one or more cmd args */
int post_init = FALSE; /* TRUE setjmp for math_error is readready */ int stoponerror = FALSE; /* >0 => stop, <0 => continue on error */
int post_init = FALSE; /* TRUE setjmp for math_error is ready */
int no_env = FALSE; /* TRUE (-e) => ignore env vars on startup */ int no_env = FALSE; /* TRUE (-e) => ignore env vars on startup */
int errmax = ERRMAX; /* if >= 0, maximum value for errcount */ int errmax = ERRMAX; /* if >= 0, maximum value for errcount */
@@ -164,6 +165,13 @@ libcalc_call_me_first(void)
conf->lib_debug = 0; conf->lib_debug = 0;
} }
/*
* -p turns off tab
*/
if (p_flag) {
conf->tab_ok = 0;
}
/* /*
* initialize * initialize
*/ */
@@ -172,6 +180,7 @@ libcalc_call_me_first(void)
/* /*
* ready to rock & roll .. * ready to rock & roll ..
*/ */
run_state = RUN_BEGIN;
init_done = 1; init_done = 1;
return; return;
} }
@@ -238,6 +247,7 @@ reinitialize(void)
math_setfp(stdout); math_setfp(stdout);
resetscopes(); resetscopes();
resetinput(); resetinput();
inittokens();
(void) openterminal(); (void) openterminal();
} }

View File

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

View File

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

2
md5.c
View File

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

View File

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

6
obj.c
View File

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

View File

@@ -2065,9 +2065,9 @@ o_isdefined(void)
} }
r = 0; r = 0;
index = getbuiltinfunc(vp->v_str->s_str); index = getbuiltinfunc(vp->v_str->s_str);
if (index >= 0) if (index >= 0) {
r = 1; r = 1;
else { } else {
index = getuserfunc(vp->v_str->s_str); index = getuserfunc(vp->v_str->s_str);
if (index >= 0) if (index >= 0)
r = 2; r = 2;
@@ -3697,7 +3697,7 @@ calculate(FUNC *fp, int argcount)
freevalue(&locals[i]); freevalue(&locals[i]);
if (locals != localtable) if (locals != localtable)
free(locals); free(locals);
if (conf->calc_debug & 2) if (conf->calc_debug & CALCDBG_FUNC_QUIT)
printf("\t\"%s\": line %ld\n", funcname, funcline); printf("\t\"%s\": line %ld\n", funcname, funcline);
while (stack > beginstack) while (stack > beginstack)
freevalue(stack--); freevalue(stack--);

15
poly.c
View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * 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" #include "value.h"
@@ -31,20 +31,17 @@ evp(LISTELEM *cp, LISTELEM *x, VALUE *vres)
freevalue(&tmp1); freevalue(&tmp1);
freevalue(vres); freevalue(vres);
*vres = tmp2; *vres = tmp2;
} } else {
else {
s = TRUE; s = TRUE;
*vres = tmp1; *vres = tmp1;
} }
} }
} } else {
else {
if (s) { if (s) {
addvalue(&v, vres, &tmp1); addvalue(&v, vres, &tmp1);
freevalue(vres); freevalue(vres);
*vres = tmp1; *vres = tmp1;
} } else {
else {
s = TRUE; s = TRUE;
copyvalue(&v, vres); copyvalue(&v, vres);
} }
@@ -126,9 +123,9 @@ addlistinv(LIST *lp, VALUE *vres)
VALUE tmp1, tmp2; VALUE tmp1, tmp2;
for (ep = lp->l_first; ep; ep = ep->e_next) { for (ep = lp->l_first; ep; ep = ep->e_next) {
if (ep->e_value.v_type == V_LIST) if (ep->e_value.v_type == V_LIST) {
addlistinv(ep->e_value.v_list, vres); addlistinv(ep->e_value.v_list, vres);
else { } else {
invertvalue(&ep->e_value, &tmp1); invertvalue(&ep->e_value, &tmp1);
addvalue(vres, &tmp1, &tmp2); addvalue(vres, &tmp1, &tmp2);
freevalue(&tmp1); freevalue(&tmp1);

View File

@@ -1156,9 +1156,9 @@ qcfappr(NUMBER *q, NUMBER *epsilon, long rnd)
s = -s; s = -s;
} }
if (bnddencase) { if (bnddencase) {
if (s > 0) if (s > 0) {
useold = TRUE; useold = TRUE;
else { } else {
zsub(zden, denbnd, &tmp1); zsub(zden, denbnd, &tmp1);
zquo(tmp1, oldden, &k, 1); zquo(tmp1, oldden, &k, 1);
zfree(tmp1); zfree(tmp1);

3
qio.c
View File

@@ -413,8 +413,9 @@ qprintfd(NUMBER *q, long width)
zquo(q->num, q->den, &z, conf->outround); zquo(q->num, q->den, &z, conf->outround);
zprintval(z, 0L, width); zprintval(z, 0L, width);
zfree(z); zfree(z);
} else } else {
zprintval(q->num, 0L, width); zprintval(q->num, 0L, width);
}
} }

12
qmod.c
View File

@@ -116,15 +116,13 @@ qquomod(NUMBER *q1, NUMBER *q2, NUMBER **retqdiv, NUMBER **retqmod)
zfree(tmp2); zfree(tmp2);
qq = qlink(&_qzero_); qq = qlink(&_qzero_);
qm = qlink(q1); qm = qlink(q1);
} } else {
else {
qq = qalloc(); qq = qalloc();
qq->num = tmp1; qq->num = tmp1;
if (ziszero(tmp2)) { if (ziszero(tmp2)) {
zfree(tmp2); zfree(tmp2);
qm = qlink(&_qzero_); qm = qlink(&_qzero_);
} } else {
else {
qm = qalloc(); qm = qalloc();
qm->num = tmp2; qm->num = tmp2;
} }
@@ -141,15 +139,13 @@ qquomod(NUMBER *q1, NUMBER *q2, NUMBER **retqdiv, NUMBER **retqmod)
zfree(tmp4); zfree(tmp4);
qq = qlink(&_qzero_); qq = qlink(&_qzero_);
qm = qlink(q1); qm = qlink(q1);
} } else {
else {
qq = qalloc(); qq = qalloc();
qq->num = tmp3; qq->num = tmp3;
if (ziszero(tmp4)) { if (ziszero(tmp4)) {
zfree(tmp4); zfree(tmp4);
qm = qlink(&_qzero_); qm = qlink(&_qzero_);
} } else {
else {
qm = qalloc(); qm = qalloc();
zmul(q1->den, q2->den, &tmp1); zmul(q1->den, q2->den, &tmp1);
zreduce(tmp4, tmp1, &qm->num, &qm->den); zreduce(tmp4, tmp1, &qm->num, &qm->den);

View File

@@ -1022,8 +1022,7 @@ qpower(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
tmp1 = itoq(m); tmp1 = itoq(m);
tmp2 = qmul(tmp1, q2tmp); tmp2 = qmul(tmp1, q2tmp);
m = qtoi(tmp2); m = qtoi(tmp2);
} } else {
else {
tmp1 = qdec(q1tmp); tmp1 = qdec(q1tmp);
tmp2 = qqdiv(tmp1, q1tmp); tmp2 = qqdiv(tmp1, q1tmp);
qfree(tmp1); qfree(tmp1);
@@ -1038,8 +1037,7 @@ qpower(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
tmp1 = itoq(m + 1); tmp1 = itoq(m + 1);
tmp2 = qmul(tmp1, q2tmp); tmp2 = qmul(tmp1, q2tmp);
m = qtoi(tmp2); m = qtoi(tmp2);
} } else {
else {
tmp1 = qdec(q1tmp); tmp1 = qdec(q1tmp);
tmp2 = qmul(tmp1, q2tmp); tmp2 = qmul(tmp1, q2tmp);
qfree(tmp1); qfree(tmp1);

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ * Landon Curt Noll
* http://reality.sgi.com/chongo
*
* chongo <was here> /\../\
*/ */
/* /*
@@ -76,22 +79,29 @@ static QCKHASH blk_hash(BLOCK *blk, QCKHASH val);
/* /*
* fnv - compute the next Fowler/Noll/Vo hash given a variable * FNV-0 - Fowler/Noll/Vo-0 32 bit hash
* *
* The basis of the hash algorithm was taken from an idea * The basis of this hash algorithm was taken from an idea sent
* sent by Email to the IEEE Posix P1003.2 mailing list from * as reviewer comments to the IEEE POSIX P1003.2 committee by:
* Phong Vo (kpv@research.att.com) and Glenn Fowler (gsf@research.att.com).
* Landon Curt Noll (chongo@toad.com) 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 * Phong Vo (http://www.research.att.com/info/kpv)
* is able to process 234936 words from the web2 dictionary without * Glenn Fowler (http://www.research.att.com/~gsf/)
* any collisions.
* *
* See: * In a subsequent ballot round:
* http://reality.sgi.com/chongo/src/fnv/fnv_hash.tar.gz *
* http://reality.sgi.com/chongo/src/fnv/h32.c * Landon Curt Noll (http://reality.sgi.com/chongo)
* http://reality.sgi.com/chongo/src/fnv/h64.c *
* 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.
* *
* given: * given:
* x the value to hash (must not be longer than 32 bits) * x the value to hash (must not be longer than 32 bits)

View File

@@ -26,12 +26,10 @@
# #
# Happy bit twiddling, # Happy bit twiddling,
# #
# Landon Curt Noll # Landon Curt Noll
# http://reality.sgi.com/chongo
# #
# chongo@toad.com # chongo <was here> /\../\
# ...!{pyramid,sun,uunet}!hoptoad!chongo
#
# chongo was here /\../\
############################################################################## ##############################################################################
#-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-# #-=-=-=-=-=-=-=-=- 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 # CCOPT are flags given to ${CC} for optimization
# CCWARN are flags given to ${CC} for warning message control # CCWARN are flags given to ${CC} for warning message control
# CCMISC are misc flags given to ${CC} # 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]] # CFLAGS are all flags given to ${CC} [[often includes CCOPT, CCWARN, CCMISC]]
# ICFLAGS are given to ${CC} for intermediate progs # 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} # LCFLAGS are CC-style flags for ${LINT}
# LDFLAGS are flags given to ${CC} for linking .o files # LDFLAGS are flags given to ${CC} for linking .o files
# ILDFLAGS are flags given to ${CC} for linking .o files for intermediate progs # 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} CCOPT= ${DEBUG} ${NO_SHARED}
CCMISC= CCMISC=
# #
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} ${ALLOW_CUSTOM} CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
ICFLAGS= ${CCWARN} ${CCMISC} ICFLAGS= ${CCWARN} ${CCMISC}
# #
CCMAIN= ${ICFLAGS}
#
LCFLAGS= LCFLAGS=
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
ILDFLAGS= ILDFLAGS=
# #
CC= ${PURIFY} cc LCC= gcc
CC= ${PURIFY} ${LCC}
############################################################################## ##############################################################################
#-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-# #-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#
@@ -286,13 +283,13 @@ SORT= sort
all: ${TARGETS} .all all: ${TARGETS} .all
test_random.o: test_random.c 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 test_random: test_random.o ../libcalc.a
${CC} ${LDFLAGS} test_random.o ${CALC_LIBS} ${LD_DEBUG} -o test_random ${CC} ${LDFLAGS} test_random.o ${CALC_LIBS} ${LD_DEBUG} -o test_random
many_random.o: many_random.c 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 many_random: many_random.o ../libcalc.a
${CC} ${LDFLAGS} many_random.o ${CALC_LIBS} ${LD_DEBUG} -o many_random ${CC} ${LDFLAGS} many_random.o ${CALC_LIBS} ${LD_DEBUG} -o many_random
@@ -405,9 +402,13 @@ depend:
else \ else \
rm -f Makefile.tmp; \ rm -f Makefile.tmp; \
mv Makefile Makefile.tmp; \ mv Makefile Makefile.tmp; \
sccs edit Makefile; \ if [ -d RCS ]; then; \
co -l Makefile; \
fi; \
mv Makefile.tmp Makefile; \ mv Makefile.tmp Makefile; \
echo new 'sample Makefile formed -- you need to check it in'; \ if [ -d RCS ]; then; \
echo new sample Makefile formed, you need to check it in; \
fi; \
fi fi
## ##

164
seed.c
View File

@@ -28,7 +28,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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! :-) * Share and enjoy! :-)
*/ */
@@ -52,7 +55,9 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <setjmp.h> #include <setjmp.h>
#if !defined(__bsdi)
#include <ustat.h> #include <ustat.h>
#endif /* __bsdi */
#if defined(__linux) #if defined(__linux)
# include <fcntl.h> # include <fcntl.h>
# define DEV_URANDOM "/dev/urandom" # define DEV_URANDOM "/dev/urandom"
@@ -60,6 +65,12 @@
#endif /* __linux */ #endif /* __linux */
#include "qmath.h" #include "qmath.h"
#include "longbits.h" #include "longbits.h"
#include "have_ustat.h"
#include "have_getsid.h"
#include "have_getpgid.h"
#include "have_gettime.h"
#include "have_getprid.h"
#include "have_urandom.h"
/* /*
@@ -76,7 +87,51 @@ typedef struct s_hash64 hash64;
/* /*
* hash_buf - perform a 64 bit Fowler/Noll/Vo hash on a buffer * FNV-1 initial basis
*
* We start the hash at a non-zero value at the beginning so that
* hashing blocks of data with all 0 bits do not map onto the same
* 0 hash value. The virgin value that we use below is the hash value
* that we would get from following 32 ASCII characters:
*
* chongo <Landon Curt Noll> /\../\
*
* Note that the \'s above are not back-slashing escape characters.
* They are literal ASCII backslash 0x5c characters.
*
* The effect of this virgin initial value is the same as starting
* with 0 and pre-pending those 32 characters onto the data being
* hashed.
*
* Yes, even with this non-zero virgin value there is a set of data
* that will result in a zero hash value. Worse, appending any
* about of zero bytes will continue to produce a zero hash value.
* But that would happen with any initial value so long as the
* hash of the initial was the `inverse' of the virgin prefix string.
*
* But then again for any hash function, there exists sets of data
* which that the hash of every member is the same value. That is
* life with many to few mapping functions. All we do here is to
* prevent sets whose members consist of 0 or more bytes of 0's from
* being such an awkward set.
*
* And yes, someone can figure out what the magic 'inverse' of the
* 32 ASCII character are ... but this hash function is NOT intended
* to be a cryptographic hash function, just a fast and reasonably
* good hash function.
*/
#if defined(HAVE_B64)
# define FNV1_64_BASIS ((hash64)(0xcbf29ce484222325ULL))
#else
# define FNV1_64_BASIS_0 ((USB32)0x2325)
# define FNV1_64_BASIS_1 ((USB32)0x8422)
# define FNV1_64_BASIS_2 ((USB32)0x9ce4)
# define FNV1_64_BASIS_3 ((USB32)0xcbf2)
#endif
/*
* hash_buf - perform a Fowler/Noll/Vo-1 64 bit hash
* *
* input: * input:
* buf - start of buffer to hash * buf - start of buffer to hash
@@ -97,32 +152,33 @@ hash_buf(char *buf, unsigned len)
char *buf_end = buf+len; /* beyond end of hash area */ char *buf_end = buf+len; /* beyond end of hash area */
/* /*
* Fowler/Noll/Vo hash - hash each character in the string * FNV-1 - Fowler/Noll/Vo-1 64 bit hash
* *
* The basis of the hash algorithm was taken from an idea * The basis of this hash algorithm was taken from an idea sent
* sent by Email to the IEEE POSIX P1003.2 mailing list from * as reviewer comments to the IEEE POSIX P1003.2 committee by:
* Phong Vo (kpv@research.att.com) and Glenn Fowler *
* (gsf@research.att.com). * Phong Vo (http://www.research.att.com/info/kpv)
* * Glenn Fowler (http://www.research.att.com/~gsf/)
* See: *
* http://reality.sgi.com/chongo/src/fnv/fnv_hash.tar.gz * In a subsequent ballot round:
* http://reality.sgi.com/chongo/src/fnv/h32.c *
* http://reality.sgi.com/chongo/src/fnv/h64.c * Landon Curt Noll (http://reality.sgi.com/chongo)
* *
* for information on 32bit and 64bit Fowler/Noll/Vo hashes. * improved on their algorithm. Some people tried this hash
* * and found that it worked rather well. In an EMail message
* Landon Curt Noll (chongo@toad.com) later improved on their * to Landon, they named it ``Fowler/Noll/Vo'' or the FNV hash.
* algorithm to come up with Fowler/Noll/Vo hash. *
* * FNV hashes are architected to be fast while maintaining a low
* The 32 hash was able to process 234936 words from the web2 dictionary * collision rate. The FNV speed allows one to quickly hash lots
* without any 32 bit collisions using a constant of * of data while maintaining a reasonable collision rate. See:
* 16777619 = 0x1000193. *
* * http://reality.sgi.com/chongo/tech/comp/fnv/
* The 64 bit hash uses 1099511628211 = 0x100000001b3 instead. *
* for more details as well as other forms of the FNV hash.
*/ */
#if defined(HAVE_B64) #if defined(HAVE_B64)
/* hash each octet of the buffer */ /* hash each octet of the buffer */
for (hval = (hash64)0ULL; buf < buf_end; ++buf) { for (hval = FNV1_64_BASIS; buf < buf_end; ++buf) {
/* multiply by 1099511628211ULL mod 2^64 using 64 bit longs */ /* multiply by 1099511628211ULL mod 2^64 using 64 bit longs */
hval *= (hash64)1099511628211ULL; hval *= (hash64)1099511628211ULL;
@@ -134,7 +190,11 @@ hash_buf(char *buf, unsigned len)
#else /* HAVE_B64 */ #else /* HAVE_B64 */
/* hash each octet of the buffer */ /* hash each octet of the buffer */
for (val[0]=val[1]=val[2]=val[3]=0; buf < buf_end; ++buf) { val[0] = FNV1_64_BASIS_0;
val[1] = FNV1_64_BASIS_1;
val[2] = FNV1_64_BASIS_2;
val[3] = FNV1_64_BASIS_3;
for (; buf < buf_end; ++buf) {
/* /*
* multiply by 1099511628211 mod 2^64 using 32 bit longs * multiply by 1099511628211 mod 2^64 using 32 bit longs
@@ -156,7 +216,7 @@ hash_buf(char *buf, unsigned len)
val[0] = tmp[0] & 0xffff; val[0] = tmp[0] & 0xffff;
tmp[2] += (tmp[1] >> 16); tmp[2] += (tmp[1] >> 16);
val[1] = tmp[1] & 0xffff; val[1] = tmp[1] & 0xffff;
val[3] += (tmp[2] >> 16); val[3] = tmp[3] + (tmp[2] >> 16);
val[2] = tmp[2] & 0xffff; val[2] = tmp[2] & 0xffff;
/* /*
* Doing a val[3] &= 0xffff; is not really needed since it simply * Doing a val[3] &= 0xffff; is not really needed since it simply
@@ -203,19 +263,23 @@ NUMBER *
pseudo_seed(void) pseudo_seed(void)
{ {
struct { /* data used for quasi-random seed */ struct { /* data used for quasi-random seed */
#if defined(__sgi) #if defined(HAVE_GETTIME)
# if defined(CLOCK_SGI_CYCLE)
struct timespec sgi_cycle; /* SGI hardware clock */ struct timespec sgi_cycle; /* SGI hardware clock */
prid_t getprid; /* project ID */ # endif /* CLOCK_SGI_CYCLE */
# if defined(CLOCK_REALTIME)
struct timespec realtime; /* POSIX realtime clock */ struct timespec realtime; /* POSIX realtime clock */
#endif /* __sgi */ # endif /* CLOCK_REALTIME */
#if defined(__linux) #endif /* HAVE_GETTIME */
#if defined(HAVE_GETPRID)
prid_t getprid; /* project ID */
#endif /* HAVE_GETPRID */
#if defined(HAVE_URANDOM)
int urandom_fd; /* open scriptor for /dev/urandom */ int urandom_fd; /* open scriptor for /dev/urandom */
int urandom_ret; /* read() of /dev/random */ int urandom_ret; /* read() of /dev/random */
char urandom_pool[DEV_URANDOM_POOL]; /* /dev/urandom data pool */ char urandom_pool[DEV_URANDOM_POOL]; /* /dev/urandom data pool */
#endif /* __linux */ #endif /* HAVE_URANDOM */
struct timeval tp; /* time of day */ struct timeval tp; /* time of day */
pid_t getsid; /* session ID */
pid_t getpgid; /* process group ID */
pid_t getpid; /* process ID */ pid_t getpid; /* process ID */
pid_t getppid; /* parent process ID */ pid_t getppid; /* parent process ID */
uid_t getuid; /* real user ID */ uid_t getuid; /* real user ID */
@@ -229,6 +293,7 @@ pseudo_seed(void)
struct stat fstat_stdin; /* stat of stdin */ struct stat fstat_stdin; /* stat of stdin */
struct stat fstat_stdout; /* stat of stdout */ struct stat fstat_stdout; /* stat of stdout */
struct stat fstat_stderr; /* stat of stderr */ struct stat fstat_stderr; /* stat of stderr */
#if defined(HAVE_USTAT)
struct ustat ustat_dot; /* usage stat of "." */ struct ustat ustat_dot; /* usage stat of "." */
struct ustat ustat_dotdot; /* usage stat of ".." */ struct ustat ustat_dotdot; /* usage stat of ".." */
struct ustat ustat_tmp; /* usage stat of "/tmp" */ struct ustat ustat_tmp; /* usage stat of "/tmp" */
@@ -236,6 +301,13 @@ pseudo_seed(void)
struct ustat ustat_stdin; /* usage stat of stdin */ struct ustat ustat_stdin; /* usage stat of stdin */
struct ustat ustat_stdout; /* usage stat of stdout */ struct ustat ustat_stdout; /* usage stat of stdout */
struct ustat ustat_stderr; /* usage stat of stderr */ struct ustat ustat_stderr; /* usage stat of stderr */
#endif /* HAVE_USTAT */
#if defined(HAVE_GETSID)
pid_t getsid; /* session ID */
#endif /* HAVE_GETSID */
#if defined(HAVE_GETPGID)
pid_t getpgid; /* process group ID */
#endif /* HAVE_GETPGID */
struct rusage rusage; /* resource utilization */ struct rusage rusage; /* resource utilization */
struct rusage rusage_chld; /* resource utilization of children */ struct rusage rusage_chld; /* resource utilization of children */
struct timeval tp2; /* time of day again */ struct timeval tp2; /* time of day again */
@@ -254,12 +326,18 @@ pseudo_seed(void)
* We do care (that much) if these calls fail. We do not * We do care (that much) if these calls fail. We do not
* need to process any data in the 'sdata' structure. * need to process any data in the 'sdata' structure.
*/ */
#if defined(__sgi) #if defined(HAVE_GETTIME)
# if defined(CLOCK_SGI_CYCLE)
(void) clock_gettime(CLOCK_SGI_CYCLE, &sdata.sgi_cycle); (void) clock_gettime(CLOCK_SGI_CYCLE, &sdata.sgi_cycle);
sdata.getprid = getprid(); # endif /* CLOCK_SGI_CYCLE */
# if defined(CLOCK_REALTIME)
(void) clock_gettime(CLOCK_REALTIME, &sdata.realtime); (void) clock_gettime(CLOCK_REALTIME, &sdata.realtime);
#endif /* __sgi */ # endif /* CLOCK_REALTIME */
#if defined(__linux) #endif /* HAVE_GETTIME */
#if defined(HAVE_GETPRID)
sdata.getprid = getprid();
#endif /* HAVE_GETPRID */
#if defined(HAVE_URANDOM)
sdata.urandom_fd = open(DEV_URANDOM, O_NONBLOCK|O_RDONLY); sdata.urandom_fd = open(DEV_URANDOM, O_NONBLOCK|O_RDONLY);
if (sdata.urandom_fd >= 0) { if (sdata.urandom_fd >= 0) {
sdata.urandom_ret = read(sdata.urandom_fd, sdata.urandom_ret = read(sdata.urandom_fd,
@@ -269,10 +347,8 @@ pseudo_seed(void)
memset(&sdata.urandom_pool, EOF, DEV_URANDOM_POOL); memset(&sdata.urandom_pool, EOF, DEV_URANDOM_POOL);
sdata.urandom_ret = EOF; sdata.urandom_ret = EOF;
} }
#endif /* __linux */ #endif /* HAVE_URANDOM */
(void) gettimeofday(&sdata.tp, NULL); (void) gettimeofday(&sdata.tp, NULL);
sdata.getsid = getsid((pid_t)0);
sdata.getpgid = getpgid((pid_t)0);
sdata.getpid = getpid(); sdata.getpid = getpid();
sdata.getppid = getppid(); sdata.getppid = getppid();
sdata.getuid = getuid(); sdata.getuid = getuid();
@@ -286,6 +362,7 @@ pseudo_seed(void)
(void) fstat(0, &sdata.fstat_stdin); (void) fstat(0, &sdata.fstat_stdin);
(void) fstat(1, &sdata.fstat_stdout); (void) fstat(1, &sdata.fstat_stdout);
(void) fstat(2, &sdata.fstat_stderr); (void) fstat(2, &sdata.fstat_stderr);
#if defined(HAVE_USTAT)
(void) ustat(sdata.stat_dotdot.st_dev, &sdata.ustat_dotdot); (void) ustat(sdata.stat_dotdot.st_dev, &sdata.ustat_dotdot);
(void) ustat(sdata.stat_dot.st_dev, &sdata.ustat_dot); (void) ustat(sdata.stat_dot.st_dev, &sdata.ustat_dot);
(void) ustat(sdata.stat_tmp.st_dev, &sdata.ustat_tmp); (void) ustat(sdata.stat_tmp.st_dev, &sdata.ustat_tmp);
@@ -293,6 +370,13 @@ pseudo_seed(void)
(void) ustat(sdata.fstat_stdin.st_dev, &sdata.ustat_stdin); (void) ustat(sdata.fstat_stdin.st_dev, &sdata.ustat_stdin);
(void) ustat(sdata.fstat_stdout.st_dev, &sdata.ustat_stdout); (void) ustat(sdata.fstat_stdout.st_dev, &sdata.ustat_stdout);
(void) ustat(sdata.fstat_stderr.st_dev, &sdata.ustat_stderr); (void) ustat(sdata.fstat_stderr.st_dev, &sdata.ustat_stderr);
#endif /* HAVE_USTAT */
#if defined(HAVE_GETSID)
sdata.getsid = getsid((pid_t)0);
#endif /* HAVE_GETSID */
#if defined(HAVE_GETPGID)
sdata.getpgid = getpgid((pid_t)0);
#endif /* HAVE_GETPGID */
(void) getrusage(RUSAGE_SELF, &sdata.rusage); (void) getrusage(RUSAGE_SELF, &sdata.rusage);
(void) getrusage(RUSAGE_CHILDREN, &sdata.rusage_chld); (void) getrusage(RUSAGE_CHILDREN, &sdata.rusage_chld);
(void) gettimeofday(&sdata.tp2, NULL); (void) gettimeofday(&sdata.tp2, NULL);

9
shs.c
View File

@@ -11,7 +11,10 @@
* *
* This file was Modified/Re-written by: * 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 * This code has been placed in the public domain. Please do not
* copyright this code. * copyright this code.
@@ -26,7 +29,7 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
* *
* Based on Version 2.11 (09 Mar 1995) from Landon Curt Noll's * 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.
* *
**** ****
* *
@@ -693,7 +696,7 @@ shs_print(HASH *state)
/* /*
* form the hash value * form the hash value
*/ */
if (conf->calc_debug > 0) { if (conf->calc_debug & CALCDBG_HASH_STATE) {
char buf[DEBUG_SIZE+1]; /* hash value buffer */ char buf[DEBUG_SIZE+1]; /* hash value buffer */
/* /*

5
shs.h
View File

@@ -11,7 +11,10 @@
* *
* This file was Modified by: * 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 * This code has been placed in the public domain. Please do not
* copyright this code. * copyright this code.

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