Release calc version 2.11.0t10

This commit is contained in:
Landon Curt Noll
1999-11-11 05:15:39 -08:00
parent 86c8e6dcf1
commit 96c34adee3
283 changed files with 2380 additions and 3032 deletions

6
BUGS
View File

@@ -75,7 +75,7 @@ not currently a member of the calc-tester mailing list.
Known bugs: Known bugs:
* Calc does not support the #! exec method. For example of the * Calc does not support the #! exec method. For example of the
following is placed in an executable file (assume the path to following is placed in an executable file (assume the path to
calc is correct) called /tmp/xyzzy: calc is correct) called /tmp/xyzzy:
@@ -127,7 +127,7 @@ Other items of note:
fails because it puts a space inside the concatenated hex. Calc fails because it puts a space inside the concatenated hex. Calc
has code that is affected by this bug. This bug has been reported has code that is affected by this bug. This bug has been reported
to Compaq and may be fixed in the future. A work-a-round is to to Compaq and may be fixed in the future. A work-a-round is to
compile with cc -std0 or to use a later version of their compiler. compile with cc -std0 or to use a later version of their compiler.
* On a Digital UNIX V4.0F (Rev. 1229) on a 500 Mhz 21264, make check * On a Digital UNIX V4.0F (Rev. 1229) on a 500 Mhz 21264, make check
@@ -148,7 +148,7 @@ Other items of note:
it finally hangs at test 2000. it finally hangs at test 2000.
The work-a-round is to compile calc without the optimizer. If this The work-a-round is to compile calc without the optimizer. If this
happens to you, try compiling without -O and without -O2. I.e., in happens to you, try compiling without -O and without -O2. I.e., in
the Makefile, set: the Makefile, set:
DEBUG= -g DEBUG= -g

483
CHANGES

File diff suppressed because it is too large Load Diff

View File

@@ -21,7 +21,7 @@ Installing calc in 4 easy steps:
The CALCBINDINGS is matter of personal taste. As shipped The CALCBINDINGS is matter of personal taste. As shipped
the Makefile assumes a default quasi-emacs-like command the Makefile assumes a default quasi-emacs-like command
line editor. Changing CALCBINDINGS= altbind will cause ^D line editor. Changing CALCBINDINGS= altbind will cause ^D
to end calc in a fashion similar to that of the bc(1) command. to end calc in a fashion similar to that of the bc(1) command.
Set TOPDIR to be the place under which help files, calc, Set TOPDIR to be the place under which help files, calc,

34
LIBRARY
View File

@@ -43,7 +43,7 @@ to use more than one type of arithmetic, since qmath.h automatically includes
zmath.h, and cmath.h automatically includes qmath.h. zmath.h, and cmath.h automatically includes qmath.h.
The prototypes for the available routines are listed in the above include The prototypes for the available routines are listed in the above include
files. Some of these routines are meant for internal use, and so aren't files. Some of these routines are meant for internal use, and so aren't
convenient for outside use. So you should read the source for a routine convenient for outside use. So you should read the source for a routine
to see if it really does what you think it does. I won't guarantee that to see if it really does what you think it does. I won't guarantee that
obscure internal routines won't change or disappear in future releases! obscure internal routines won't change or disappear in future releases!
@@ -60,7 +60,7 @@ External programs may want to compile with:
ERROR HANDLING ERROR HANDLING
-------------- --------------
Your program MUST provide a function called math_error. This is called by Your program MUST provide a function called math_error. This is called by
the math routines on an error condition, such as malloc failures or a the math routines on an error condition, such as malloc failures or a
division by zero. The routine is called in the manner of printf, with a division by zero. The routine is called in the manner of printf, with a
format string and optional arguments. (However, none of the low level math format string and optional arguments. (However, none of the low level math
@@ -142,7 +142,7 @@ output strings with space filling, output formatted strings like printf, and
flush the output. Output from these routines is diverted as described above. flush the output. Output from these routines is diverted as described above.
You can change the default output mode by calling math_setmode, and you can You can change the default output mode by calling math_setmode, and you can
change the default number of digits printed by calling math_setdigits. These change the default number of digits printed by calling math_setdigits. These
routines return the previous values. The possible modes are described in routines return the previous values. The possible modes are described in
zmath.h. zmath.h.
@@ -154,7 +154,7 @@ The arbitrary precision integer routines define a structure called a ZVALUE.
This is defined in zmath.h. A ZVALUE contains a pointer to an array of This is defined in zmath.h. A ZVALUE contains a pointer to an array of
integers, the length of the array, and a sign flag. The array is allocated integers, the length of the array, and a sign flag. The array is allocated
using malloc, so you need to free this array when you are done with a using malloc, so you need to free this array when you are done with a
ZVALUE. To do this, you should call zfree with the ZVALUE as an argument ZVALUE. To do this, you should call zfree with the ZVALUE as an argument
(or call freeh with the pointer as an argument) and never try to free the (or call freeh with the pointer as an argument) and never try to free the
array yourself using free. The reason for this is that sometimes the pointer array yourself using free. The reason for this is that sometimes the pointer
points to one of two statically allocated arrays which should NOT be freed. points to one of two statically allocated arrays which should NOT be freed.
@@ -248,7 +248,7 @@ If the value is too large for ztofull(), ztoulong() or ztolong(), only
the low order bits converted. the low order bits converted.
There are two types of comparisons you can make on ZVALUEs. This is whether There are two types of comparisons you can make on ZVALUEs. This is whether
or not they are equal, or the ordering on size of the numbers. The zcmp or not they are equal, or the ordering on size of the numbers. The zcmp
function tests whether two ZVALUEs are equal, returning TRUE if they differ. function tests whether two ZVALUEs are equal, returning TRUE if they differ.
The zrel function tests the relative sizes of two ZVALUEs, returning -1 if The zrel function tests the relative sizes of two ZVALUEs, returning -1 if
the first one is smaller, 0 if they are the same, and 1 if the first one the first one is smaller, 0 if they are the same, and 1 if the first one
@@ -267,7 +267,7 @@ is always positive. If the NUMBER is an integer, the denominator has the
value 1. value 1.
Unlike ZVALUEs, NUMBERs are passed using pointers, and pointers to them are Unlike ZVALUEs, NUMBERs are passed using pointers, and pointers to them are
returned by functions. So the basic type for using fractions is not really returned by functions. So the basic type for using fractions is not really
(NUMBER), but is (NUMBER *). NUMBERs are allocated using the qalloc routine. (NUMBER), but is (NUMBER *). NUMBERs are allocated using the qalloc routine.
This returns a pointer to a number which has the value 1. Because of the This returns a pointer to a number which has the value 1. Because of the
special property of a ZVALUE of 1, the numerator and denominator of this special property of a ZVALUE of 1, the numerator and denominator of this
@@ -283,7 +283,7 @@ A better way to create NUMBERs with particular values is to use the itoq,
iitoq, or atoq functions. Using itoq makes a long value into a NUMBER, iitoq, or atoq functions. Using itoq makes a long value into a NUMBER,
using iitoq makes a pair of longs into the numerator and denominator of a using iitoq makes a pair of longs into the numerator and denominator of a
NUMBER (reducing them first if needed), and atoq converts a string representing NUMBER (reducing them first if needed), and atoq converts a string representing
a number into the corresponding NUMBER. The atoq function accepts input in a number into the corresponding NUMBER. The atoq function accepts input in
integral, fractional, real, or exponential formats. Examples of allocating integral, fractional, real, or exponential formats. Examples of allocating
numbers are: numbers are:
@@ -294,7 +294,7 @@ numbers are:
q3 = atoq("456.78"); q3 = atoq("456.78");
Also unlike ZVALUEs, NUMBERs are quickly copied. This is because they contain Also unlike ZVALUEs, NUMBERs are quickly copied. This is because they contain
a link count, which is the number of pointers there are to the NUMBER. The a link count, which is the number of pointers there are to the NUMBER. The
qlink macro is used to copy a pointer to a NUMBER, and simply increments qlink macro is used to copy a pointer to a NUMBER, and simply increments
the link count and returns the same pointer. Since it is a macro, the the link count and returns the same pointer. Since it is a macro, the
argument should not be a function call, but a real pointer variable. The argument should not be a function call, but a real pointer variable. The
@@ -329,11 +329,11 @@ denominator, qint to return the integer part of, qfrac to return the
fractional part of, and qinv to invert a fraction. fractional part of, and qinv to invert a fraction.
There are some transcendental functions in the library, such as sin and cos. There are some transcendental functions in the library, such as sin and cos.
These cannot be evaluated exactly as fractions. Therefore, they accept These cannot be evaluated exactly as fractions. Therefore, they accept
another argument which tells how accurate you want the result. This is an another argument which tells how accurate you want the result. This is an
"epsilon" value, and the returned value will be within that quantity of "epsilon" value, and the returned value will be within that quantity of
the correct value. This is usually an absolute difference, but for some the correct value. This is usually an absolute difference, but for some
functions (such as exp), this is a relative difference. For example, to functions (such as exp), this is a relative difference. For example, to
calculate sin(0.5) to 100 decimal places, you could do: calculate sin(0.5) to 100 decimal places, you could do:
NUMBER *q, *ans, *epsilon; NUMBER *q, *ans, *epsilon;
@@ -363,7 +363,7 @@ macros are:
The comparisons for NUMBERs are similar to the ones for ZVALUEs. You use the The comparisons for NUMBERs are similar to the ones for ZVALUEs. You use the
qcmp and qrel functions. qcmp and qrel functions.
There are four predefined values for fractions. You should qlink them when There are four predefined values for fractions. You should qlink them when
you want to use them. These are _qzero_, _qone_, _qnegone_, and _qonehalf_. you want to use them. These are _qzero_, _qone_, _qnegone_, and _qonehalf_.
These have the values 0, 1, -1, and 1/2. An example of using them is: These have the values 0, 1, -1, and 1/2. An example of using them is:
@@ -377,7 +377,7 @@ USING COMPLEX NUMBERS
--------------------- ---------------------
The arbitrary precision complex arithmetic routines define a structure The arbitrary precision complex arithmetic routines define a structure
called COMPLEX. This is defined in cmath.h. This contains two NUMBERs called COMPLEX. This is defined in cmath.h. This contains two NUMBERs
for the real and imaginary parts of a complex number, and a count of the for the real and imaginary parts of a complex number, and a count of the
number of links there are to this COMPLEX number. number of links there are to this COMPLEX number.
@@ -410,7 +410,7 @@ There is no direct routine to convert a string value into a COMPLEX value.
But you can do this yourself by converting two strings into two NUMBERS, But you can do this yourself by converting two strings into two NUMBERS,
and then using the qqtoc routine. and then using the qqtoc routine.
COMPLEX values are always returned from these routines. To split out the COMPLEX values are always returned from these routines. To split out the
real and imaginary parts into normal NUMBERs, you can simply qlink the real and imaginary parts into normal NUMBERs, you can simply qlink the
two components, as shown in the following example: two components, as shown in the following example:
@@ -423,7 +423,7 @@ two components, as shown in the following example:
There are many macros for checking quick things about complex numbers, There are many macros for checking quick things about complex numbers,
similar to the ZVALUE and NUMBER macros. In addition, there are some similar to the ZVALUE and NUMBER macros. In addition, there are some
only used for complex numbers. Examples of macros are: only used for complex numbers. Examples of macros are:
cisreal(c) (number is real) cisreal(c) (number is real)
cisimag(c) (number is pure imaginary) cisimag(c) (number is pure imaginary)
@@ -441,8 +441,8 @@ only used for complex numbers. Examples of macros are:
There is only one comparison you can make for COMPLEX values, and that is There is only one comparison you can make for COMPLEX values, and that is
for equality. The ccmp function returns TRUE if two complex numbers differ. for equality. The ccmp function returns TRUE if two complex numbers differ.
There are three predefined values for complex numbers. You should clink There are three predefined values for complex numbers. You should clink
them when you want to use them. They are _czero_, _cone_, and _conei_. them when you want to use them. They are _czero_, _cone_, and _conei_.
These have the values 0, 1, and i. These have the values 0, 1, and i.
---------------- ----------------

View File

@@ -17,12 +17,12 @@
# Determine the type of terminal controls that you want to use # Determine the type of terminal controls that you want to use
# #
# value meaning # value meaning
# -------- ------- # -------- -------
# (nothing) let the makefile guess at what you need # (nothing) let the makefile guess at what you need
# -DUSE_TERMIOS use struct termios from <termios.h> # -DUSE_TERMIOS use struct termios from <termios.h>
# -DUSE_TERMIO use struct termios from <termio.h> # -DUSE_TERMIO use struct termios from <termio.h>
# -DUSE_SGTTY use struct sgttyb from <sys/ioctl.h> # -DUSE_SGTTY use struct sgttyb from <sys/ioctl.h>
# #
# If in doubt, leave TERMCONTROL empty. # If in doubt, leave TERMCONTROL empty.
# #
@@ -41,7 +41,7 @@ TERMCONTROL=
# for the best. # for the best.
# #
# If HAVE_VSPRINTF is empty, this makefile will run the have_stdvs.c and/or # If HAVE_VSPRINTF is empty, this makefile will run the have_stdvs.c and/or
# have_varvs.c program to determine if vsprintf() is supported. If # have_varvs.c program to determine if vsprintf() is supported. If
# HAVE_VSPRINTF is set to -DDONT_HAVE_VSPRINTF then calc will hope that # HAVE_VSPRINTF is set to -DDONT_HAVE_VSPRINTF then calc will hope that
# sprintf() will work. # sprintf() will work.
# #
@@ -55,12 +55,12 @@ HAVE_VSPRINTF=
# Big Endian: Amdahl, 68k, Pyramid, Mips, Sparc, ... # Big Endian: Amdahl, 68k, Pyramid, Mips, Sparc, ...
# Little Endian: Vax, 32k, Spim (Dec Mips), i386, i486, ... # Little Endian: Vax, 32k, Spim (Dec Mips), i386, i486, ...
# #
# If in doubt, leave BYTE_ORDER empty. This makefile will attempt to # If in doubt, leave BYTE_ORDER empty. This makefile will attempt to
# use BYTE_ORDER in <machine/endian.h> or it will attempt to run # use BYTE_ORDER in <machine/endian.h> or it will attempt to run
# the endian program. If you get syntax errors when you compile, # the endian program. If you get syntax errors when you compile,
# try forcing the value to be BIG_ENDIAN and run the calc regression # try forcing the value to be BIG_ENDIAN and run the calc regression
# tests. (see the README file) If the calc regression tests fail, do # tests. (see the README file) If the calc regression tests fail, do
# a make clobber and try LITTLE_ENDIAN. If that fails, ask a wizard # a make clobber and try LITTLE_ENDIAN. If that fails, ask a wizard
# for help. # for help.
# #
BYTE_ORDER= BYTE_ORDER=
@@ -112,7 +112,7 @@ HAVE_FPOS=
#HAVE_FPOS= -DHAVE_NO_FPOS #HAVE_FPOS= -DHAVE_NO_FPOS
# Determine if we have an off_t which one can perform arithmetic operations, # Determine if we have an off_t which one can perform arithmetic operations,
# assignments and comparisons. On some systems off_t is some sort of union # assignments and comparisons. On some systems off_t is some sort of union
# or struct. # or struct.
# #
# If HAVE_OFFSCL is empty, this makefile will run the have_offscl program # If HAVE_OFFSCL is empty, this makefile will run the have_offscl program
@@ -126,7 +126,7 @@ HAVE_OFFSCL=
#HAVE_OFFSCL= -DOFF_T_NON_SCALAR #HAVE_OFFSCL= -DOFF_T_NON_SCALAR
# Determine if we have an fpos_t which one can perform arithmetic operations, # Determine if we have an fpos_t which one can perform arithmetic operations,
# assignments and comparisons. On some systems fpos_t is some sort of union # assignments and comparisons. On some systems fpos_t is some sort of union
# or struct. Some systems do not have an fpos_t and long is as a file # or struct. Some systems do not have an fpos_t and long is as a file
# offset instead. # offset instead.
# #
@@ -192,7 +192,7 @@ HAVE_MEMMOVE=
# Determine if we have ustat() # Determine if we have ustat()
# #
# If HAVE_USTAT is empty, this makefile will run the have_memmv program # 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 # to determine if ustat() is supported. If HAVE_USTAT is set to
# -DHAVE_NO_USTAT, then calc will use internal functions to simulate # -DHAVE_NO_USTAT, 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.
# #
@@ -228,7 +228,7 @@ HAVE_GETPGID=
# Determine if we have clock_gettime() # Determine if we have clock_gettime()
# #
# If HAVE_GETTIME is empty, this makefile will run the have_memmv program # 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 # to determine if clock_gettime() is supported. If HAVE_GETTIME is set to
# -DHAVE_NO_GETTIME, then calc will use internal functions to simulate # -DHAVE_NO_GETTIME, 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.
# #
@@ -289,7 +289,7 @@ HAVE_STRDUP=
# that are not alligned on a 32 bit boundary. # that are not alligned on a 32 bit boundary.
# #
# The Dec Alpha running OSF/1 will produce alignment error messages when # The Dec Alpha running OSF/1 will produce alignment error messages when
# align32.c tries to figure out if alignment is needed. Use the # align32.c tries to figure out if alignment is needed. Use the
# ALIGN32= -DMUST_ALIGN32 to force alignment and avoid such error messages. # ALIGN32= -DMUST_ALIGN32 to force alignment and avoid such error messages.
# #
# ALIGN32= let align32.c figure out if alignment is needed # ALIGN32= let align32.c figure out if alignment is needed
@@ -426,8 +426,8 @@ CALCBINDINGS= bindings
# and history libs # and history libs
# READLINE_INCLUDE Where the readline include files reside # READLINE_INCLUDE Where the readline include files reside
# #
# NOTE: The GNU-readline code is not shipped with calc. You must have # NOTE: The GNU-readline code is not shipped with calc. You must have
# the appropriate headers and libs installed on your system in # the appropriate headers and libs installed on your system in
# order to use it. # order to use it.
# #
# If in doubt, set USE_READLINE, READLINE_LIB and READLINE_INCLUDE to nothing. # If in doubt, set USE_READLINE, READLINE_LIB and READLINE_INCLUDE to nothing.
@@ -483,7 +483,7 @@ DEBUG= -O2 -g3
# BSD NO_SHARED= # BSD NO_SHARED=
# SYSV NO_SHARED= -dn # SYSV NO_SHARED= -dn
# IRIX NO_SHARED= -non_shared # IRIX NO_SHARED= -non_shared
# disable NO_SHARED= # disable NO_SHARED=
# #
# If in doubt, use NO_SHARED= # If in doubt, use NO_SHARED=
# #
@@ -494,11 +494,11 @@ NO_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} and ${LCC} 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
# #
# IRIX with NO_SHARED= -non_shared LD_NO_SHARED= -Wl,-rdata_shared # IRIX with NO_SHARED= -non_shared LD_NO_SHARED= -Wl,-rdata_shared
# IRIX with NO_SHARED= LD_NO_SHARED= # IRIX with NO_SHARED= LD_NO_SHARED=
# others LD_NO_SHARED= # others LD_NO_SHARED=
# #
# If in doubt, use LD_NO_SHARED= # If in doubt, use LD_NO_SHARED=
# #
@@ -520,7 +520,7 @@ RANLIB=ranlib
# #
# BSD ${LINT} ${LCFLAGS} ${LINTFLAGS} -u -Ccalc # BSD ${LINT} ${LCFLAGS} ${LINTFLAGS} -u -Ccalc
# SYSV ${LINT} ${LCFLAGS} ${LINTFLAGS} -u -o calc # SYSV ${LINT} ${LCFLAGS} ${LINTFLAGS} -u -o calc
# disable : # disable :
# #
# If in doubt and you don't care about lint, use LINTLIB= : # If in doubt and you don't care about lint, use LINTLIB= :
# #
@@ -529,10 +529,10 @@ RANLIB=ranlib
LINTLIB= : LINTLIB= :
# The lint flags vary from system to system. Some systems have the # The lint flags vary from system to system. Some systems have the
# opposite meaning for the flags below. Other systems change flag # opposite meaning for the flags below. Other systems change flag
# meaning altogether. # meaning altogether.
# #
# System LINTFLAGS recommendation # System LINTFLAGS recommendation
# #
# SunOs -a -h -v -z # SunOs -a -h -v -z
# #
@@ -542,7 +542,7 @@ LINTLIB= :
LINTFLAGS= LINTFLAGS=
# Normally certain files depend on the Makefile. If the Makefile is # Normally certain files depend on the Makefile. If the Makefile is
# changed, then certain steps should be redone. If MAKE_FILE is # changed, then certain steps should be redone. If MAKE_FILE is
# set to Makefile, then these files will depend on Makefile. If # set to Makefile, then these files will depend on Makefile. If
# MAKE_FILE is empty, they they wont. # MAKE_FILE is empty, they they wont.
# #
@@ -593,7 +593,7 @@ CALC_ENV= CALCPATH=./lib
# By default, custom builtin functions may only be executed if calc # By default, custom builtin functions may only be executed if calc
# is given the -C option. This is because custom builtin functions # is given the -C option. This is because custom builtin functions
# may invoke non-standard or non-portable code. One may completely # may invoke non-standard or non-portable code. One may completely
# disable custom builtin functions by not compiling any of code # disable custom builtin functions by not compiling any of code
# #
# ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given # ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given
@@ -1079,7 +1079,7 @@ TARGETS= ${CALC_LIBS} custom/.all calc sample/sample \
### ###
# #
# The reason for this Makefile :-) # The reason for this Makefile :-)
# #
### ###
@@ -1286,9 +1286,9 @@ have_malloc.h: ${MAKE_FILE}
${Q}echo '' >> have_malloc.h ${Q}echo '' >> have_malloc.h
${Q}echo '/* do we have /usr/include/malloc.h? */' >> have_malloc.h ${Q}echo '/* do we have /usr/include/malloc.h? */' >> have_malloc.h
-${Q}if [ -f /usr/include/malloc.h ]; then \ -${Q}if [ -f /usr/include/malloc.h ]; then \
echo '#define HAVE_MALLOC_H /* yes */' >> have_malloc.h; \ echo '#define HAVE_MALLOC_H /* yes */' >> have_malloc.h; \
else \ else \
echo '#undef HAVE_MALLOC_H /* no */' >> have_malloc.h; \ echo '#undef HAVE_MALLOC_H /* no */' >> have_malloc.h; \
fi fi
${Q}echo '' >> have_malloc.h ${Q}echo '' >> have_malloc.h
${Q}echo '' >> have_malloc.h ${Q}echo '' >> have_malloc.h
@@ -1318,7 +1318,7 @@ have_times.h: ${MAKE_FILE}
${Q}echo '' >> have_times.h ${Q}echo '' >> have_times.h
${Q}echo '/* do we have /usr/include/times.h? */' >> have_times.h ${Q}echo '/* do we have /usr/include/times.h? */' >> have_times.h
-${Q}if [ -f /usr/include/times.h ]; then \ -${Q}if [ -f /usr/include/times.h ]; then \
echo '#define HAVE_TIMES_H /* yes */' >> have_times.h; \ echo '#define HAVE_TIMES_H /* yes */' >> have_times.h; \
else \ else \
echo '#undef HAVE_TIMES_H /* no */' >> have_times.h; \ echo '#undef HAVE_TIMES_H /* no */' >> have_times.h; \
fi fi
@@ -1365,9 +1365,9 @@ have_stdlib.h: ${MAKE_FILE}
${Q}echo '' >> have_stdlib.h ${Q}echo '' >> have_stdlib.h
${Q}echo '/* do we have /usr/include/stdlib.h? */' >> have_stdlib.h ${Q}echo '/* do we have /usr/include/stdlib.h? */' >> have_stdlib.h
-${Q}if [ -f /usr/include/stdlib.h ]; then \ -${Q}if [ -f /usr/include/stdlib.h ]; then \
echo '#define HAVE_STDLIB_H /* yes */' >> have_stdlib.h; \ echo '#define HAVE_STDLIB_H /* yes */' >> have_stdlib.h; \
else \ else \
echo '#undef HAVE_STDLIB_H /* no */' >> have_stdlib.h; \ echo '#undef HAVE_STDLIB_H /* no */' >> have_stdlib.h; \
fi fi
${Q}echo '' >> have_stdlib.h ${Q}echo '' >> have_stdlib.h
${Q}echo '' >> have_stdlib.h ${Q}echo '' >> have_stdlib.h
@@ -1397,9 +1397,9 @@ have_unistd.h: ${MAKE_FILE}
${Q}echo '' >> have_unistd.h ${Q}echo '' >> have_unistd.h
${Q}echo '/* do we have /usr/include/unistd.h? */' >> have_unistd.h ${Q}echo '/* do we have /usr/include/unistd.h? */' >> have_unistd.h
-${Q}if [ -f /usr/include/unistd.h ]; then \ -${Q}if [ -f /usr/include/unistd.h ]; then \
echo '#define HAVE_UNISTD_H /* yes */' >> have_unistd.h; \ echo '#define HAVE_UNISTD_H /* yes */' >> have_unistd.h; \
else \ else \
echo '#undef HAVE_UNISTD_H /* no */' >> have_unistd.h; \ echo '#undef HAVE_UNISTD_H /* no */' >> have_unistd.h; \
fi fi
${Q}echo '' >> have_unistd.h ${Q}echo '' >> have_unistd.h
${Q}echo '' >> have_unistd.h ${Q}echo '' >> have_unistd.h
@@ -1429,9 +1429,9 @@ have_string.h: ${MAKE_FILE}
${Q}echo '' >> have_string.h ${Q}echo '' >> have_string.h
${Q}echo '/* do we have /usr/include/string.h? */' >> have_string.h ${Q}echo '/* do we have /usr/include/string.h? */' >> have_string.h
-${Q}if [ -f /usr/include/string.h ]; then \ -${Q}if [ -f /usr/include/string.h ]; then \
echo '#define HAVE_STRING_H /* yes */' >> have_string.h; \ echo '#define HAVE_STRING_H /* yes */' >> have_string.h; \
else \ else \
echo '#undef HAVE_STRING_H /* no */' >> have_string.h; \ echo '#undef HAVE_STRING_H /* no */' >> have_string.h; \
fi fi
${Q}echo '' >> have_string.h ${Q}echo '' >> have_string.h
${Q}echo '' >> have_string.h ${Q}echo '' >> have_string.h
@@ -2102,7 +2102,7 @@ have_urandom.h: ${MAKE_FILE}
-${Q}if [ -c /dev/urandom ]; then \ -${Q}if [ -c /dev/urandom ]; then \
echo '#define HAVE_URANDOM_H /* yes */' >> have_urandom.h; \ echo '#define HAVE_URANDOM_H /* yes */' >> have_urandom.h; \
else \ else \
echo '#undef HAVE_URANDOM_H /* no */' >> have_urandom.h; \ echo '#undef HAVE_URANDOM_H /* no */' >> have_urandom.h; \
fi fi
${Q}echo '' >> have_urandom.h ${Q}echo '' >> have_urandom.h
${Q}echo '' >> have_urandom.h ${Q}echo '' >> have_urandom.h
@@ -2428,7 +2428,7 @@ sample/all:
## ##
# #
# The BSDI cdrom makefile expects certain files to be pre-built in a sub-dir # The BSDI cdrom makefile expects certain files to be pre-built in a sub-dir
# called gen_h. This rule creats this sub-directory so that the release can # called gen_h. This rule creats this sub-directory so that the release can
# be shipped off to BSDI. You can ignore this rule. # be shipped off to BSDI. You can ignore this rule.
# #
## ##
@@ -2498,7 +2498,7 @@ depend: hsrc
-${Q}rm -rf skel -${Q}rm -rf skel
${Q}mkdir skel ${Q}mkdir skel
-${Q}for i in ${C_SRC} ${BUILD_C_SRC}; do \ -${Q}for i in ${C_SRC} ${BUILD_C_SRC}; do \
${SED} -n '/^#[ ]*include[ ]*"/p' "$$i" > "skel/$$i"; \ ${SED} -n '/^#[ ]*include[ ]*"/p' "$$i" > "skel/$$i"; \
done done
${Q}mkdir skel/custom ${Q}mkdir skel/custom
-${Q}for i in ${H_SRC} ${BUILD_H_SRC} custom.h; do \ -${Q}for i in ${H_SRC} ${BUILD_H_SRC} custom.h; do \

4
README
View File

@@ -27,7 +27,7 @@ If you run into problems, see the BUGS file.
Calc is distributed with an extensive collection of help files that Calc is distributed with an extensive collection of help files that
are accessible from the command line. The following assume that you are accessible from the command line. The following assume that you
are running calc from the distribution directory or that you have are running calc from the distribution directory or that you have
installed calc. In these examples, the ">" is the calc prompt, not installed calc. In these examples, the ">" is the calc prompt, not
something that you type in. something that you type in.
For list of help topics: For list of help topics:
@@ -52,7 +52,7 @@ C programmers should note some unexpected differences in the calc syntax:
> help unexpected > help unexpected
Calc is shipped with a library of calc scripts. For a list see: Calc is shipped with a library of calc scripts. For a list see:
> help stdlib > help stdlib

21
addop.c
View File

@@ -16,8 +16,8 @@
#include "symbol.h" #include "symbol.h"
#define FUNCALLOCSIZE 20 /* reallocate size for functions */ #define FUNCALLOCSIZE 20 /* reallocate size for functions */
#define OPCODEALLOCSIZE 100 /* reallocate size for opcodes in functions */ #define OPCODEALLOCSIZE 100 /* reallocate size for opcodes in functions */
static long maxopcodes; /* number of opcodes available */ static long maxopcodes; /* number of opcodes available */
@@ -168,7 +168,7 @@ endfunc(void)
if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) || if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) ||
(!inputisterminal() && conf->lib_debug & LIBDBG_FILE_FUNC)) { (!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)
putchar(','); putchar(',');
printf("%s", paramname(index)); printf("%s", paramname(index));
@@ -291,12 +291,12 @@ rmalluserfunc(void)
long long
getuserfunc(char *name) getuserfunc(char *name)
{ {
long index; long index;
index = findstr(&funcnames, name); index = findstr(&funcnames, name);
if (index >= 0 && functions[index] != NULL) if (index >= 0 && functions[index] != NULL)
return index; return index;
return -1L; return -1L;
} }
@@ -535,8 +535,7 @@ addop(long op)
qfree(q); qfree(q);
fp->f_opcodes[count - 2] = OP_ZERO; fp->f_opcodes[count - 2] = OP_ZERO;
fp->f_opcodecount--; fp->f_opcodecount--;
} } else if (qisone(q)) {
else if (qisone(q)) {
qfree(q); qfree(q);
fp->f_opcodes[count - 2] = OP_ONE; fp->f_opcodes[count - 2] = OP_ONE;
fp->f_opcodecount--; fp->f_opcodecount--;
@@ -639,5 +638,3 @@ addoplabel(long op, LABEL *label)
addop(op); addop(op);
uselabel(label); uselabel(label);
} }
/* END CODE */

View File

@@ -12,11 +12,11 @@
* copyright this code. * copyright this code.
* *
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER-
* CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT * CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT
* NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
@@ -70,7 +70,7 @@ main(void)
* buserr - catch an alignment error * buserr - catch an alignment error
* *
* given: * given:
* arg to keep ANSI C happy * arg to keep ANSI C happy
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
static void static void

View File

@@ -14,10 +14,10 @@
#include "value.h" #include "value.h"
#define MINHASHSIZE 31 /* minimum size of hash tables */ #define MINHASHSIZE 31 /* minimum size of hash tables */
#define GROWHASHSIZE 50 /* approximate growth for hash tables */ #define GROWHASHSIZE 50 /* approximate growth for hash tables */
#define CHAINLENGTH 10 /* desired number of elements on a hash chain */ #define CHAINLENGTH 10 /* desired number of elements on a hash chain */
#define ELEMSIZE(n) (sizeof(ASSOCELEM) + (sizeof(VALUE) * ((n) - 1))) #define ELEMSIZE(n) (sizeof(ASSOCELEM) + (sizeof(VALUE) * ((n) - 1)))
static ASSOCELEM *elemindex(ASSOC *ap, long index); static ASSOCELEM *elemindex(ASSOC *ap, long index);
@@ -245,8 +245,7 @@ assoccmp(ASSOC *ap1, ASSOC *ap2)
hash = ep1->e_hash; hash = ep1->e_hash;
dim = ep1->e_dim; dim = ep1->e_dim;
for (ep2 = ap2->a_table[hash % size2]; ; for (ep2 = ap2->a_table[hash % size2]; ;
ep2 = ep2->e_next) ep2 = ep2->e_next) {
{
if (ep2 == NULL) if (ep2 == NULL)
return TRUE; return TRUE;
if (ep2->e_hash != hash) if (ep2->e_hash != hash)
@@ -283,8 +282,7 @@ assoccopy(ASSOC *oldap)
for (oldhi = 0; oldhi < oldap->a_size; oldhi++) { for (oldhi = 0; oldhi < oldap->a_size; oldhi++) {
for (oldep = oldap->a_table[oldhi]; oldep; for (oldep = oldap->a_table[oldhi]; oldep;
oldep = oldep->e_next) oldep = oldep->e_next) {
{
ep = (ASSOCELEM *) malloc(ELEMSIZE(oldep->e_dim)); ep = (ASSOCELEM *) malloc(ELEMSIZE(oldep->e_dim));
if (ep == NULL) { if (ep == NULL) {
math_error("Cannot allocate association element"); math_error("Cannot allocate association element");
@@ -449,8 +447,7 @@ assocprint(ASSOC *ap, long max_print)
((ap->a_count == 1) ? "" : "s")); ((ap->a_count == 1) ? "" : "s"));
for (index = 0; ((index < max_print) && (index < ap->a_count)); for (index = 0; ((index < max_print) && (index < ap->a_count));
index++) index++) {
{
ep = elemindex(ap, index); ep = elemindex(ap, index);
if (ep == NULL) if (ep == NULL)
continue; continue;
@@ -491,5 +488,3 @@ compareindices(VALUE *v1, VALUE *v2, long dim)
return TRUE; return TRUE;
} }
/* END CODE */

View File

@@ -547,7 +547,7 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
int int
copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi) copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
{ {
FILEIO *fiop; FILEIO *fiop;
FILE *fp; FILE *fp;
unsigned int numw; unsigned int numw;
@@ -563,7 +563,7 @@ copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
return E_COPYF1; return E_COPYF1;
fp = fiop->fp; fp = fiop->fp;
if (id == 1 || id == 2) { if (id == 1 || id == 2) {
numw = idfputstr(id, (char *)sblk->data + ssi); /* XXX */ numw = idfputstr(id, (char *)sblk->data + ssi); /* XXX */
return 0; return 0;
} }
if (dsi >= 0) { if (dsi >= 0) {
@@ -584,7 +584,7 @@ copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
int int
copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc) copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
{ {
FILEIO *fiop; FILEIO *fiop;
FILE *fp; FILE *fp;
unsigned int numw; unsigned int numw;
ZVALUE fsize; ZVALUE fsize;
@@ -672,7 +672,7 @@ copystr2file(STRING *str, long ssi, long num, FILEID id, long dsi)
return E_COPYF1; return E_COPYF1;
fp = fiop->fp; fp = fiop->fp;
if (id == 1 || id == 2) { if (id == 1 || id == 2) {
numw = idfputstr(id, str->s_str + ssi); /* XXX */ numw = idfputstr(id, str->s_str + ssi); /* XXX */
return 0; return 0;
} }
if (dsi >= 0) { if (dsi >= 0) {
@@ -830,7 +830,7 @@ int
copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi) copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi)
{ {
long len; long len;
char *c, *c1; char *c, *c1;
len = (long)strlen(sstr); len = (long)strlen(sstr);
@@ -898,8 +898,8 @@ copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
* Copying between objects that overlap will take place correctly. * Copying between objects that overlap will take place correctly.
* *
* given: * given:
* s1 destination * s1 destination
* s2 source * s2 source
* n octet count * n octet count
* *
* returns: * returns:
@@ -959,7 +959,7 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
long newsize; long newsize;
USB8 *newdata; USB8 *newdata;
#if CALC_BYTE_ORDER == BIG_ENDIAN #if CALC_BYTE_ORDER == BIG_ENDIAN
ZVALUE *swnum; /* byte swapped numerator */ ZVALUE *swnum; /* byte swapped numerator */
#endif #endif
if (ssi > snum->num.len) if (ssi > snum->num.len)

View File

@@ -8,7 +8,7 @@
#if !defined(__BLKCPY_H__) #if !defined(__BLKCPY_H__)
#define __BLKCPY_H__ #define __BLKCPY_H__
/* /*
* the main copy gateway function * the main copy gateway function

27
block.c
View File

@@ -23,7 +23,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
@@ -141,7 +141,7 @@ blk_free(BLOCK *blk)
/* /*
* blkchk - check the sanity of a block * blkchk - check the sanity of a block
* *
* These checks should never fail if calc is working correctly. During * These checks should never fail if calc is working correctly. During
* 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.
* *
@@ -205,13 +205,13 @@ blkchk(BLOCK *blk)
* *
* Reallocation of a block can change several aspects of a block. * Reallocation of a block can change several aspects of a block.
* *
* It can change the much data it holds or can hold. * It can change the much data it holds or can hold.
* *
* It can change the memory footprint (in terms of * It can change the memory footprint (in terms of
* how much storage is malloced for current or future use). * how much storage is malloced for current or future use).
* *
* It can change the chunk size used to grow malloced size * It can change the chunk size used to grow malloced size
* as the data size grows. * as the data size grows.
* *
* Each of the len and chunksize may be kept the same. * Each of the len and chunksize may be kept the same.
* *
@@ -329,7 +329,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
/* /*
* blktrunc - truncate a BLOCK down to a minimal fixed block * blktrunc - truncate a BLOCK down to a minimal fixed block
* *
* NOTE: THIS IS NOT THE INTERNAL CALC FREE FUNCTION!! This * NOTE: THIS IS NOT THE INTERNAL CALC FREE FUNCTION!! This
* is what blktrunc() builtin calls to reduce storage of a block * is what blktrunc() builtin calls to reduce storage of a block
* down to an absolute minimum. * down to an absolute minimum.
* *
@@ -479,7 +479,7 @@ blk_print(BLOCK *blk)
BOOL havetail; BOOL havetail;
USB8 *ptr; USB8 *ptr;
/* XXX - use the config parameters for better print control */ /* XXX - should use the config parameters for better print control */
printf("chunksize = %d, maxsize = %d, datalen = %d\n\t", printf("chunksize = %d, maxsize = %d, datalen = %d\n\t",
(int)blk->blkchunk, (int)blk->maxsize, (int)blk->datalen); (int)blk->blkchunk, (int)blk->maxsize, (int)blk->datalen);
@@ -512,9 +512,9 @@ nblock_print(NBLOCK *nblk)
printf("chunksize = %d, maxsize = %d, datalen = %d\n\t", printf("chunksize = %d, maxsize = %d, datalen = %d\n\t",
(int)blk->blkchunk, (int)blk->maxsize, (int)blk->datalen); (int)blk->blkchunk, (int)blk->maxsize, (int)blk->datalen);
printf("NULL"); printf("NULL");
} } else {
else
blk_print(blk); blk_print(blk);
}
} }
@@ -556,8 +556,7 @@ reallocnblock(int id, int len, int chunk)
math_error("Allocation failed"); math_error("Allocation failed");
/*NOTREACHED*/ /*NOTREACHED*/
} }
} } else if (newsize != oldsize) {
else if (newsize != oldsize) {
newdata = realloc(blk->data, newsize); newdata = realloc(blk->data, newsize);
if (newdata == NULL) { if (newdata == NULL) {
math_error("Reallocation failed"); math_error("Reallocation failed");
@@ -719,7 +718,7 @@ findnblock(int id)
/* /*
* Create a new block with specified newlen and new chunksize and copy * Create a new block with specified newlen and new chunksize and copy
* min(newlen, oldlen) octets to the new block. The old block is * min(newlen, oldlen) octets to the new block. The old block is
* not changed. * not changed.
*/ */
BLOCK * BLOCK *
@@ -730,7 +729,7 @@ copyrealloc(BLOCK *blk, int newlen, int newchunk)
oldlen = blk->datalen; oldlen = blk->datalen;
if (newlen < 0) /* retain length */ if (newlen < 0) /* retain length */
newlen = oldlen; newlen = oldlen;
if (newchunk < 0) /* retain chunksize */ if (newchunk < 0) /* retain chunksize */

View File

@@ -23,7 +23,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
@@ -35,7 +35,7 @@
#if !defined(__BLOCK_H__) #if !defined(__BLOCK_H__)
#define __BLOCK_H__ #define __BLOCK_H__
/* /*
@@ -139,8 +139,8 @@
* style of output = { * style of output = {
* "line", lines in blkbase with no spaces between octets * "line", lines in blkbase with no spaces between octets
* "string", as one long line with no spaces between octets * "string", as one long line with no spaces between octets
* "od_style", position, spaces between octets * "od_style", position, spaces between octets
* "hd_style"} position, spaces between octets, chars on end * "hd_style"} position, spaces between octets, chars on end
*/ */
struct block { struct block {
LEN blkchunk; /* allocation chunk size */ LEN blkchunk; /* allocation chunk size */

View File

@@ -28,9 +28,9 @@
* swap_b8_in_HALFs - swap 8 and if needed, 16 bits in an array of HALFs * swap_b8_in_HALFs - swap 8 and if needed, 16 bits in an array of HALFs
* *
* given: * given:
* dest - pointer to where the swapped src wil be put or * dest - pointer to where the swapped src wil be put or
* NULL to allocate the storage * NULL to allocate the storage
* src - pointer to a HALF array to swap * src - pointer to a HALF array to swap
* len - length of the src HALF array * len - length of the src HALF array
* *
* returns: * returns:
@@ -263,9 +263,9 @@ swap_b8_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all)
* swap_b16_in_HALFs - swap 16 bits in an array of HALFs * swap_b16_in_HALFs - swap 16 bits in an array of HALFs
* *
* given: * given:
* dest - pointer to where the swapped src wil be put or * dest - pointer to where the swapped src wil be put or
* NULL to allocate the storage * NULL to allocate the storage
* src - pointer to a HALF array to swap * src - pointer to a HALF array to swap
* len - length of the src HALF array * len - length of the src HALF array
* *
* returns: * returns:

2
calc.c
View File

@@ -394,7 +394,7 @@ main(int argc, char **argv)
printf("DEBUG: run_state from %s to %s\n", printf("DEBUG: run_state from %s to %s\n",
run_state_name(run_state), run_state_name(run_state),
run_state_name(RUN_EXIT_WITH_ERROR)); run_state_name(RUN_EXIT_WITH_ERROR));
run_state = RUN_EXIT_WITH_ERROR; run_state = RUN_EXIT_WITH_ERROR;
} }
} }
} }

62
calc.h
View File

@@ -8,7 +8,7 @@
#if !defined(__CALC_H__) #if !defined(__CALC_H__)
#define __CALC_H__ #define __CALC_H__
#include <setjmp.h> #include <setjmp.h>
@@ -20,42 +20,42 @@
/* /*
* Configuration definitions * Configuration definitions
*/ */
#define CALCPATH "CALCPATH" /* environment variable for files */ #define CALCPATH "CALCPATH" /* environment variable for files */
#define CALCRC "CALCRC" /* environment variable for startup */ #define CALCRC "CALCRC" /* environment variable for startup */
#define CALCBINDINGS "CALCBINDINGS" /* environment variable for hist bindings */ #define CALCBINDINGS "CALCBINDINGS" /* environment variable for hist bindings */
#define HOME "HOME" /* environment variable for home dir */ #define HOME "HOME" /* environment variable for home dir */
#define PAGER "PAGER" /* environment variable for help */ #define PAGER "PAGER" /* environment variable for help */
#define SHELL "SHELL" /* environment variable for shell */ #define SHELL "SHELL" /* environment variable for shell */
#define DEFAULTCALCHELP "help" /* help file that -h prints */ #define DEFAULTCALCHELP "help" /* help file that -h prints */
#define DEFAULTSHELL "sh" /* default shell to use */ #define DEFAULTSHELL "sh" /* default shell to use */
#define CALCEXT ".cal" /* extension for files read in */ #define CALCEXT ".cal" /* extension for files read in */
#define MAX_CALCRC 1024 /* maximum length of $CALCRC */ #define MAX_CALCRC 1024 /* maximum length of $CALCRC */
#define HOMECHAR '~' /* char which indicates home directory */ #define HOMECHAR '~' /* char which indicates home directory */
#define DOTCHAR '.' /* char which indicates current directory */ #define DOTCHAR '.' /* char which indicates current directory */
#define PATHCHAR '/' /* char which separates path components */ #define PATHCHAR '/' /* char which separates path components */
#define LISTCHAR ':' /* char which separates paths in a list */ #define LISTCHAR ':' /* char which separates paths in a list */
#define MAXCMD 16384 /* maximum length of command invocation */ #define MAXCMD 16384 /* maximum length of command invocation */
#define MAXERROR 512 /* maximum length of error message string */ #define MAXERROR 512 /* maximum length of error message string */
#define SYMBOLSIZE 256 /* maximum symbol name size */ #define SYMBOLSIZE 256 /* maximum symbol name size */
#define MAXINDICES 20 /* maximum number of indices for objects */ #define MAXINDICES 20 /* maximum number of indices for objects */
#define MAXLABELS 100 /* maximum number of user labels in function */ #define MAXLABELS 100 /* maximum number of user labels in function */
#define MAXSTRING 1024 /* maximum size of string constant */ #define MAXSTRING 1024 /* maximum size of string constant */
#define MAXSTACK 1000 /* maximum depth of evaluation stack */ #define MAXSTACK 1000 /* maximum depth of evaluation stack */
#define MAXFILES 20 /* maximum number of opened files */ #define MAXFILES 20 /* maximum number of opened files */
#define PROMPT1 "> " /* default normal prompt*/ #define PROMPT1 "> " /* default normal prompt*/
#define PROMPT2 ">> " /* default prompt inside multi-line input */ #define PROMPT2 ">> " /* default prompt inside multi-line input */
#define TRACE_NORMAL 0x00 /* normal trace flags */ #define TRACE_NORMAL 0x00 /* normal trace flags */
#define TRACE_OPCODES 0x01 /* trace every opcode */ #define TRACE_OPCODES 0x01 /* trace every opcode */
#define TRACE_NODEBUG 0x02 /* suppress debugging opcodes */ #define TRACE_NODEBUG 0x02 /* suppress debugging opcodes */
#define TRACE_LINKS 0x04 /* display links for real and complex numbers */ #define TRACE_LINKS 0x04 /* display links for real and complex numbers */
#define TRACE_FNCODES 0x08 /* display code for newly defined function */ #define TRACE_FNCODES 0x08 /* display code for newly defined function */
#define TRACE_MAX 0x0f /* maximum value for trace flag */ #define TRACE_MAX 0x0f /* maximum value for trace flag */
#define ABORT_NONE 0 /* abort not needed yet */ #define ABORT_NONE 0 /* abort not needed yet */
#define ABORT_STATEMENT 1 /* abort on statement boundary */ #define ABORT_STATEMENT 1 /* abort on statement boundary */
#define ABORT_OPCODE 2 /* abort on any opcode boundary */ #define ABORT_OPCODE 2 /* abort on any opcode boundary */
#define ABORT_MATH 3 /* abort on any math operation */ #define ABORT_MATH 3 /* abort on any math operation */
#define ABORT_NOW 4 /* abort right away */ #define ABORT_NOW 4 /* abort right away */
@@ -65,10 +65,10 @@
/* /*
* File ids corresponding to standard in, out, error, and when not in use. * File ids corresponding to standard in, out, error, and when not in use.
*/ */
#define FILEID_STDIN ((FILEID) 0) #define FILEID_STDIN ((FILEID) 0)
#define FILEID_STDOUT ((FILEID) 1) #define FILEID_STDOUT ((FILEID) 1)
#define FILEID_STDERR ((FILEID) 2) #define FILEID_STDERR ((FILEID) 2)
#define FILEID_NONE ((FILEID) -1) #define FILEID_NONE ((FILEID) -1)
/* /*
* File I/O routines. * File I/O routines.
@@ -192,7 +192,7 @@ extern int errmax; /* if >= 0, error when errcount exceeds errmax */
extern int new_std; /* TRUE (-n) => use newstd configuration */ extern int new_std; /* TRUE (-n) => use newstd configuration */
extern int allow_read; /* FALSE => may not open any files for reading */ 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 */
/* /*

View File

@@ -340,7 +340,7 @@ Normally on startup,
attempts to execute a collection of attempts to execute a collection of
library scripts. library scripts.
The environment variable $CALCRC (if non-existent The environment variable $CALCRC (if non-existent
then a compiled in value) contains a : separated list of startup then a compiled in value) contains a : separated list of startup
library scripts. library scripts.
No error conditions are produced if these startup No error conditions are produced if these startup
library scripts are not found. library scripts are not found.
@@ -589,7 +589,7 @@ Ernest also supplied the original text for many of the help files.
.sp .sp
Portions of this program are derived from an earlier set of Portions of this program are derived from an earlier set of
public domain arbitrarily precision routines which was posted public domain arbitrarily precision routines which was posted
to the net around 1984. By now, there is almost no recognizable to the net around 1984. By now, there is almost no recognizable
code left from that original source. code left from that original source.
.sp .sp
Most of this source and binary has one of the following copyrights: Most of this source and binary has one of the following copyrights:

View File

@@ -6,12 +6,12 @@ BEGIN {
printf(" * names of calc error values\n"); printf(" * names of calc error values\n");
printf(" */\n"); printf(" */\n");
printf("CONST char *error_table[E__COUNT+2] = {\n"); printf("CONST char *error_table[E__COUNT+2] = {\n");
printf(" \"No error\",\n"); printf(" \"No error\",\n");
} }
{ {
print $0; print $0;
} }
END { END {
printf(" NULL\n"); printf(" NULL\n");
printf("};\n"); printf("};\n");
} }

View File

@@ -1,5 +1,5 @@
# This awk script will print 3 lines before and after any non-blank line that # This awk script will print 3 lines before and after any non-blank line that
# does not begin with a number. This allows the 'make debug' rule to remove # does not begin with a number. This allows the 'make debug' rule to remove
# all non-interest lines the the 'make check' regression output while providing # all non-interest lines the the 'make check' regression output while providing
# 3 lines of context around unexpected output. # 3 lines of context around unexpected output.
# #

View File

@@ -8,7 +8,7 @@
#if !defined(__CMATH_H__) #if !defined(__CMATH_H__)
#define __CMATH_H__ #define __CMATH_H__
#include "qmath.h" #include "qmath.h"
@@ -114,7 +114,7 @@ extern COMPLEX *swap_HALF_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all);
#define cisnegone(c) (cisreal(c) && qisnegone((c)->real)) #define cisnegone(c) (cisreal(c) && qisnegone((c)->real))
#define cisrunit(c) (cisreal(c) && qisunit((c)->real)) #define cisrunit(c) (cisreal(c) && qisunit((c)->real))
#define cisiunit(c) (qiszero((c)->real) && qisunit((c)->imag)) #define cisiunit(c) (qiszero((c)->real) && qisunit((c)->imag))
#define cisunit(c) (cisrunit(c) || cisiunit(c)) #define cisunit(c) (cisrunit(c) || cisiunit(c))
#define cistwo(c) (cisreal(c) && qistwo((c)->real)) #define cistwo(c) (cisreal(c) && qistwo((c)->real))
#define cisint(c) (qisint((c)->real) && qisint((c)->imag)) #define cisint(c) (qisint((c)->real) && qisint((c)->imag))
#define ciseven(c) (qiseven((c)->real) && qiseven((c)->imag)) #define ciseven(c) (qiseven((c)->real) && qiseven((c)->imag))

View File

@@ -180,8 +180,8 @@ getcommands(BOOL toplevel)
/* /*
* Evaluate a line of statements. * Evaluate a line of statements.
* This is done by treating the current line as a function body, * This is done by treating the current line as a function body,
* compiling it, and then executing it. Returns TRUE if the line * compiling it, and then executing it. Returns TRUE if the line
* successfully compiled and executed. The last expression result * successfully compiled and executed. The last expression result
* is saved in the f_savedvalue element of the current function. * is saved in the f_savedvalue element of the current function.
* The nestflag variable should be FALSE for the outermost evaluation * The nestflag variable should be FALSE for the outermost evaluation
* level, and TRUE for all other calls (such as the 'eval' function). * level, and TRUE for all other calls (such as the 'eval' function).
@@ -956,7 +956,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
/* /*
* Read in an object declaration. * Read in an object declaration.
* This is of the following form: * This is of the following form:
* OBJ type [ '{' id [ ',' id ] ... '}' ] [ objlist ]. * OBJ type [ '{' id [ ',' id ] ... '}' ] [ objlist ].
* The OBJ keyword has already been read. Symtype is SYM_UNDEFINED if this * The OBJ keyword has already been read. Symtype is SYM_UNDEFINED if this
* is an OBJ statement, otherwise this is part of a declaration which will * is an OBJ statement, otherwise this is part of a declaration which will
* define new symbols with the specified type. * define new symbols with the specified type.
@@ -1305,7 +1305,7 @@ getcondition(void)
/* /*
* Get an expression list consisting of one or more expressions, * Get an expression list consisting of one or more expressions,
* separated by commas. The value of the list is that of the final expression. * separated by commas. The value of the list is that of the final expression.
* This is the top level routine for parsing expressions. * This is the top level routine for parsing expressions.
* Returns flags describing the type of the last assignment or expression found. * Returns flags describing the type of the last assignment or expression found.
* exprlist = assignment [ ',' assignment ] ... * exprlist = assignment [ ',' assignment ] ...
@@ -1359,8 +1359,8 @@ getopassignment(void)
case T_MODEQUALS: op = OP_MOD; break; case T_MODEQUALS: op = OP_MOD; break;
case T_ANDEQUALS: op = OP_AND; break; case T_ANDEQUALS: op = OP_AND; break;
case T_OREQUALS: op = OP_OR; break; case T_OREQUALS: op = OP_OR; break;
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break; case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break; case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
case T_POWEREQUALS: op = OP_POWER; break; case T_POWEREQUALS: op = OP_POWER; break;
case T_HASHEQUALS: op = OP_HASHOP; break; case T_HASHEQUALS: op = OP_HASHOP; break;
case T_TILDEEQUALS: op = OP_XOR; break; case T_TILDEEQUALS: op = OP_XOR; break;
@@ -1400,8 +1400,8 @@ getopassignment(void)
case T_MODEQUALS: op = OP_MOD; break; case T_MODEQUALS: op = OP_MOD; break;
case T_ANDEQUALS: op = OP_AND; break; case T_ANDEQUALS: op = OP_AND; break;
case T_OREQUALS: op = OP_OR; break; case T_OREQUALS: op = OP_OR; break;
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break; case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break; case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
case T_POWEREQUALS: op = OP_POWER; break; case T_POWEREQUALS: op = OP_POWER; break;
case T_HASHEQUALS: op = OP_HASHOP; break; case T_HASHEQUALS: op = OP_HASHOP; break;
case T_TILDEEQUALS: op = OP_XOR; break; case T_TILDEEQUALS: op = OP_XOR; break;
@@ -1746,7 +1746,7 @@ getshiftexpr(void)
case T_NOT: op = OP_NOT; break; case T_NOT: op = OP_NOT; break;
case T_DIV: op = OP_INVERT; break; case T_DIV: op = OP_INVERT; break;
case T_BACKSLASH: op = OP_BACKSLASH; break; case T_BACKSLASH: op = OP_BACKSLASH; break;
case T_TILDE: op = OP_COMP; break; case T_TILDE: op = OP_COMP; break;
case T_HASH: op = OP_CONTENT; break; case T_HASH: op = OP_CONTENT; break;
} }
if (op) { if (op) {
@@ -1759,7 +1759,7 @@ getshiftexpr(void)
switch (gettoken()) { switch (gettoken()) {
case T_POWER: op = OP_POWER; break; case T_POWER: op = OP_POWER; break;
case T_LEFTSHIFT: op = OP_LEFTSHIFT; break; case T_LEFTSHIFT: op = OP_LEFTSHIFT; break;
case T_RIGHTSHIFT: op = OP_RIGHTSHIFT; break; case T_RIGHTSHIFT: op = OP_RIGHTSHIFT; break;
default: default:
rescantoken(); rescantoken();
return type; return type;
@@ -2187,7 +2187,7 @@ getmatargs(void)
/* /*
* Normal indexing with the indexes separated by commas. * Normal indexing with the indexes separated by commas.
* Initialize the flag in the opcode to assume that the array * Initialize the flag in the opcode to assume that the array
* element will only be referenced for reading. If the parser * element will only be referenced for reading. If the parser
* finds that the element will be referenced for writing, then * finds that the element will be referenced for writing, then
* it will call writeindexop to change the flag in the opcode. * it will call writeindexop to change the flag in the opcode.
*/ */

View File

@@ -138,38 +138,6 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
up1 = up2 = 0; up1 = up2 = 0;
sign = (R & 64) != 0; sign = (R & 64) != 0;
#if 0
if (qiszero(epsilon)) {
aes = qsquare(c->real);
bes = qsquare(c->imag);
v = qqadd(aes, bes);
qfree(aes);
qfree(bes);
u = qsqrt(v, epsilon, 0);
qfree(v);
if (qiszero(u)) {
qfree(u);
return clink(&_czero_);
}
aes = qqadd(u, c->real);
qfree(u);
bes = qscale(aes, -1);
qfree(aes);
u = qsqrt(bes, epsilon, R);
qfree(bes);
if (qiszero(u)) {
qfree(u);
return clink(&_czero_);
}
aes = qscale(c->imag, -1);
v = qqdiv(aes, u);
qfree(aes);
r = comalloc();
r->real = u;
r->imag = v;
return r;
}
#endif
imsign = c->imag->num.sign; imsign = c->imag->num.sign;
es = qsquare(epsilon); es = qsquare(epsilon);
aes = qqdiv(c->real, es); aes = qqdiv(c->real, es);
@@ -255,8 +223,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
up2 = -1; up2 = -1;
zfree(tmp1); zfree(tmp1);
zfree(aa); zfree(aa);
} } else {
else {
s1 = zsqrt(tmp3, &cc, 0); s1 = zsqrt(tmp3, &cc, 0);
zfree(tmp3); zfree(tmp3);
zadd(cc, a, &tmp1); zadd(cc, a, &tmp1);
@@ -333,9 +300,9 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
zfree(mul2); zfree(mul2);
mul2 = tmp2; mul2 = tmp2;
} }
if (ziszero(mul1)) if (ziszero(mul1)) {
u = qlink(&_qzero_); u = qlink(&_qzero_);
else { } else {
mul1.sign = sign ^ epsilon->num.sign; mul1.sign = sign ^ epsilon->num.sign;
u = qalloc(); u = qalloc();
zreduce(mul1, epsilon->den, &tmp2, &u->den); zreduce(mul1, epsilon->den, &tmp2, &u->den);
@@ -343,9 +310,9 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
zfree(tmp2); zfree(tmp2);
} }
zfree(mul1); zfree(mul1);
if (ziszero(mul2)) if (ziszero(mul2)) {
v = qlink(&_qzero_); v = qlink(&_qzero_);
else { } else {
mul2.sign = imsign ^ sign ^ epsilon->num.sign; mul2.sign = imsign ^ sign ^ epsilon->num.sign;
v = qalloc(); v = qalloc();
zreduce(mul2, epsilon->den, &tmp2, &v->den); zreduce(mul2, epsilon->den, &tmp2, &v->den);
@@ -1147,5 +1114,3 @@ cprintfr(COMPLEX *c)
zprintval(i->den, 0L, 0L); zprintval(i->den, 0L, 0L);
} }
} }
/* END CODE */

View File

@@ -69,7 +69,7 @@ csub(COMPLEX *c1, COMPLEX *c2)
/* /*
* Multiply two complex numbers. * Multiply two complex numbers.
* This saves one multiplication over the obvious algorithm by * This saves one multiplication over the obvious algorithm by
* trading it for several extra additions, as follows. Let * trading it for several extra additions, as follows. Let
* q1 = (a + b) * (c + d) * q1 = (a + b) * (c + d)
* q2 = a * c * q2 = a * c
* q3 = b * d * q3 = b * d

View File

@@ -48,7 +48,7 @@ NAMETYPE configs[] = {
{"maxerr", CONFIG_MAXSCAN}, /* old name for maxscan */ {"maxerr", CONFIG_MAXSCAN}, /* old name for maxscan */
{"prompt", CONFIG_PROMPT}, {"prompt", CONFIG_PROMPT},
{"more", CONFIG_MORE}, {"more", CONFIG_MORE},
{"blkmaxprint", CONFIG_BLKMAXPRINT}, {"blkmaxprint", CONFIG_BLKMAXPRINT},
{"blkverbose", CONFIG_BLKVERBOSE}, {"blkverbose", CONFIG_BLKVERBOSE},
{"blkbase", CONFIG_BLKBASE}, {"blkbase", CONFIG_BLKBASE},
{"blkfmt", CONFIG_BLKFMT}, {"blkfmt", CONFIG_BLKFMT},
@@ -96,7 +96,7 @@ CONFIG oldstd = { /* backward compatible standard configuration */
BLK_FMT_HD_STYLE, /* block output format */ BLK_FMT_HD_STYLE, /* block output format */
0, /* internal calc debug level */ 0, /* internal calc debug level */
3, /* calc library debug level */ 3, /* calc library debug level */
0, /* user defined debug level */ 0, /* user defined debug level */
TRUE /* print Quit or abort executed messages */ TRUE /* print Quit or abort executed messages */
}; };
CONFIG newstd = { /* new non-backward compatible configuration */ CONFIG newstd = { /* new non-backward compatible configuration */
@@ -132,7 +132,7 @@ CONFIG newstd = { /* new non-backward compatible configuration */
BLK_FMT_HD_STYLE, /* block output format */ BLK_FMT_HD_STYLE, /* block output format */
0, /* internal calc debug level */ 0, /* internal calc debug level */
3, /* calc library debug level */ 3, /* calc library debug level */
0, /* user defined debug level */ 0, /* user defined debug level */
TRUE /* print Quit or abort executed messages */ TRUE /* print Quit or abort executed messages */
}; };
CONFIG *conf = NULL; /* loaded in at startup - current configuration */ CONFIG *conf = NULL; /* loaded in at startup - current configuration */
@@ -148,7 +148,7 @@ static NAMETYPE modes[] = {
{"int", MODE_INT}, {"int", MODE_INT},
{"real", MODE_REAL}, {"real", MODE_REAL},
{"exp", MODE_EXP}, {"exp", MODE_EXP},
{"hexadecimal", MODE_HEX}, {"hexadecimal", MODE_HEX},
{"hex", MODE_HEX}, {"hex", MODE_HEX},
{"octal", MODE_OCTAL}, {"octal", MODE_OCTAL},
{"oct", MODE_OCTAL}, {"oct", MODE_OCTAL},
@@ -184,7 +184,7 @@ static NAMETYPE truth[] = {
* Possible block base output modes * Possible block base output modes
*/ */
static NAMETYPE blk_base[] = { static NAMETYPE blk_base[] = {
{"hexadecimal", BLK_BASE_HEX}, {"hexadecimal", BLK_BASE_HEX},
{"hex", BLK_BASE_HEX}, {"hex", BLK_BASE_HEX},
{"octal", BLK_BASE_OCT}, {"octal", BLK_BASE_OCT},
{"oct", BLK_BASE_OCT}, {"oct", BLK_BASE_OCT},
@@ -361,7 +361,7 @@ setconfig(int type, VALUE *vp)
switch (type) { switch (type) {
case CONFIG_ALL: case CONFIG_ALL:
newconf = NULL; /* firewall */ newconf = NULL; /* firewall */
if (vp->v_type == V_STR) { if (vp->v_type == V_STR) {
if (strcmp(vp->v_str->s_str, "oldstd") == 0) { if (strcmp(vp->v_str->s_str, "oldstd") == 0) {
newconf = &oldstd; newconf = &oldstd;

View File

@@ -20,16 +20,16 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Prior to calc 2.9.3t9, these routines existed as a calc library called * Prior to calc 2.9.3t9, these routines existed as a calc library called
* cryrand.cal. They have been rewritten in C for performance as well * cryrand.cal. They have been rewritten in C for performance as well
* as to make them available directly from libcalc.a. * as to make them available directly from libcalc.a.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo/ * http://reality.sgi.com/chongo/
* *
* chongo <was here> /\../\ * chongo <was here> /\../\
*/ */
@@ -52,11 +52,11 @@
#define CONFIG_EPSILON 3 #define CONFIG_EPSILON 3
#define CONFIG_EPSILONPREC 3 /* not a real type -- tied to CONFIG_EPSILON */ #define CONFIG_EPSILONPREC 3 /* not a real type -- tied to CONFIG_EPSILON */
#define CONFIG_TRACE 4 #define CONFIG_TRACE 4
#define CONFIG_MAXPRINT 5 #define CONFIG_MAXPRINT 5
#define CONFIG_MUL2 6 #define CONFIG_MUL2 6
#define CONFIG_SQ2 7 #define CONFIG_SQ2 7
#define CONFIG_POW2 8 #define CONFIG_POW2 8
#define CONFIG_REDC2 9 #define CONFIG_REDC2 9
#define CONFIG_TILDE 10 #define CONFIG_TILDE 10
#define CONFIG_TAB 11 #define CONFIG_TAB 11
#define CONFIG_QUOMOD 12 #define CONFIG_QUOMOD 12
@@ -66,10 +66,10 @@
#define CONFIG_APPR 16 #define CONFIG_APPR 16
#define CONFIG_CFAPPR 17 #define CONFIG_CFAPPR 17
#define CONFIG_CFSIM 18 #define CONFIG_CFSIM 18
#define CONFIG_OUTROUND 19 #define CONFIG_OUTROUND 19
#define CONFIG_ROUND 20 #define CONFIG_ROUND 20
#define CONFIG_LEADZERO 21 #define CONFIG_LEADZERO 21
#define CONFIG_FULLZERO 22 #define CONFIG_FULLZERO 22
#define CONFIG_MAXSCAN 23 #define CONFIG_MAXSCAN 23
#define CONFIG_PROMPT 24 #define CONFIG_PROMPT 24
#define CONFIG_MORE 25 #define CONFIG_MORE 25
@@ -87,7 +87,7 @@
* config default symbols * config default symbols
*/ */
#define DISPLAY_DEFAULT 20 /* default digits for float display */ #define DISPLAY_DEFAULT 20 /* default digits for float display */
#define EPSILON_DEFAULT "1e-20" /* allowed error for float calculations */ #define EPSILON_DEFAULT "1e-20" /* allowed error for float calculations */
#define EPSILONPREC_DEFAULT 67 /* 67 ==> 2^-67 <= EPSILON_DEFAULT < 2^-66 */ #define EPSILONPREC_DEFAULT 67 /* 67 ==> 2^-67 <= EPSILON_DEFAULT < 2^-66 */
#define NEW_EPSILON_DEFAULT "1e-10" /* newstd EPSILON_DEFAULT */ #define NEW_EPSILON_DEFAULT "1e-10" /* newstd EPSILON_DEFAULT */
#define NEW_EPSILONPREC_DEFAULT 34 /* 34 ==> 2^-34 <= 1e-10 < 2^-33 */ #define NEW_EPSILONPREC_DEFAULT 34 /* 34 ==> 2^-34 <= 1e-10 < 2^-33 */
@@ -140,7 +140,7 @@ struct config {
long user_debug; /* user defined debug value: 0 default */ long user_debug; /* user defined debug value: 0 default */
BOOL verbose_quit; /* TRUE => print Quit or abort executed msg */ BOOL verbose_quit; /* TRUE => print Quit or abort executed msg */
}; };
typedef struct config CONFIG; typedef struct config CONFIG;
/* /*

View File

@@ -20,7 +20,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
@@ -117,7 +117,7 @@ showcustom(void)
{ {
#if defined(CUSTOM) #if defined(CUSTOM)
CONST struct custom *p; /* current function */ CONST struct custom *p; /* current function */
/* /*
* disable custom functions unless -C was given * disable custom functions unless -C was given

View File

@@ -20,16 +20,16 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Prior to calc 2.9.3t9, these routines existed as a calc library called * Prior to calc 2.9.3t9, these routines existed as a calc library called
* cryrand.cal. They have been rewritten in C for performance as well * cryrand.cal. They have been rewritten in C for performance as well
* as to make them available directly from libcalc.a. * as to make them available directly from libcalc.a.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo/ * http://reality.sgi.com/chongo/
* *
* chongo <was here> /\../\ * chongo <was here> /\../\
*/ */

View File

@@ -6,7 +6,7 @@ Step 0: Determine if is should it be done?
multi-precision calculations in a C-like environment. You should multi-precision calculations in a C-like environment. You should
consider implementing algorithms in the calc language as a first consider implementing algorithms in the calc language as a first
choice. Sometimes an algorithm requires use of special hardware, a choice. Sometimes an algorithm requires use of special hardware, a
non-portable OS or pre-compiled C library. In these cases a custom non-portable OS or pre-compiled C library. In these cases a custom
interface may be needed. interface may be needed.
The custom function interface is intended to make is easy for The custom function interface is intended to make is easy for
@@ -184,7 +184,7 @@ Step 5: Write your custom function
The 3 args are passed in by the custom interface The 3 args are passed in by the custom interface
and have the following meaning: and have the following meaning:
name The name of the custom function that name The name of the custom function that
was called. In particular, this is the first was called. In particular, this is the first
string arg that was given to the custom() string arg that was given to the custom()
builtin. This is the equivalent of argv[0] for builtin. This is the equivalent of argv[0] for
@@ -215,11 +215,11 @@ Step 5: Write your custom function
custom("curds", a, b, c) custom("curds", a, b, c)
would cause vals to point to the following array: would cause vals to point to the following array:
vals[0] points to a vals[0] points to a
vals[1] points to b vals[1] points to b
vals[2] points to c vals[2] points to c
c) The return value is the function must be a VALUE. c) The return value is the function must be a VALUE.
@@ -247,7 +247,7 @@ Step 5: Write your custom function
The VALUE is a union of major value types found inside calc. The VALUE is a union of major value types found inside calc.
The v_type VALUE element determines which union element is The v_type VALUE element determines which union element is
being used. Assume that we have: being used. Assume that we have:
VALUE *vp; VALUE *vp;
@@ -427,12 +427,12 @@ Step 6: Register the function in the custom interface table
level Makefile, one does not have unsatisfied symbols. level Makefile, one does not have unsatisfied symbols.
The brief description should be brief so that 'show custom' looks well The brief description should be brief so that 'show custom' looks well
formatted. If the brief description cannot fit on the same line as formatted. If the brief description cannot fit on the same line as
the name without wrapping on a 80 col window, the description is the name without wrapping on a 80 col window, the description is
probably too long and will not look nice in the show custom output. probably too long and will not look nice in the show custom output.
The minargs places a lower bound on the number of args that The minargs places a lower bound on the number of args that
must be supplied to the interface. This does NOT count must be supplied to the interface. This does NOT count
the name argument given to custom(). So if minargs is 2: the name argument given to custom(). So if minargs is 2:
custom("curds") /* call blocked at high level interface */ custom("curds") /* call blocked at high level interface */

View File

@@ -22,7 +22,7 @@
# PERFORMANCE OF THIS SOFTWARE. # PERFORMANCE OF THIS SOFTWARE.
# #
# Comments, suggestions, bug fixes and questions about these routines # Comments, suggestions, bug fixes and questions about these routines
# are welcome. Send EMail to the address given below. # are welcome. Send EMail to the address given below.
# #
# Happy bit twiddling, # Happy bit twiddling,
# #
@@ -146,7 +146,7 @@ DEBUG= -O
# BSD NO_SHARED= # BSD NO_SHARED=
# SYSV NO_SHARED= -dn # SYSV NO_SHARED= -dn
# IRIX NO_SHARED= -non_shared # IRIX NO_SHARED= -non_shared
# disable NO_SHARED= # disable NO_SHARED=
# #
# If in doubt, use NO_SHARED= # If in doubt, use NO_SHARED=
# #
@@ -168,7 +168,7 @@ RANLIB=:
# a default here just in case you want to build from this directory. # a default here just in case you want to build from this directory.
# #
# Normally certain files depend on the Makefile. If the Makefile is # Normally certain files depend on the Makefile. If the Makefile is
# changed, then certain steps should be redone. If MAKE_FILE is # changed, then certain steps should be redone. If MAKE_FILE is
# set to Makefile, then these files will depend on Makefile. If # set to Makefile, then these files will depend on Makefile. If
# MAKE_FILE is empty, they they wont. # MAKE_FILE is empty, they they wont.
# #
@@ -192,7 +192,7 @@ MAKE_FILE= Makefile
# #
# By default, custom builtin functions may only be executed if calc # By default, custom builtin functions may only be executed if calc
# is given the -C option. This is because custom builtin functions # is given the -C option. This is because custom builtin functions
# may invoke non-standard or non-portable code. One may completely # may invoke non-standard or non-portable code. One may completely
# disable custom builtin functions by not compiling any of code # disable custom builtin functions by not compiling any of code
# #
# ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given # ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given
@@ -333,14 +333,14 @@ c_sysinfo.o: c_sysinfo.c ${MAKE_FILE}
## ##
# #
# File list generation. You can ignore this section. # File list generation. You can ignore this section.
# #
# #
# We will form the names of source files as if they were in a # We will form the names of source files as if they were in a
# sub-directory called calc/lib. # sub-directory called calc/lib.
# #
# NOTE: Due to bogus shells found on one common system we must have # NOTE: Due to bogus shells found on one common system we must have
# an non-emoty else clause for every if condition. *sigh* # an non-emoty else clause for every if condition. *sigh*
# #
## ##
@@ -376,7 +376,7 @@ depend:
${Q}mkdir skel ${Q}mkdir skel
${Q}mkdir skel/custom ${Q}mkdir skel/custom
-${Q}for i in ${C_SRC}; do \ -${Q}for i in ${C_SRC}; do \
${SED} -n '/^#[ ]*include[ ]*"/p' \ ${SED} -n '/^#[ ]*include[ ]*"/p' \
"$$i" > "skel/custom/$$i"; \ "$$i" > "skel/custom/$$i"; \
done done
-${Q}for i in /dev/null ${H_SRC}; do \ -${Q}for i in /dev/null ${H_SRC}; do \

View File

@@ -23,11 +23,11 @@ DESCRIPTION
EXAMPLE EXAMPLE
> foo=5^713; bar=17; baz=list(2,3,4); > foo=5^713; bar=17; baz=list(2,3,4);
> custom("argv", foo, bar, baz, 3+4.5i, pi()) > custom("argv", foo, bar, baz, 3+4.5i, pi())
arg[0] rational_value size=1 sizeof=272 arg[0] rational_value size=1 sizeof=272
arg[1] rational_value size=1 sizeof=68 arg[1] rational_value size=1 sizeof=68
arg[2] list size=3 sizeof=256 arg[2] list size=3 sizeof=256
arg[3] complex_value size=1 sizeof=140 arg[3] complex_value size=1 sizeof=140
arg[4] rational_value size=1 sizeof=84 arg[4] rational_value size=1 sizeof=84
5 5
LIMITS LIMITS

View File

@@ -11,12 +11,12 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo/ * http://reality.sgi.com/chongo/
* *
* chongo <was here> /\../\ * chongo <was here> /\../\
*/ */
@@ -98,13 +98,13 @@ c_argv(char *name, int count, VALUE **vals)
case V_FILE: /* opened file id */ case V_FILE: /* opened file id */
type = "file"; type = "file";
break; break;
case V_RAND: /* address of additive 55 random state */ case V_RAND: /* address of additive 55 random state */
type = "rand_state"; type = "rand_state";
break; break;
case V_RANDOM: /* address of Blum random state */ case V_RANDOM: /* address of Blum random state */
type = "random_state"; type = "random_state";
break; break;
case V_CONFIG: /* configuration state */ case V_CONFIG: /* configuration state */
type = "config_state"; type = "config_state";
break; break;
case V_HASH: /* hash state */ case V_HASH: /* hash state */
@@ -115,7 +115,7 @@ c_argv(char *name, int count, VALUE **vals)
break; break;
#if 0 #if 0
/* XXX - V_OCTET is subject to change */ /* XXX - V_OCTET is subject to change */
case V_OCTET: /* octet (unsigned char) */ case V_OCTET: /* octet (unsigned char) */
type = "octet"; type = "octet";
break; break;
#endif #endif

View File

@@ -11,12 +11,12 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo/ * http://reality.sgi.com/chongo/
* *
* chongo <was here> /\../\ * chongo <was here> /\../\
*/ */

View File

@@ -11,12 +11,12 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo/ * http://reality.sgi.com/chongo/
* *
* chongo <was here> /\../\ * chongo <was here> /\../\
*/ */

View File

@@ -2,7 +2,7 @@
* Permission to use, copy, modify, and distribute this software and * Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted. * its documentation for any purpose and without fee is hereby granted.
* *
* Ernest Bowen, following Landon Curt Noll * Ernest Bowen, following Landon Curt Noll
*/ */
#if defined(CUSTOM) #if defined(CUSTOM)
@@ -20,7 +20,7 @@
* *
* given: * given:
* count = 1; * count = 1;
* vals[0] real number; * vals[0] real number;
* *
* returns: * returns:
* null * null
@@ -29,7 +29,7 @@
VALUE VALUE
c_pzasusb8(char *name, int count, VALUE **vals) c_pzasusb8(char *name, int count, VALUE **vals)
{ {
VALUE result; /* what we will return */ VALUE result; /* what we will return */
ZVALUE z; /* numerator of the value */ ZVALUE z; /* numerator of the value */
long half_cnt; /* number of HALFs in the numerator */ long half_cnt; /* number of HALFs in the numerator */
USB8 *h; /* octet pointer */ USB8 *h; /* octet pointer */

View File

@@ -11,12 +11,12 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo/ * http://reality.sgi.com/chongo/
* *
* chongo <was here> /\../\ * chongo <was here> /\../\
*/ */

View File

@@ -20,12 +20,12 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* Comments, suggestions, bug fixes and questions about these routines * Comments, suggestions, bug fixes and questions about these routines
* are welcome. Send EMail to the address given below. * are welcome. Send EMail to the address given below.
* *
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo/ * http://reality.sgi.com/chongo/
* *
* chongo <was here> /\../\ * chongo <was here> /\../\
*/ */
@@ -37,7 +37,7 @@
/* /*
* NOTE: See the file CUSTOM for instructions on how to add * NOTE: See the file CUSTOM for instructions on how to add
* custom functions. * custom functions.
*/ */

View File

@@ -10,7 +10,7 @@ TYPES
return null return null
DESCRIPTION DESCRIPTION
This custom function does nothing. It is intented for testing This custom function does nothing. It is intented for testing
of the general custom interface. of the general custom interface.
EXAMPLE EXAMPLE

View File

@@ -11,7 +11,7 @@ TYPES
DESCRIPTION DESCRIPTION
This custom function prints out the numerator of a real value This custom function prints out the numerator of a real value
in octets. Each HALF value is printed in a separate line. in octets. Each HALF value is printed in a separate line.
NOTE: The output will vary depending on the size of a HALF NOTE: The output will vary depending on the size of a HALF
and the byte order of the system. See: and the byte order of the system. See:
@@ -26,15 +26,15 @@ DESCRIPTION
EXAMPLE EXAMPLE
> custom("pzasusb8", 0x01020304050607080910111213141516); > custom("pzasusb8", 0x01020304050607080910111213141516);
0: 13141516 0: 13141516
1: 09101112 1: 09101112
2: 05060708 2: 05060708
3: 01020304 3: 01020304
> custom("pzasusb8", 10^25) > custom("pzasusb8", 10^25)
0: 4a000000 0: 4a000000
1: 16140148 1: 16140148
2: 00084595 2: 00084595
> printf("%x\n", 10^25); > printf("%x\n", 10^25);
0x84595161401484a000000 0x84595161401484a000000

28
file.c
View File

@@ -19,7 +19,7 @@
#include "file.h" #include "file.h"
#include "calcerr.h" #include "calcerr.h"
#define READSIZE 1024 /* buffer size for reading */ #define READSIZE 1024 /* buffer size for reading */
/* /*
* external STDIO functions * external STDIO functions
@@ -34,7 +34,7 @@ extern FILE *f_open(char *name, char *mode);
* and cannot be closed. Their file ids are always 0, 1, and 2. * and cannot be closed. Their file ids are always 0, 1, and 2.
*/ */
static FILEIO files[MAXFILES] = { static FILEIO files[MAXFILES] = {
{FILEID_STDIN, NULL, (dev_t)0, (ino_t)0, {FILEID_STDIN, NULL, (dev_t)0, (ino_t)0,
"(stdin)", TRUE, FALSE, 'r', "r"}, "(stdin)", TRUE, FALSE, 'r', "r"},
{FILEID_STDOUT, NULL, (dev_t)0, (ino_t)0, {FILEID_STDOUT, NULL, (dev_t)0, (ino_t)0,
"(stdout)", FALSE, TRUE, 'w', "w"}, "(stdout)", FALSE, TRUE, 'w', "w"},
@@ -43,7 +43,7 @@ static FILEIO files[MAXFILES] = {
}; };
static int ioindex[MAXFILES] = {0,1,2}; /* Indices for FILEIO table */ static int ioindex[MAXFILES] = {0,1,2}; /* Indices for FILEIO table */
static FILEID lastid = FILEID_STDERR; /* Last allocated file id */ static FILEID lastid = FILEID_STDERR; /* Last allocated file id */
static int idnum = 3; /* Number of allocated file ids */ static int idnum = 3; /* Number of allocated file ids */
@@ -398,7 +398,7 @@ indexid(long index)
/* /*
* Close the specified file id. Returns TRUE if there was an error. * Close the specified file id. Returns TRUE if there was an error.
* Closing of stdin, stdout, or stderr is illegal, but closing of already * Closing of stdin, stdout, or stderr is illegal, but closing of already
* closed files is allowed. * closed files is allowed.
*/ */
@@ -536,7 +536,7 @@ flushall(void)
* *
* bit 0: at newline * bit 0: at newline
* bit 1: at null character * bit 1: at null character
* bit 2: at white space (also skips leading white space) * bit 2: at white space (also skips leading white space)
* *
* If neither '\n' nor '\0' is encountered reading continues until EOF. * If neither '\n' nor '\0' is encountered reading continues until EOF.
* If bit 3 is set the stop character is removed. * If bit 3 is set the stop character is removed.
@@ -725,7 +725,7 @@ printid(FILEID id, int flags)
/* /*
* Print a formatted string similar to printf. Various formats of output * Print a formatted string similar to printf. Various formats of output
* are possible, depending on the format string AND the actual types of the * are possible, depending on the format string AND the actual types of the
* values. Mismatches do not cause errors, instead something reasonable is * values. Mismatches do not cause errors, instead something reasonable is
* printed instead. The output goes to the file with the specified id. * printed instead. The output goes to the file with the specified id.
@@ -1294,7 +1294,7 @@ getloc(FILEID id, ZVALUE *res)
*/ */
fiop = findid(id, 0); fiop = findid(id, 0);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return -1; return -1;
} }
fp = fiop->fp; fp = fiop->fp;
@@ -1467,7 +1467,7 @@ setloc(FILEID id, ZVALUE zpos)
*/ */
fiop = findid(id, 0); fiop = findid(id, 0);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return -1; return -1;
} }
fp = fiop->fp; fp = fiop->fp;
@@ -1635,7 +1635,7 @@ getsize(FILEID id, ZVALUE *res)
*/ */
fiop = findid(id, 0); fiop = findid(id, 0);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return 1; return 1;
} }
fp = fiop->fp; fp = fiop->fp;
@@ -1671,7 +1671,7 @@ get_device(FILEID id, ZVALUE *dev)
*/ */
fiop = findid(id, 0); fiop = findid(id, 0);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return -1; return -1;
} }
@@ -1704,7 +1704,7 @@ get_inode(FILEID id, ZVALUE *inode)
*/ */
fiop = findid(id, 0); fiop = findid(id, 0);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return -1; return -1;
} }
@@ -2144,7 +2144,7 @@ scanfstr(char *str, char *fmt, int count, VALUE **vals)
/* /*
* Read a number in floating-point format from a file. The first dot, * Read a number in floating-point format from a file. The first dot,
* if any, is considered as the decimal point; later dots are ignored. * if any, is considered as the decimal point; later dots are ignored.
* For example, -23.45..67. is interpreted as -23.4567 * For example, -23.45..67. is interpreted as -23.4567
* An optional 'e' or 'E' indicates multiplication by a power or 10, * An optional 'e' or 'E' indicates multiplication by a power or 10,
@@ -2394,7 +2394,7 @@ isattyid(FILEID id)
* zero if string found, position stored at res * zero if string found, position stored at res
* *
* XXX - This search is a translation of the original search that did not * XXX - This search is a translation of the original search that did not
* work with large files. The search algorithm used is slow and * work with large files. The search algorithm used is slow and
* should be spead up much more. * should be spead up much more.
*/ */
int int
@@ -2513,7 +2513,7 @@ fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res)
* zero if string found, position stored at res * zero if string found, position stored at res
* *
* XXX - This search is a translation of the original search that did not * XXX - This search is a translation of the original search that did not
* work with large files. The search algorithm used is so slow * work with large files. The search algorithm used is so slow
* as to be painful to the user and needs to be sped up much more. * as to be painful to the user and needs to be sped up much more.
*/ */
int int

4
file.h
View File

@@ -42,7 +42,7 @@ typedef struct {
* We assume that if your system does not have fgetpos/fsetpos, * We assume that if your system does not have fgetpos/fsetpos,
* then it will have a FILEPOS that is a scalar type (e.g., long). * then it will have a FILEPOS that is a scalar type (e.g., long).
* Some obscure systems without fgetpos/fsetpos may not have a simple * Some obscure systems without fgetpos/fsetpos may not have a simple
* scalar type. In these cases the f_tell macro below will fail. * scalar type. In these cases the f_tell macro below will fail.
*/ */
#if defined(HAVE_FPOS) #if defined(HAVE_FPOS)
@@ -51,7 +51,7 @@ typedef struct {
#else #else
#define f_seek_set(stream, loc) \ #define f_seek_set(stream, loc) \
fseek((FILE*)(stream), *(FILEPOS*)(loc), SEEK_SET) fseek((FILE*)(stream), *(FILEPOS*)(loc), SEEK_SET)
#define f_tell(stream, loc) (*((FILEPOS*)(loc)) = ftell((FILE*)(stream))) #define f_tell(stream, loc) (*((FILEPOS*)(loc)) = ftell((FILE*)(stream)))

View File

@@ -12,7 +12,7 @@
* *
* We will #define of 8 symbols: * We will #define of 8 symbols:
* *
* FILEPOS_BITS length in bits of the type FILEPOS * FILEPOS_BITS length in bits of the type FILEPOS
* SWAP_HALF_IN_FILEPOS will copy/swap FILEPOS into an HALF array * SWAP_HALF_IN_FILEPOS will copy/swap FILEPOS into an HALF array
* OFF_T_BITS length in bits of the st_size stat element * OFF_T_BITS length in bits of the st_size stat element
* SWAP_HALF_IN_OFF_T will copy/swap st_size into an HALF array * SWAP_HALF_IN_OFF_T will copy/swap st_size into an HALF array

99
func.c
View File

@@ -133,8 +133,8 @@ static STRINGHEAD newerrorstr;
* arg count definitons * arg count definitons
*/ */
#define IN 100 /* maximum number of arguments */ #define IN 100 /* maximum number of arguments */
#define FE 0x01 /* flag to indicate default epsilon argument */ #define FE 0x01 /* flag to indicate default epsilon argument */
#define FA 0x02 /* preserve addresses of variables */ #define FA 0x02 /* preserve addresses of variables */
/* /*
@@ -146,7 +146,7 @@ struct builtin {
short b_maxargs; /* maximum number of arguments */ short b_maxargs; /* maximum number of arguments */
short b_flags; /* special handling flags */ short b_flags; /* special handling flags */
short b_opcode; /* opcode which makes the call quick */ short b_opcode; /* opcode which makes the call quick */
NUMBER *(*b_numfunc)(); /* routine to calculate numeric function */ NUMBER *(*b_numfunc)(); /* routine to calculate numeric function */
VALUE (*b_valfunc)(); /* routine to calculate general values */ VALUE (*b_valfunc)(); /* routine to calculate general values */
char *b_desc; /* description of function */ char *b_desc; /* description of function */
}; };
@@ -566,7 +566,7 @@ f_factor(int count, NUMBER **vals)
NUMBER *err; /* error return, NULL => use math_error */ NUMBER *err; /* error return, NULL => use math_error */
ZVALUE limit; /* highest prime factor in search */ ZVALUE limit; /* highest prime factor in search */
ZVALUE n; /* number to factor */ ZVALUE n; /* number to factor */
NUMBER *factor; /* the prime factor found */ NUMBER *factor; /* the prime factor found */
int res; /* -1 => error, 0 => not found, 1 => factor found */ int res; /* -1 => error, 0 => not found, 1 => factor found */
/* /*
@@ -966,7 +966,7 @@ f_srand(int count, VALUE **vals)
if (!qisint(vals[0]->v_num)) { if (!qisint(vals[0]->v_num)) {
math_error( math_error(
"srand number seed must be an integer"); "srand number seed must be an integer");
/*NOTREACHED*/ /*NOTREACHED*/
} }
result.v_rand = zsrand(&vals[0]->v_num->num, NULL); result.v_rand = zsrand(&vals[0]->v_num->num, NULL);
break; break;
@@ -1117,7 +1117,7 @@ f_srandom(int count, VALUE **vals)
if (!qisint(vals[0]->v_num)) { if (!qisint(vals[0]->v_num)) {
math_error( math_error(
"srandom number seed must be an integer"); "srandom number seed must be an integer");
/*NOTREACHED*/ /*NOTREACHED*/
} }
result.v_random = zsrandom1(vals[0]->v_num->num, TRUE); result.v_random = zsrandom1(vals[0]->v_num->num, TRUE);
break; break;
@@ -1476,9 +1476,9 @@ f_min(int count, VALUE **vals)
if (qisneg(rel.v_num)) { if (qisneg(rel.v_num)) {
freevalue(&min); freevalue(&min);
min = term; min = term;
} } else {
else
freevalue(&term); freevalue(&term);
}
freevalue(&rel); freevalue(&rel);
} }
return min; return min;
@@ -1532,9 +1532,9 @@ f_max(int count, VALUE **vals)
if (qisneg(rel.v_num)) { if (qisneg(rel.v_num)) {
freevalue(&max); freevalue(&max);
max = term; max = term;
} } else {
else
freevalue(&term); freevalue(&term);
}
freevalue(&rel); freevalue(&rel);
} }
return max; return max;
@@ -3370,9 +3370,9 @@ f_root(int count, VALUE **vals)
err.v_subtype = V_NOSUBTYPE; err.v_subtype = V_NOSUBTYPE;
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
if (count > 2) if (count > 2) {
vp = vals[2]; vp = vals[2];
else { } else {
err.v_num = conf->epsilon; err.v_num = conf->epsilon;
err.v_type = V_NUM; err.v_type = V_NUM;
vp = &err; vp = &err;
@@ -3391,9 +3391,9 @@ f_power(int count, VALUE **vals)
err.v_subtype = V_NOSUBTYPE; err.v_subtype = V_NOSUBTYPE;
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
if (count > 2) if (count > 2) {
vp = vals[2]; vp = vals[2];
else { } else {
err.v_num = conf->epsilon; err.v_num = conf->epsilon;
err.v_type = V_NUM; err.v_type = V_NUM;
vp = &err; vp = &err;
@@ -3413,9 +3413,9 @@ f_polar(int count, VALUE **vals)
err.v_subtype = V_NOSUBTYPE; err.v_subtype = V_NOSUBTYPE;
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
if (count > 2) if (count > 2) {
vp = vals[2]; vp = vals[2];
else { } else {
err.v_num = conf->epsilon; err.v_num = conf->epsilon;
err.v_type = V_NUM; err.v_type = V_NUM;
vp = &err; vp = &err;
@@ -4138,9 +4138,9 @@ f_search(int count, VALUE **vals)
qfree(start); qfree(start);
start = qlink(&_qzero_); start = qlink(&_qzero_);
} }
} } else {
else
start = qlink(start); start = qlink(start);
}
} }
if (end) { if (end) {
if (!qispos(end)) { if (!qispos(end)) {
@@ -4388,8 +4388,7 @@ f_rsearch(int count, VALUE **vals)
else else
end = qlink(size); end = qlink(size);
start = qlink(&_qzero_); start = qlink(&_qzero_);
} } else {
else {
if (start == NULL) if (start == NULL)
start = qlink(&_qzero_); start = qlink(&_qzero_);
if (end == NULL) if (end == NULL)
@@ -4726,9 +4725,9 @@ f_freopen(int count, VALUE **vals)
return error_value(E_FREOPEN2); return error_value(E_FREOPEN2);
} }
errno = 0; errno = 0;
if (count == 2) if (count == 2) {
id = reopenid(vals[0]->v_file, mode, NULL); id = reopenid(vals[0]->v_file, mode, NULL);
else { } else {
if (vals[2]->v_type != V_STR) if (vals[2]->v_type != V_STR)
return error_value(E_FREOPEN3); return error_value(E_FREOPEN3);
id = reopenid(vals[0]->v_file, mode, id = reopenid(vals[0]->v_file, mode,
@@ -4963,9 +4962,9 @@ f_newerror(int count, VALUE **vals)
if (nexterrnum == E_USERDEF) if (nexterrnum == E_USERDEF)
initstr(&newerrorstr); initstr(&newerrorstr);
index = findstr(&newerrorstr, str); index = findstr(&newerrorstr, str);
if (index >= 0) if (index >= 0) {
errnum = E_USERDEF + index; errnum = E_USERDEF + index;
else { } else {
if (nexterrnum == 32767) if (nexterrnum == 32767)
math_error("Too many new error values"); math_error("Too many new error values");
errnum = nexterrnum++; errnum = nexterrnum++;
@@ -5092,9 +5091,9 @@ f_fflush(int count, VALUE **vals)
i = 0; i = 0;
errno = 0; errno = 0;
if (count == 0) if (count == 0) {
i = flushall(); i = flushall();
else { } else {
for (n = 0; n < count; n++) { for (n = 0; n < count; n++) {
if (vals[n]->v_type != V_FILE) if (vals[n]->v_type != V_FILE)
return error_value(E_FFLUSH); return error_value(E_FFLUSH);
@@ -5130,9 +5129,9 @@ f_error(int count, VALUE **vals)
r = E_ERROR2; r = E_ERROR2;
} }
} }
} } else {
else
r = set_errno(-1); r = set_errno(-1);
}
return error_value(r); return error_value(r);
} }
@@ -5192,9 +5191,9 @@ f_fseek(int count, VALUE **vals)
return error_value(E_FSEEK1); return error_value(E_FSEEK1);
if (vals[1]->v_type != V_NUM || qisfrac(vals[1]->v_num)) if (vals[1]->v_type != V_NUM || qisfrac(vals[1]->v_num))
return error_value(E_FSEEK2); return error_value(E_FSEEK2);
if (count == 2) if (count == 2) {
whence = 0; whence = 0;
else { } else {
if (vals[2]->v_type != V_NUM || qisfrac(vals[2]->v_num) || if (vals[2]->v_type != V_NUM || qisfrac(vals[2]->v_num) ||
qisneg(vals[2]->v_num)) qisneg(vals[2]->v_num))
return error_value(E_FSEEK2); return error_value(E_FSEEK2);
@@ -5248,10 +5247,10 @@ f_rewind(int count, VALUE **vals)
/* initialize VALUE */ /* initialize VALUE */
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
if (count == 0) if (count == 0) {
rewindall(); rewindall();
else { } else {
for (n = 0; n < count; n++) { for (n = 0; n < count; n++) {
if (vals[n]->v_type != V_FILE) if (vals[n]->v_type != V_FILE)
return error_value(E_REWIND1); return error_value(E_REWIND1);
@@ -5337,7 +5336,7 @@ static int
filescan(FILEID id, int count, VALUE **vals) filescan(FILEID id, int count, VALUE **vals)
{ {
char *str; char *str;
int i; int i;
int n = 0; int n = 0;
VALUE val; VALUE val;
VALUE result; VALUE result;
@@ -6331,10 +6330,10 @@ static VALUE
f_cmdbuf(void) f_cmdbuf(void)
{ {
VALUE result; VALUE result;
char *newcp; char *newcp;
/* initialize VALUE */ /* initialize VALUE */
result.v_type = V_STR; result.v_type = V_STR;
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
newcp = (char *)malloc(strlen(cmdbuf) + 1); newcp = (char *)malloc(strlen(cmdbuf) + 1);
@@ -6357,7 +6356,7 @@ f_getenv(VALUE *v1)
math_error("Non-string argument for getenv"); math_error("Non-string argument for getenv");
/*NOTREACHED*/ /*NOTREACHED*/
} }
result.v_type = V_STR; result.v_type = V_STR;
str = getenv(v1->v_str->s_str); str = getenv(v1->v_str->s_str);
if (str == NULL) if (str == NULL)
result.v_type = V_NULL; result.v_type = V_NULL;
@@ -6468,7 +6467,7 @@ static VALUE
f_putenv(int count, VALUE **vals) f_putenv(int count, VALUE **vals)
{ {
VALUE result; VALUE result;
char *putenv_str; char *putenv_str;
/* initialize VALUE */ /* initialize VALUE */
result.v_type = V_NUM; result.v_type = V_NUM;
@@ -6530,8 +6529,8 @@ static VALUE
f_strpos(VALUE *haystack, VALUE *needle) f_strpos(VALUE *haystack, VALUE *needle)
{ {
VALUE result; VALUE result;
char *cpointer; char *cpointer;
int cindex; int cindex;
/* initialize VALUE */ /* initialize VALUE */
result.v_type = V_NUM; result.v_type = V_NUM;
@@ -6541,11 +6540,11 @@ f_strpos(VALUE *haystack, VALUE *needle)
math_error("Non-string argument for index"); math_error("Non-string argument for index");
/*NOTREACHED*/ /*NOTREACHED*/
} }
cpointer = strstr(haystack->v_str->s_str, cpointer = strstr(haystack->v_str->s_str,
needle->v_str->s_str); needle->v_str->s_str);
if (cpointer == NULL) if (cpointer == NULL)
cindex = 0; cindex = 0;
else else
cindex = cpointer - haystack->v_str->s_str + 1; cindex = cpointer - haystack->v_str->s_str + 1;
result.v_num = itoq((long) cindex); result.v_num = itoq((long) cindex);
return result; return result;
@@ -6584,7 +6583,7 @@ static NUMBER *
f_base(int count, NUMBER **vals) f_base(int count, NUMBER **vals)
{ {
long base; /* output base/mode */ long base; /* output base/mode */
long oldbase=0; /* output base/mode */ long oldbase=0; /* output base/mode */
/* deal with just a query */ /* deal with just a query */
if (count != 1) { if (count != 1) {
@@ -6886,9 +6885,9 @@ f_blocks(int count, VALUE **vals)
nblk = findnblock(id); nblk = findnblock(id);
if (nblk == NULL) if (nblk == NULL) {
return error_value(E_BLOCKS2); return error_value(E_BLOCKS2);
else { } else {
result.v_type = V_NBLOCK; result.v_type = V_NBLOCK;
result.v_nblock = nblk; result.v_nblock = nblk;
} }
@@ -7311,14 +7310,14 @@ f_md5(int count, VALUE **vals)
* *
* For nice output, when the description of function (b_desc) * For nice output, when the description of function (b_desc)
* gets too long (extends into col 79) you should chop the * gets too long (extends into col 79) you should chop the
* line and add "\n\t\t ", thats newline, 2 tabs a 4 spaces. * line and add "\n\t\t ", thats newline, 2 tabs a 4 spaces.
* For example the description: * For example the description:
* *
* ... very long description that goes beyond col 79 * ... very long description that goes beyond col 79
* *
* should be written as: * should be written as:
* *
* "... very long description that\n\t\t goes beyond col 79"}, * "... very long description that\n\t\t goes beyond col 79"},
* *
* fields: * fields:
* b_name name of built-in function * b_name name of built-in function
@@ -7394,7 +7393,7 @@ static CONST struct builtin builtins[] = {
{"ceil", 1, 1, 0, OP_NOP, 0, f_ceil, {"ceil", 1, 1, 0, OP_NOP, 0, f_ceil,
"smallest integer greater than or equal to number"}, "smallest integer greater than or equal to number"},
{"cfappr", 1, 3, 0, OP_NOP, f_cfappr, 0, {"cfappr", 1, 3, 0, OP_NOP, f_cfappr, 0,
"approximate a within accuracy b using\n\t\t continued fractions"}, "approximate a within accuracy b using\n\t\t continued fractions"},
{"cfsim", 1, 2, 0, OP_NOP, f_cfsim, 0, {"cfsim", 1, 2, 0, OP_NOP, f_cfsim, 0,
"simplify number using continued fractions"}, "simplify number using continued fractions"},
{"char", 1, 1, 0, OP_NOP, 0, f_char, {"char", 1, 1, 0, OP_NOP, 0, f_char,
@@ -7626,7 +7625,7 @@ static CONST struct builtin builtins[] = {
{"istype", 2, 2, 0, OP_ISTYPE, 0, 0, {"istype", 2, 2, 0, OP_ISTYPE, 0, 0,
"whether the type of a is same as the type of b"}, "whether the type of a is same as the type of b"},
{"jacobi", 2, 2, 0, OP_NOP, qjacobi, 0, {"jacobi", 2, 2, 0, OP_NOP, qjacobi, 0,
"-1 => a is not quadratic residue mod b\n\t\t 1 => b is composite, or a is quad residue of b"}, "-1 => a is not quadratic residue mod b\n\t\t 1 => b is composite, or a is quad residue of b"},
{"join", 1, IN, 0, OP_NOP, 0, f_join, {"join", 1, IN, 0, OP_NOP, 0, f_join,
"join one or more lists into one list"}, "join one or more lists into one list"},
{"lcm", 1, IN, 0, OP_NOP, f_lcm, 0, {"lcm", 1, IN, 0, OP_NOP, f_lcm, 0,
@@ -7700,7 +7699,7 @@ static CONST struct builtin builtins[] = {
{"ord", 1, 1, 0, OP_NOP, 0, f_ord, {"ord", 1, 1, 0, OP_NOP, 0, f_ord,
"integer corresponding to character value"}, "integer corresponding to character value"},
{"param", 1, 1, 0, OP_ARGVALUE, 0, 0, {"param", 1, 1, 0, OP_ARGVALUE, 0, 0,
"value of parameter n (or parameter count if n\n\t\t is zero)"}, "value of parameter n (or parameter count if n\n\t\t is zero)"},
{"perm", 2, 2, 0, OP_NOP, qperm, 0, {"perm", 2, 2, 0, OP_NOP, qperm, 0,
"permutation number a!/(a-b)!"}, "permutation number a!/(a-b)!"},
{"prevcand", 1, 5, 0, OP_NOP, f_prevcand, 0, {"prevcand", 1, 5, 0, OP_NOP, f_prevcand, 0,

2
func.h
View File

@@ -6,7 +6,7 @@
#if !defined(__FUNC_H__) #if !defined(__FUNC_H__)
#define __FUNC_H__ #define __FUNC_H__
#include "calc.h" #include "calc.h"

6
hash.c
View File

@@ -248,14 +248,14 @@ hash_final(HASH *state)
* *
* given: * given:
* type - hash type (see hash.h) * type - hash type (see hash.h)
* longval - a long value * longval - a long value
* state - the state to hash * state - the state to hash
* *
* returns: * returns:
* the new state * the new state
* *
* This function will hash a long value as if it were a 64 bit value. * This function will hash a long value as if it were a 64 bit value.
* The input is a long. If a long is smaller than 64 bits, we will * The input is a long. If a long is smaller than 64 bits, we will
* hash a final 32 bits of zeros. * hash a final 32 bits of zeros.
*/ */
HASH * HASH *

4
hash.h
View File

@@ -52,8 +52,8 @@
*/ */
typedef struct hashstate HASH; typedef struct hashstate HASH;
struct hashstate { struct hashstate {
int hashtype; /* XYZ_HASH_TYPE debug value */ int hashtype; /* XYZ_HASH_TYPE debug value */
BOOL bytes; /* TRUE => reading bytes rather than words */ BOOL bytes; /* TRUE => reading bytes rather than words */
void (*update)(HASH*, USB8*, USB32); /* update arbitrary length */ void (*update)(HASH*, USB8*, USB32); /* update arbitrary length */
void (*chkpt)(HASH*); /* checkpoint a state */ void (*chkpt)(HASH*); /* checkpoint a state */
void (*note)(int, HASH*); /* note a special value */ void (*note)(int, HASH*); /* note a special value */

View File

@@ -5,7 +5,7 @@
* have_offscl * have_offscl
* *
* On some systems, off_t is a scalar value on which one can perform * On some systems, off_t is a scalar value on which one can perform
* arithmetic operations, assignments and comparisons. On some systems * arithmetic operations, assignments and comparisons. On some systems
* off_t is some sort of union or struct which must be converted into * off_t is some sort of union or struct which must be converted into
* a ZVALUE in order to perform arithmetic operations, assignments and * a ZVALUE in order to perform arithmetic operations, assignments and
* comparisons. * comparisons.

View File

@@ -5,7 +5,7 @@
* have_posscl * have_posscl
* *
* On some systems, FILEPOS is a scalar value on which one can perform * On some systems, FILEPOS is a scalar value on which one can perform
* arithmetic operations, assignments and comparisons. On some systems * arithmetic operations, assignments and comparisons. On some systems
* FILEPOS is some sort of union or struct which must be converted into * FILEPOS is some sort of union or struct which must be converted into
* a ZVALUE in order to perform arithmetic operations, assignments and * a ZVALUE in order to perform arithmetic operations, assignments and
* comparisons. * comparisons.
@@ -51,7 +51,7 @@ main(void)
{ {
#if !defined(FILEPOS_NON_SCALAR) #if !defined(FILEPOS_NON_SCALAR)
FILEPOS value; /* an FILEPOS to perform arithmatic on */ FILEPOS value; /* an FILEPOS to perform arithmatic on */
FILEPOS value2; /* an FILEPOS to perform arithmatic on */ FILEPOS value2; /* an FILEPOS to perform arithmatic on */
/* /*
* do some math opts on an FILEPOS * do some math opts on an FILEPOS

View File

@@ -9,7 +9,7 @@
* as if it were vsprintf() and hope for the best. * as if it were vsprintf() and hope for the best.
* *
* This program will output #defines and exits 0 if vsprintf() (or sprintf()) * This program will output #defines and exits 0 if vsprintf() (or sprintf())
* produces the results that we expect. This program exits 1 if vsprintf() * produces the results that we expect. This program exits 1 if vsprintf()
* (or sprintf()) produces unexpected results while using the <stdarg.h> * (or sprintf()) produces unexpected results while using the <stdarg.h>
* include file. * include file.
*/ */
@@ -109,14 +109,14 @@ main(void)
puts(" * SIMULATE_STDARG"); puts(" * SIMULATE_STDARG");
puts(" *"); puts(" *");
puts(" * WARNING: This type of stdarg makes assumptions about the stack"); puts(" * WARNING: This type of stdarg makes assumptions about the stack");
puts(" * that may not be true on your system. You may want to"); puts(" * that may not be true on your system. You may want to");
puts(" * define STDARG (if using ANSI C) or VARARGS."); puts(" * define STDARG (if using ANSI C) or VARARGS.");
puts(" */"); puts(" */");
puts("typedef char *va_list;"); puts("typedef char *va_list;");
puts("#define va_start(ap,parmn) (void)((ap) = (char*)(&(parmn) + 1))"); puts("#define va_start(ap,parmn) (void)((ap) = (char*)(&(parmn) + 1))");
puts("#define va_end(ap) (void)((ap) = 0)"); puts("#define va_end(ap) (void)((ap) = 0)");
puts("#define va_arg(ap, type) \\"); puts("#define va_arg(ap, type) \\");
puts(" (((type*)((ap) = ((ap) + sizeof(type))))[-1])"); puts(" (((type*)((ap) = ((ap) + sizeof(type))))[-1])");
puts("#define SIMULATE_STDARG /* use std_arg.h to simulate <stdarg.h> */"); puts("#define SIMULATE_STDARG /* use std_arg.h to simulate <stdarg.h> */");
#else #else
puts("#define STDARG /* use <stdarg.h> */"); puts("#define STDARG /* use <stdarg.h> */");

View File

@@ -50,8 +50,8 @@ main(void)
#else /* HAVE_NO_USTAT */ #else /* HAVE_NO_USTAT */
struct stat stat_dot; /* stat of "." */ struct stat stat_dot; /* stat of "." */
struct ustat ustat_dot; /* usage stat of "." */ struct ustat ustat_dot; /* usage stat of "." */
(void) stat(".", &stat_dot); (void) stat(".", &stat_dot);
(void) ustat(stat_dot.st_dev, &ustat_dot); (void) ustat(stat_dot.st_dev, &ustat_dot);

View File

@@ -6,7 +6,7 @@
* and hope for the best. * and hope for the best.
* *
* This program will output #defines and exits 0 if vsprintf() (or sprintf()) * This program will output #defines and exits 0 if vsprintf() (or sprintf())
* produces the results that we expect. This program exits 1 if vsprintf() * produces the results that we expect. This program exits 1 if vsprintf()
* (or sprintf()) produces unexpected results while using the <stdarg.h> * (or sprintf()) produces unexpected results while using the <stdarg.h>
* include file. * include file.
*/ */

View File

@@ -153,7 +153,7 @@ all: ${FULL_HELP_FILES} full ${DETAIL_HELP} ${DETAIL_CLONE} \
# used by the upper level Makefile to determine of we have done all # used by the upper level Makefile to determine of we have done all
# #
# NOTE: Due to bogus shells found on one common system we must have # NOTE: Due to bogus shells found on one common system we must have
# an non-emoty else clause for every if condition. *sigh* # an non-emoty else clause for every if condition. *sigh*
# #
.all: .all:
rm -f .all rm -f .all
@@ -341,7 +341,7 @@ ${SINGULAR_FILES}: ${PLURAL_FILES}
# Form the builtin file # Form the builtin file
# #
# We ave a "chicken-and-egg" problem. We want the builtn help file to # We ave a "chicken-and-egg" problem. We want the builtn help file to
# accurately reflect the function list. It would be nice if we could # accurately reflect the function list. It would be nice if we could
# just execute calc show builtin, but calc may not have been built or # just execute calc show builtin, but calc may not have been built or
# buildable at this point. The hack-a-round used is to convert ../func.c # buildable at this point. The hack-a-round used is to convert ../func.c
# into a standalone program that generates a suitable function list # into a standalone program that generates a suitable function list
@@ -379,7 +379,7 @@ builtin: builtin.top builtin.end ../func.c funclist.sed
## ##
# #
# File list generation. You can ignore this section. # File list generation. You can ignore this section.
# #
# #
# We will form the names of source files as if they were in a # We will form the names of source files as if they were in a

View File

@@ -17,7 +17,7 @@ DESCRIPTION
acosh(x) is the nonnegative real number v for which cosh(v) = x. acosh(x) is the nonnegative real number v for which cosh(v) = x.
It is given by It is given by
acosh(x) = ln(x + sqrt(x^2 - 1)) acosh(x) = ln(x + sqrt(x^2 - 1))
EXAMPLE EXAMPLE
> print acosh(2, 1e-5), acosh(2, 1e-10), acosh(2, 1e-15), acosh(2, 1e-20) > print acosh(2, 1e-5), acosh(2, 1e-10), acosh(2, 1e-15), acosh(2, 1e-20)

View File

@@ -16,7 +16,7 @@ DESCRIPTION
acoth(x) is the real number v for which coth(v) = x. acoth(x) is the real number v for which coth(v) = x.
It is given by It is given by
acoth(x) = ln((x + 1)/(x - 1))/2 acoth(x) = ln((x + 1)/(x - 1))/2
EXAMPLE EXAMPLE
> print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20) > print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20)

View File

@@ -16,7 +16,7 @@ DESCRIPTION
acsch(x) is the real number v for which csch(v) = x. It is given by acsch(x) is the real number v for which csch(v) = x. It is given by
acsch(x) = ln((1 + sqrt(1 + x^2))/x) acsch(x) = ln((1 + sqrt(1 + x^2))/x)
EXAMPLE EXAMPLE

View File

@@ -20,7 +20,7 @@ DESCRIPTION
otherwise accessing, such a vacated address may be catastrophic. otherwise accessing, such a vacated address may be catastrophic.
An octet is normally expressed by B[i] where B is a block and An octet is normally expressed by B[i] where B is a block and
0 <= i < sizeof(B). &B[i] then returns the address at which this 0 <= i < sizeof(B). &B[i] then returns the address at which this
octet is located until the block is freed or relocated. Freeing octet is located until the block is freed or relocated. Freeing
of an unnamed block B occurs when a new value is assigned to B or of an unnamed block B occurs when a new value is assigned to B or
when B ceases to exist; a named block B is freed by blkfree(B(). when B ceases to exist; a named block B is freed by blkfree(B().
@@ -96,7 +96,7 @@ DESCRIPTION
> define f(a) = 27 + a; > define f(a) = 27 + a;
the three occurrences of 27 have the same address which may be displayed the three occurrences of 27 have the same address which may be displayed
by any of &27, &*x, &*y and &f(0). If x and y are assigned by any of &27, &*x, &*y and &f(0). If x and y are assigned
other values and f is redefined or undefined and the 27 has not been other values and f is redefined or undefined and the 27 has not been
stored elsewhere (e.g. as the "old value" or in another function stored elsewhere (e.g. as the "old value" or in another function
definition or as an element in an association), the address assigned at definition or as an element in an association), the address assigned at
@@ -105,7 +105,7 @@ DESCRIPTION
When a function returns a number value, that number value is usually When a function returns a number value, that number value is usually
placed at a newly allocated address, even if an equal number is stored placed at a newly allocated address, even if an equal number is stored
elsewhere. For example calls to f(a), as defined above, with the same elsewhere. For example calls to f(a), as defined above, with the same
non-zero value for a will be assigned to different addresses as can be non-zero value for a will be assigned to different addresses as can be
seen from printing &*A, &*B, &*C after seen from printing &*A, &*B, &*C after

View File

@@ -84,7 +84,7 @@ DESCRIPTION
Complex x: Complex x:
Returns appr(re(x), y, z) + appr(im(x), y, z) * 1i Returns appr(re(x), y, z) + appr(im(x), y, z) * 1i
PROPERTIES PROPERTIES
If appr(x,y,z) != x, then abs(x - appr(x,y,z)) < abs(y). If appr(x,y,z) != x, then abs(x - appr(x,y,z)) < abs(y).

View File

@@ -16,7 +16,7 @@ DESCRIPTION
asech(x) is the real number v for which sech(v) = x. It is given by asech(x) is the real number v for which sech(v) = x. It is given by
asech(x) = ln((1 + sqrt(1 - x^2))/x) asech(x) = ln((1 + sqrt(1 - x^2))/x)
EXAMPLE EXAMPLE
> print asech(.5,1e-5), asech(.5,1e-10), asech(.5,1e-15), asech(.5,1e-20) > print asech(.5,1e-5), asech(.5,1e-10), asech(.5,1e-15), asech(.5,1e-20)

View File

@@ -16,7 +16,7 @@ DESCRIPTION
asinh(x) is the real number v for which sinh(v) = x. It is given by asinh(x) is the real number v for which sinh(v) = x. It is given by
asinh(x) = ln(x + sqrt(1 + x^2)) asinh(x) = ln(x + sqrt(1 + x^2))
EXAMPLE EXAMPLE
> print asinh(2, 1e-5), asinh(2, 1e-10), asinh(2, 1e-15), asinh(2, 1e-20) > print asinh(2, 1e-5), asinh(2, 1e-10), asinh(2, 1e-15), asinh(2, 1e-20)

View File

@@ -44,7 +44,7 @@ DESCRIPTION
In simple assignments, = associates from right to left so that, for In simple assignments, = associates from right to left so that, for
example, example,
a = b = c a = b = c
has the effect of a = (b = c) and results in assigning the value of c has the effect of a = (b = c) and results in assigning the value of c
to both a and b. The expression (a = b) = c is acceptable, but has the to both a and b. The expression (a = b) = c is acceptable, but has the
@@ -66,7 +66,7 @@ DESCRIPTION
that of A[0] = A[1]. that of A[0] = A[1].
If, in execution of a = b, a is changed by the evaluation of b, the If, in execution of a = b, a is changed by the evaluation of b, the
value of b may be stored in an unintended or inaccessible location. For value of b may be stored in an unintended or inaccessible location. For
example, example,
mat A[2]= {1,2}; mat A[2]= {1,2};
A[0] = (A = 3); A[0] = (A = 3);

View File

@@ -14,7 +14,7 @@ DESCRIPTION
assignments of the forms assignments of the forms
A[a_1] = v_1 A[a_1] = v_1
A[a_1, a_2] = v_2 A[a_1, a_2] = v_2
A[a_1, a_2, a_3] = v_3 A[a_1, a_2, a_3] = v_3
A[a_1, a_2, a_3, a_4] = v_4 A[a_1, a_2, a_3, a_4] = v_4
@@ -53,7 +53,7 @@ DESCRIPTION
a sequential scan through the elements difficult. a sequential scan through the elements difficult.
The search and rsearch functions can search for an element in an The search and rsearch functions can search for an element in an
association which has the specified value. They return the index association which has the specified value. They return the index
of the found element, or a NULL value if the value was not found. of the found element, or a NULL value if the value was not found.
Associations can be copied by an assignment, and can be compared Associations can be copied by an assignment, and can be compared

View File

@@ -18,8 +18,8 @@ DESCRIPTION
The following convention is used to declare modes: The following convention is used to declare modes:
base config base config
value string value string
2 "binary" binary fractions 2 "binary" binary fractions
8 "octal" octal fractions 8 "octal" octal fractions

View File

@@ -11,7 +11,7 @@ TYPES
return int return int
DESCRIPTION DESCRIPTION
Determine if the binary bit y is set in x. If: Determine if the binary bit y is set in x. If:
x x
int(---) mod 2 == 1 int(---) mod 2 == 1

View File

@@ -26,7 +26,7 @@ DESCRIPTION
... , B[len-1], these all initially having zero value. ... , B[len-1], these all initially having zero value.
The octets B[i] for i >= len always have zero value. If B[i] with The octets B[i] for i >= len always have zero value. If B[i] with
some i >= len is referenced, len is increased by 1. For example: some i >= len is referenced, len is increased by 1. For example:
B[i] = x B[i] = x
@@ -70,7 +70,7 @@ DESCRIPTION
If a block value B created by B = blk(len, chunk) is assigned to If a block value B created by B = blk(len, chunk) is assigned to
another variable by C = B, a new block of the same structure as B another variable by C = B, a new block of the same structure as B
is created to become the value of C, and the octets in B are copied is created to become the value of C, and the octets in B are copied
to this new block. A block with possibly different length or to this new block. A block with possibly different length or
chunksize is created by C = blk(B, newlen, newchunk), only the first chunksize is created by C = blk(B, newlen, newchunk), only the first
min(len, newlen) octets being copied from B; later octets are min(len, newlen) octets being copied from B; later octets are
assigned zero value. If omitted, newlen and newchunk default to assigned zero value. If omitted, newlen and newchunk default to
@@ -120,14 +120,14 @@ DESCRIPTION
last two avoid printing of the new value for A. last two avoid printing of the new value for A.
Named blocks are assigned index numbers 0, 1, 2, ..., in the order Named blocks are assigned index numbers 0, 1, 2, ..., in the order
of their creation. The block with index id is returned by blocks(id). of their creation. The block with index id is returned by blocks(id).
With no argument, blocks() returns the number of current unfreed With no argument, blocks() returns the number of current unfreed
named blocks. A named block may be used named blocks. A named block may be used
The memory allocated to a named block is freed by the blkfree() The memory allocated to a named block is freed by the blkfree()
function with argument the named block, its name, or its id number. function with argument the named block, its name, or its id number.
The block remains in existence but with a null data pointer, The block remains in existence but with a null data pointer,
its length and size being reduced to zero. A new block of memory its length and size being reduced to zero. A new block of memory
may be allocated to it, with possibly new length and chunksize by: may be allocated to it, with possibly new length and chunksize by:
blk(val [, len, chunk]) blk(val [, len, chunk])

View File

@@ -90,7 +90,7 @@ DESCRIPTION
so that num can be at most size(B) - ssi. so that num can be at most size(B) - ssi.
For copying to a block B (named or unnamed), reallocation will be For copying to a block B (named or unnamed), reallocation will be
required if dsi + num > sizeof(B). (This will not be permitted if required if dsi + num > sizeof(B). (This will not be permitted if
protect(B) has bit 4 set.) protect(B) has bit 4 set.)
For copying from a file stream fs, num can be at most size(fs) - ssi. For copying from a file stream fs, num can be at most size(fs) - ssi.

View File

@@ -12,7 +12,7 @@ TYPES
DESCRIPTION DESCRIPTION
If val is a named block, or the name of a named block, or the If val is a named block, or the name of a named block, or the
identifying index for a named block, blkfree(val) frees the identifying index for a named block, blkfree(val) frees the
memory block allocated to this named block. The block remains memory block allocated to this named block. The block remains
in existence with the same name, identifying index, and chunksize, in existence with the same name, identifying index, and chunksize,
but its size and maxsize becomes zero and the pointer for the start but its size and maxsize becomes zero and the pointer for the start
of its data block null. of its data block null.
@@ -26,16 +26,16 @@ EXAMPLE
> B1 = blk("foo") > B1 = blk("foo")
> B2 = blk("Second block") > B2 = blk("Second block")
show blocks show blocks
id name id name
---- ----- ---- -----
0 foo 0 foo
1 Second block 1 Second block
> blkfree(B1) > blkfree(B1)
> show blocks > show blocks
id name id name
---- ----- ---- -----
1 Second block 1 Second block
> B1 > B1
block 0: foo block 0: foo

View File

@@ -12,7 +12,7 @@ TYPES
Otherwise, if x is an object of type tt, or if x is not an object or Otherwise, if x is an object of type tt, or if x is not an object or
number but y is an object of type tt, and the function tt_bround has number but y is an object of type tt, and the function tt_bround has
to be defined; the types for x, plcs, rnd, and the returned value, to be defined; the types for x, plcs, rnd, and the returned value,
if any, are as required for specified in tt_bround. For the object if any, are as required for specified in tt_bround. For the object
case, plcs and rnd default to the null value. case, plcs and rnd default to the null value.
For other cases: For other cases:
@@ -31,7 +31,7 @@ DESCRIPTION
If the number of binary places is n and eps = 10^-n, the If the number of binary places is n and eps = 10^-n, the
result is the same as for appr(x, eps, rnd). This will be result is the same as for appr(x, eps, rnd). This will be
exactly x if x is a multiple of eps; otherwise rounding occurs exactly x if x is a multiple of eps; otherwise rounding occurs
to one of the nearest multiples of eps on either side of x. Which to one of the nearest multiples of eps on either side of x. Which
of these multiples is returned is determined by z = rnd & 31, i.e. of these multiples is returned is determined by z = rnd & 31, i.e.
the five low order bits of rnd, as follows: the five low order bits of rnd, as follows:

View File

@@ -4,25 +4,25 @@
to be set or read. If only one argument is given, then the current to be set or read. If only one argument is given, then the current
value of the named parameter is returned. If two arguments are given, value of the named parameter is returned. If two arguments are given,
then the named parameter is set to the value of the second argument, then the named parameter is set to the value of the second argument,
and the old value of the parameter is returned. Therefore you can and the old value of the parameter is returned. Therefore you can
change a parameter and restore its old value later. The possible change a parameter and restore its old value later. The possible
parameters are explained in the next section. parameters are explained in the next section.
The scale function multiplies or divides a number by a power of 2. The scale function multiplies or divides a number by a power of 2.
This is used for fractional calculations, unlike the << and >> This is used for fractional calculations, unlike the << and >>
operators, which are only defined for integers. For example, operators, which are only defined for integers. For example,
scale(6, -3) is 3/4. scale(6, -3) is 3/4.
The quomod function is used to obtain both the quotient and remainder The quomod function is used to obtain both the quotient and remainder
of a division in one operation. The first two arguments a and b are of a division in one operation. The first two arguments a and b are
the numbers to be divided. The last two arguments c and d are two the numbers to be divided. The last two arguments c and d are two
variables which will be assigned the quotient and remainder. For variables which will be assigned the quotient and remainder. For
nonnegative arguments, the results are equivalent to computing a//b nonnegative arguments, the results are equivalent to computing a//b
and a%b. If a is negative and the remainder is nonzero, then the and a%b. If a is negative and the remainder is nonzero, then the
quotient will be one less than a//b. This makes the following three quotient will be one less than a//b. This makes the following three
properties always hold: The quotient c is always an integer. The properties always hold: The quotient c is always an integer. The
remainder d is always 0 <= d < b. The equation a = b * c + d always remainder d is always 0 <= d < b. The equation a = b * c + d always
holds. This function returns 0 if there is no remainder, and 1 if holds. This function returns 0 if there is no remainder, and 1 if
there is a remainder. For examples, quomod(10, 3, x, y) sets x to 3, there is a remainder. For examples, quomod(10, 3, x, y) sets x to 3,
y to 1, and returns the value 1, and quomod(-4, 3.14159, x, y) sets x y to 1, and returns the value 1, and quomod(-4, 3.14159, x, y) sets x
to -2, y to 2.28318, and returns the value 1. to -2, y to 2.28318, and returns the value 1.
@@ -37,8 +37,8 @@
The digit and bit functions return individual digits of a number, The digit and bit functions return individual digits of a number,
either in base 10 or in base 2, where the lowest digit of a number either in base 10 or in base 2, where the lowest digit of a number
is at digit position 0. For example, digit(5678, 3) is 5, and is at digit position 0. For example, digit(5678, 3) is 5, and
bit(0b1000100, 2) is 1. Negative digit positions indicate places bit(0b1000100, 2) is 1. Negative digit positions indicate places
to the right of the decimal or binary point, so that for example, to the right of the decimal or binary point, so that for example,
digit(3.456, -1) is 4. digit(3.456, -1) is 4.
@@ -139,11 +139,11 @@
The functions rcin, rcmul, rcout, rcpow, and rcsq are used to The functions rcin, rcmul, rcout, rcpow, and rcsq are used to
perform modular arithmetic calculations for large odd numbers perform modular arithmetic calculations for large odd numbers
faster than the usual methods. To do this, you first use the faster than the usual methods. To do this, you first use the
rcin function to convert all input values into numbers which are rcin function to convert all input values into numbers which are
in a format called REDC format. Then you use rcmul, rcsq, and in a format called REDC format. Then you use rcmul, rcsq, and
rcpow to multiply such numbers together to produce results also rcpow to multiply such numbers together to produce results also
in REDC format. Finally, you use rcout to convert a number in in REDC format. Finally, you use rcout to convert a number in
REDC format back to a normal number. The addition, subtraction, REDC format back to a normal number. The addition, subtraction,
negation, and equality comparison between REDC numbers are done negation, and equality comparison between REDC numbers are done
using the normal modular methods. For example, to calculate the using the normal modular methods. For example, to calculate the
@@ -185,8 +185,8 @@
The following convention is used to declare modes: The following convention is used to declare modes:
base config base config
value string value string
2 "binary" binary fractions 2 "binary" binary fractions
8 "octal" octal fractions 8 "octal" octal fractions

View File

@@ -1,8 +1,8 @@
Builtin functions Builtin functions
There is a large number of built-in functions. Many of the There is a large number of built-in functions. Many of the
functions work on several types of arguments, whereas some only functions work on several types of arguments, whereas some only
work for the correct types (e.g., numbers or strings). In the work for the correct types (e.g., numbers or strings). In the
following description, this is indicated by whether or not the following description, this is indicated by whether or not the
description refers to values or numbers. This display is generated description refers to values or numbers. This display is generated
by the 'show builtin' command. by the 'show builtin' command.

View File

@@ -10,7 +10,7 @@ TYPES
DESCRIPTION DESCRIPTION
This function returns the calculation level at which it is called. This function returns the calculation level at which it is called.
When a command is being read from a terminal or from a file, When a command is being read from a terminal or from a file,
calc is at calculation level zero. The level is increased calc is at calculation level zero. The level is increased
by 1 each time calculation starts of a user-defined function by 1 each time calculation starts of a user-defined function
or of eval(S) for some expression S which evaluates to a string. It or of eval(S) for some expression S which evaluates to a string. It
decreases to zero if an error occurs or a quit or abort statement decreases to zero if an error occurs or a quit or abort statement

View File

@@ -6,7 +6,7 @@ SYNOPSIS
TYPES TYPES
x real x real
eps real with abs(eps) < 1, defaults to epsilon() eps real with abs(eps) < 1, defaults to epsilon()
n real with n >= 1 n real with n >= 1
rnd integer, defaults to config("cfappr") rnd integer, defaults to config("cfappr")
@@ -21,7 +21,7 @@ DESCRIPTION
If n >= 1 and den(x) > n, cfappr(x, n) returns the nearest above, If n >= 1 and den(x) > n, cfappr(x, n) returns the nearest above,
nearest below, or nearest, approximation to x with denominator less nearest below, or nearest, approximation to x with denominator less
than or equal to n. If den(x) <= n, cfappr(x,n) returns x. than or equal to n. If den(x) <= n, cfappr(x,n) returns x.
In either case when the result v is not x, how v relates to x is In either case when the result v is not x, how v relates to x is
determined by bits 0, 1, 2 and 4 of the argument rnd in the same way as determined by bits 0, 1, 2 and 4 of the argument rnd in the same way as

View File

@@ -30,7 +30,7 @@ DESCRIPTION
This corresponds to the use of rnd for functions like round(x, n, rnd). This corresponds to the use of rnd for functions like round(x, n, rnd).
If bit 3 or 4 of rnd is set, the lower order bits are ignored; bit 3 If bit 3 or 4 of rnd is set, the lower order bits are ignored; bit 3
is ignored if bit 4 is set. Thusi, for rnd > 3, it sufficient to is ignored if bit 4 is set. Thusi, for rnd > 3, it sufficient to
consider the two cases rnd = 8 and rnd = 16. consider the two cases rnd = 8 and rnd = 16.
If den(x) > 2, cfsim(x, 8) returns the value of the penultimate simple If den(x) > 2, cfsim(x, 8) returns the value of the penultimate simple
@@ -55,7 +55,7 @@ DESCRIPTION
rnd integer x half-integer x den(x) > 2 rnd integer x half-integer x den(x) > 2
8 0 x - sgn(x)/2 approximant 8 0 x - sgn(x)/2 approximant
16 x - sgn(x) x + sgn(x)/2 nearest 16 x - sgn(x) x + sgn(x)/2 nearest
From either cfsim(x, 0) and cfsim(x, 1), the other is easily From either cfsim(x, 0) and cfsim(x, 1), the other is easily
@@ -72,7 +72,7 @@ DESCRIPTION
Iteration of cfsim(x,8) until an integer is obtained gives a sequence of Iteration of cfsim(x,8) until an integer is obtained gives a sequence of
"good" approximations to x with decreasing denominators and "good" approximations to x with decreasing denominators and
correspondingly decreasing accuracy; each denominator is less than half correspondingly decreasing accuracy; each denominator is less than half
the preceding denominator. (Unlike the "forward" sequence of the preceding denominator. (Unlike the "forward" sequence of
continued-fraction approximants these are not necessarily alternately continued-fraction approximants these are not necessarily alternately
greater than and less than x.) greater than and less than x.)

View File

@@ -17,7 +17,7 @@ TYPES
return if x and y are both real: -1, 0, or 1 return if x and y are both real: -1, 0, or 1
if x and y are both numbers but not both real: if x and y are both numbers but not both real:
-1, 0, 1, -1+1i, 1i, 1+1i, -1-1i, -1i, or 1-1i -1, 0, 1, -1+1i, 1i, 1+1i, -1-1i, -1i, or 1-1i
if x and y are both strings: -1, 0, or 1 if x and y are both strings: -1, 0, or 1
all other cases: the null value all other cases: the null value
@@ -47,7 +47,7 @@ DESCRIPTION
obj point {x,y}; obj point {x,y};
if points with real components are to be partially ordered by their if points with real components are to be partially ordered by their
euclidean distance from the origin, an appropriate point_rel euclidean distance from the origin, an appropriate point_rel
function may be that given by function may be that given by
define point_rel(a,b) = sgn(a.x^2 + a.y^2 - b.x^2 - b.y^2); define point_rel(a,b) = sgn(a.x^2 + a.y^2 - b.x^2 - b.y^2);

View File

@@ -3,7 +3,7 @@ Command sequence
This is a sequence of any the following command formats, where This is a sequence of any the following command formats, where
each command is terminated by a semicolon or newline. Long command each command is terminated by a semicolon or newline. Long command
lines can be extended by using a back-slash followed by a newline lines can be extended by using a back-slash followed by a newline
character. When this is done, the prompt shows a double angle character. When this is done, the prompt shows a double angle
bracket to indicate that the line is still in progress. Certain bracket to indicate that the line is still in progress. Certain
cases will automatically prompt for more input in a similar manner, cases will automatically prompt for more input in a similar manner,
even without the back-slash. The most common case for this is when even without the back-slash. The most common case for this is when
@@ -25,7 +25,7 @@ Command sequence
The second form defines a simple function which calculates The second form defines a simple function which calculates
the specified expression value from the specified parameters. the specified expression value from the specified parameters.
The expression cannot be a statement. However, the comma The expression cannot be a statement. However, the comma
and question mark operators can be useful. Examples of and question mark operators can be useful. Examples of
simple functions are: simple functions are:
define sumcubes(a, b) = a^3 + b^3 define sumcubes(a, b) = a^3 + b^3
@@ -45,7 +45,7 @@ Command sequence
read filename read filename
read -once filename read -once filename
This reads definitions from the specified filename. This reads definitions from the specified filename.
The name can be quoted if desired. The calculator The name can be quoted if desired. The calculator
uses the CALCPATH environment variable to search uses the CALCPATH environment variable to search
through the specified directories for the filename, through the specified directories for the filename,
similarly to the use of the PATH environment variable. similarly to the use of the PATH environment variable.
@@ -54,7 +54,7 @@ Command sequence
directory followed by a general calc library directory). directory followed by a general calc library directory).
The ".cal" extension is defaulted for input files, so The ".cal" extension is defaulted for input files, so
that if "filename" is not found, then "filename.cal" is that if "filename" is not found, then "filename.cal" is
then searched for. The contents of the filename are then searched for. The contents of the filename are
command sequences which can consist of expressions to command sequences which can consist of expressions to
evaluate or functions to define, just like at the top evaluate or functions to define, just like at the top
level command level. level command level.
@@ -82,7 +82,7 @@ Command sequence
later read in order to recreate the variable values. later read in order to recreate the variable values.
For speed reasons, values are written as hex fractions. For speed reasons, values are written as hex fractions.
This command currently only saves simple types, so that This command currently only saves simple types, so that
matrices, lists, and objects are not saved. Function matrices, lists, and objects are not saved. Function
definitions are also not saved. definitions are also not saved.
If the -m mode disallows opening of files for writing, If the -m mode disallows opening of files for writing,
@@ -247,7 +247,7 @@ Command sequence
> <==== calc interactive prompt > <==== calc interactive prompt
because the '-i' calc causes ABORT to drop into an because the '-i' calc causes ABORT to drop into an
interactive prompt. However typing a QUIT or ABORT interactive prompt. However typing a QUIT or ABORT
at the interactive prompt level will always calc to exit, at the interactive prompt level will always calc to exit,
even when calc is invoked with '-i'. even when calc is invoked with '-i'.
@@ -304,5 +304,5 @@ Command sequence
Also see the help topic: Also see the help topic:
statement flow control and declaration statements statement flow control and declaration statements
usage how to invoke the calc command and calc -options usage how to invoke the calc command and calc -options

View File

@@ -1,10 +1,10 @@
Configuration parameters Configuration parameters
Configuration parameters affect how the calculator performs certain Configuration parameters affect how the calculator performs certain
operations. Among features that are controlled by these parameters operations. Among features that are controlled by these parameters
are the accuracy of some calculations, the displayed format of results, are the accuracy of some calculations, the displayed format of results,
the choice from possible alternative algorithms, and whether or not the choice from possible alternative algorithms, and whether or not
debugging information is displayed. The parameters are debugging information is displayed. The parameters are
read or set using the "config" built-in function; they remain in effect read or set using the "config" built-in function; they remain in effect
until their values are changed by a config or equivalent instruction. until their values are changed by a config or equivalent instruction.
The following parameters can be specified: The following parameters can be specified:
@@ -65,7 +65,7 @@ Configuration parameters
It allows functions to control their configuration without impacting It allows functions to control their configuration without impacting
the calling function. the calling function.
There are two configuration state aliases that may be set. To There are two configuration state aliases that may be set. To
set the backward compatible standard configuration: set the backward compatible standard configuration:
config("all", "oldstd") config("all", "oldstd")
@@ -105,7 +105,7 @@ 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 for oldstd is 20, for newstd 10. specified. The initial value for oldstd is 20, for newstd 10.
The parameter may be changed to the value d by either The parameter may be changed to the value d by either
config("display", d) or by display (d). This parameter does not change config("display", d) or by display (d). This parameter does not change
the stored value of a number. Where rounding is necessary to the stored value of a number. Where rounding is necessary to
@@ -116,7 +116,7 @@ Configuration parameters
calculation of functions for which exact values are not possible or calculation of functions for which exact values are not possible or
not desired. For most functions, the not desired. For most functions, the
remainder = exact value - calculated value remainder = exact value - calculated value
has absolute value less than epsilon, but, except when the sign of has absolute value less than epsilon, but, except when the sign of
the remainder is controlled by an appropriate parameter, the the remainder is controlled by an appropriate parameter, the
@@ -133,7 +133,7 @@ Configuration parameters
The "mode" parameter is a string specifying the mode for printing of The "mode" parameter is a string specifying the mode for printing of
numbers by the unformatted print functions, and the default numbers by the unformatted print functions, and the default
("%d" specifier) for formatted print functions. The initial mode ("%d" specifier) for formatted print functions. The initial mode
is "real". The available modes are: is "real". The available modes are:
"frac" decimal fractions "frac" decimal fractions
"int" decimal integer "int" decimal integer
@@ -152,10 +152,10 @@ Configuration parameters
runs in a time of O(N^2). The second method is a recursive and runs in a time of O(N^2). The second method is a recursive and
complicated method which runs in a time of O(N^1.585). The argument complicated method which runs in a time of O(N^1.585). The argument
for these parameters is the number of binary words at which the for these parameters is the number of binary words at which the
second algorithm begins to be used. The minimum value is 2, and second algorithm begins to be used. The minimum value is 2, and
the maximum value is very large. If 2 is used, then the recursive the maximum value is very large. If 2 is used, then the recursive
algorithm is used all the way down to single digits, which becomes algorithm is used all the way down to single digits, which becomes
slow since the recursion overhead is high. If a number such as slow since the recursion overhead is high. If a number such as
1000000 is used, then the recursive algorithm is never used, causing 1000000 is used, then the recursive algorithm is never used, causing
calculations for large numbers to slow down. For a typical example calculations for large numbers to slow down. For a typical example
on a 386, the two algorithms are about equal in speed for a value on a 386, the two algorithms are about equal in speed for a value
@@ -174,9 +174,9 @@ Configuration parameters
Redc2 specifies the sizes of numbers at which calc switches from Redc2 specifies the sizes of numbers at which calc switches from
its first to its second algorithm when using the REDC algorithm. its first to its second algorithm when using the REDC algorithm.
The first algorithm performs a multiply and a modular reduction The first algorithm performs a multiply and a modular reduction
together in one loop which runs in O(N^2). The second algorithm together in one loop which runs in O(N^2). The second algorithm
does the REDC calculation using three multiplies, and runs in does the REDC calculation using three multiplies, and runs in
O(N^1.585). The argument for redc2 is the size of the modulus at O(N^1.585). The argument for redc2 is the size of the modulus at
which the second algorithm begins to be used. which the second algorithm begins to be used.
Config("tilde") controls whether or not a leading tilde ('~') is Config("tilde") controls whether or not a leading tilde ('~') is
@@ -185,7 +185,7 @@ Configuration parameters
specified maximum number. The initial "tilde" value is 1. specified maximum number. The initial "tilde" value is 1.
Config ("tab") controls the printing of a tab before results Config ("tab") controls the printing of a tab before results
automatically displayed when working interactively. It does not automatically displayed when working interactively. It does not
affect the printing by the functions print, printf, etc. The initial affect the printing by the functions print, printf, etc. The initial
"tab" value is 1. "tab" value is 1.
@@ -271,7 +271,7 @@ Configuration parameters
The default is to print only the first 256 octets. The default is to print only the first 256 octets.
The "blkverbose" determines if all lines, including duplicates The "blkverbose" determines if all lines, including duplicates
should be printed. If TRUE, then all lines are printed. If false, should be printed. If TRUE, then all lines are printed. If false,
duplicate lines are skipped and only a "*" is printed in a style duplicate lines are skipped and only a "*" is printed in a style
similar to od. This config value has not meaning if "blkfmt" is "str". similar to od. This config value has not meaning if "blkfmt" is "str".
@@ -319,7 +319,7 @@ Configuration parameters
The "calc_debug" is intended for controlling internal calc routines The "calc_debug" is intended for controlling internal calc routines
that test its operation, or collect or display information that that test its operation, or collect or display information that
might be useful for debug purposes. Much of the output from these might be useful for debug purposes. Much of the output from these
will make sense only to calc wizards. Zero value (the default for will make sense only to calc wizards. Zero value (the default for
both oldstd and newstd) of config("lib_calc") corresponds to switching both oldstd and newstd) of config("lib_calc") corresponds to switching
off all these routines. For nonzero value, particular bits off all these routines. For nonzero value, particular bits
@@ -401,16 +401,16 @@ Configuration parameters
The following are synonyms for true: The following are synonyms for true:
"on" "yes" "y" "true" "t" "1" any non-zero number "on" "yes" "y" "true" "t" "1" any non-zero number
The following are synonyms for false: The following are synonyms for false:
"off" "no" "n" "false" "f" "0" the number zero (0) "off" "no" "n" "false" "f" "0" the number zero (0)
Examples of setting some parameters are: Examples of setting some parameters are:
config("mode", "exp"); exponential output config("mode", "exp"); exponential output
config("display", 50); 50 digits of output config("display", 50); 50 digits of output
epsilon(epsilon() / 8); 3 bits more accuracy epsilon(epsilon() / 8); 3 bits more accuracy
config("tilde", 0) disable roundoff tilde printing config("tilde", 0) disable roundoff tilde printing
config("tab", "off") disable leading tab printing config("tab", "off") disable leading tab printing

View File

@@ -40,7 +40,7 @@ You should send submissions to:
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]] [[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
Thanks for considering submitting code to calc. Calc is a collective 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!

View File

@@ -15,7 +15,7 @@ Credits
hist.c which is used to do the command line editing. hist.c which is used to do the command line editing.
Thanks to Ernest W. Bowen for supplying many improvements in Thanks to Ernest W. Bowen for supplying many improvements in
accuracy and generality for some numeric functions. Much of accuracy and generality for some numeric functions. Much of
this was in terms of actual code which I gratefully accepted. this was in terms of actual code which I gratefully accepted.
Ernest also supplied the original text for many of the help files. Ernest also supplied the original text for many of the help files.

View File

@@ -28,7 +28,7 @@ DESCRIPTION
calc -C calc -C
In other words, explicit action must be taken in order to In other words, explicit action must be taken in order to
enable the use of custom functions. By default (no -C arg) enable the use of custom functions. By default (no -C arg)
custom functions are compiled in but disabled so that only custom functions are compiled in but disabled so that only
portable calc scripts may be used. portable calc scripts may be used.
@@ -36,7 +36,7 @@ DESCRIPTION
multi-precision calculations in a C-like environment. You should multi-precision calculations in a C-like environment. You should
consider implementing algorithms in the calc language as a first consider implementing algorithms in the calc language as a first
choice. Sometimes an algorithm requires use of special hardware, a choice. Sometimes an algorithm requires use of special hardware, a
non-portable OS or pre-compiled C library. In these cases a custom non-portable OS or pre-compiled C library. In these cases a custom
interface may be needed. interface may be needed.
The custom function interface is intended to make is easy for The custom function interface is intended to make is easy for

View File

@@ -9,7 +9,7 @@ Function definitions
by a return statement, and the function definition is ended with a by a return statement, and the function definition is ended with a
right brace. right brace.
There are some subtle differences, however. The types of parameters There are some subtle differences, however. The types of parameters
and variables are not defined at compile time, and may vary during and variables are not defined at compile time, and may vary during
execution and be different in different calls to the function. For execution and be different in different calls to the function. For
example, a two-argument function add may be defined by example, a two-argument function add may be defined by

View File

@@ -11,7 +11,7 @@ TYPES
DESCRIPTION DESCRIPTION
For real x, den(x) returns the denominator of x when x is expressed For real x, den(x) returns the denominator of x when x is expressed
in lowest terms with positive denominator. In calc, in lowest terms with positive denominator. In calc,
real values are actually rational values. Each calc real real values are actually rational values. Each calc real
value can be uniquely expressed as: value can be uniquely expressed as:

View File

@@ -14,7 +14,7 @@ Environment variables
/usr/local/lib/calc /usr/local/lib/calc
This value is used by the READ command. It is an error This value is used by the READ command. It is an error
if no such readable file is found. if no such readable file is found.
The CALCBINDINGS file searches the CALCPATH as well. The CALCBINDINGS file searches the CALCPATH as well.

View File

@@ -1 +1 @@
/^#define E_[^_].*[ ][1-9][0-9]*[ ]\/\* .* \*\//s/#define E_.*[ ]\([1-9][0-9]*\)[ ]*\/\* \(.*\)[ ][ ]*\*\// \1 \2/p /^#define E_[^_].*[ ][1-9][0-9]*[ ]\/\* .* \*\//s/#define E_.*[ ]\([1-9][0-9]*\)[ ]*\/\* \(.*\)[ ][ ]*\*\// \1 \2/p

View File

@@ -11,7 +11,7 @@ TYPES
DESCRIPTION DESCRIPTION
For eval(str), the value of str is to be a string that could be the body For eval(str), the value of str is to be a string that could be the body
of the definition of a function f(). This string may declare local of the definition of a function f(). This string may declare local
variables and include keywords (while, for, ...) other than the variables and include keywords (while, for, ...) other than the
reserved keywords (define, show, help, read, write, show, cd) intended reserved keywords (define, show, help, read, write, show, cd) intended
for interactive use or for reading from a file. for interactive use or for reading from a file.

View File

@@ -1,5 +1,5 @@
NAME NAME
exp - exponential function exp - exponential function
SYNOPSIS SYNOPSIS
exp(x [,eps]) exp(x [,eps])

View File

@@ -14,7 +14,7 @@ TYPES
DESCRIPTION DESCRIPTION
If n >= 0 and n has a prime factor less than or equal to limit, If n >= 0 and n has a prime factor less than or equal to limit,
factor(n, limit) returns the smallest such factor. If n >= 0 factor(n, limit) returns the smallest such factor. If n >= 0
and the smallest prime factor of n exceeds limit, 1 is returned. and the smallest prime factor of n exceeds limit, 1 is returned.
In particular, if n >= 0 and limit <= 1, factor(n, limit) In particular, if n >= 0 and limit <= 1, factor(n, limit)
always returns 1; factor(n,2) returns 2 if and only if n is even. always returns 1; factor(n,2) returns 2 if and only if n is even.

View File

@@ -13,7 +13,7 @@ DESCRIPTION
This function closes the open file associated with the descriptor fd. This function closes the open file associated with the descriptor fd.
When this is done, the file value associated with the file remains When this is done, the file value associated with the file remains
a file value, but appears 'closed', and cannot be used in further a file value, but appears 'closed', and cannot be used in further
file-related calls (except fclose) without causing errors. This same file-related calls (except fclose) without causing errors. This same
action occurs to all copies of the file value. You do not need to action occurs to all copies of the file value. You do not need to
explicitly close all the copies of a file value. explicitly close all the copies of a file value.
@@ -26,7 +26,7 @@ DESCRIPTION
there had been an error using the file, or the null value if there had been an error using the file, or the null value if
there was no error. there was no error.
Closing a closed file is permitted. Fclose returns null in Closing a closed file is permitted. Fclose returns null in
this case. this case.
EXAMPLE EXAMPLE

View File

@@ -14,7 +14,7 @@ DESCRIPTION
is set or clear. is set or clear.
The end-of-file flag for the stream fd is set if reading at the The end-of-file flag for the stream fd is set if reading at the
end-of-file position is attempted. The flag is cleared by end-of-file position is attempted. The flag is cleared by
positioning operations (fseek, rewind, fsetpos) and by freopen. positioning operations (fseek, rewind, fsetpos) and by freopen.
EXAMPLE EXAMPLE
@@ -23,14 +23,14 @@ EXAMPLE
> fflush(fd1) > fflush(fd1)
> fd2 = fopen("/tmp/newfile", "r") > fd2 = fopen("/tmp/newfile", "r")
> feof(fd2) > feof(fd2)
0 0
> fgetline(fd2) > fgetline(fd2)
"Chongo was here" "Chongo was here"
> feof(fd2) > feof(fd2)
0 0
> fgetline(fd2) > fgetline(fd2)
> feof(fd2) > feof(fd2)
1 1
LIMITS LIMITS
none none

View File

@@ -20,7 +20,7 @@ DESCRIPTION
EXAMPLE EXAMPLE
> fd = fopen("/etc/motd", "r") > fd = fopen("/etc/motd", "r")
> ferror(fd) > ferror(fd)
0 0
LIMITS LIMITS
fd must be associaed with an open file fd must be associaed with an open file

View File

@@ -14,7 +14,7 @@ DESCRIPTION
associated with fd. associated with fd.
If there is a next character, this function returns a 1 If there is a next character, this function returns a 1
character string containing that character. In the case character string containing that character. In the case
of EOF or error, nil is returned. of EOF or error, nil is returned.
EXAMPLE EXAMPLE

View File

@@ -16,7 +16,7 @@ DESCRIPTION
characters are skipped. If the reading reaches end-of-file, the characters are skipped. If the reading reaches end-of-file, the
null value is returned. If non-whitespace is encountered, formation null value is returned. If non-whitespace is encountered, formation
of a string begins, continuing until whitespace of '\0' or end-of-file of a string begins, continuing until whitespace of '\0' or end-of-file
is reached. The returned value is this string (terminated as usual is reached. The returned value is this string (terminated as usual
by a null character). After the operation, the file position will by a null character). After the operation, the file position will
be immediately after the first whitespace character of '\0' or at be immediately after the first whitespace character of '\0' or at
end-of-file. end-of-file.

View File

@@ -14,7 +14,7 @@ DESCRIPTION
the open file associated with fd. Unlike fgets, the trailing the open file associated with fd. Unlike fgets, the trailing
newline is removed from the return string. newline is removed from the return string.
Empty lines return the null string. When the end of file is reached, Empty lines return the null string. When the end of file is reached,
fgetline returns the null value. (Note the distinction between a null fgetline returns the null value. (Note the distinction between a null
string and a null value.) string and a null value.)

View File

@@ -6,7 +6,7 @@ Using files
Some differences do occur, as will be explained here. Some differences do occur, as will be explained here.
Names of files are subject to ~ expansion just like the C or Names of files are subject to ~ expansion just like the C or
Korn shell. For example, the file name: Korn shell. For example, the file name:
~/.rc.cal ~/.rc.cal
@@ -19,8 +19,8 @@ Using files
A file can be opened for either reading, writing, or appending. A file can be opened for either reading, writing, or appending.
To do this, the 'fopen' function is used, which accepts a filename To do this, the 'fopen' function is used, which accepts a filename
and an open mode, both as strings. You use 'r' for reading, 'w' and an open mode, both as strings. You use 'r' for reading, 'w'
for writing, and 'a' for appending. For example, to open the file for writing, and 'a' for appending. For example, to open the file
'foo' for reading, the following could be used: 'foo' for reading, the following could be used:
fd = fopen('foo', 'r'); fd = fopen('foo', 'r');
@@ -53,7 +53,7 @@ Using files
The 'fclose' function is used to close a file which had been opened. The 'fclose' function is used to close a file which had been opened.
When this is done, the file value associated with the file remains When this is done, the file value associated with the file remains
a file value, but appears 'closed', and cannot be used in further a file value, but appears 'closed', and cannot be used in further
file-related calls (except fclose) without causing errors. This same file-related calls (except fclose) without causing errors. This same
action occurs to all copies of the file value. You do not need to action occurs to all copies of the file value. You do not need to
explicitly close all the copies of a file value. The 'fclose' explicitly close all the copies of a file value. The 'fclose'
function returns the numeric value of errno if there had been an function returns the numeric value of errno if there had been an
@@ -67,7 +67,7 @@ Using files
print "error #" : badfile : ":", errno(badfile); print "error #" : badfile : ":", errno(badfile);
} }
File values can be printed. When this is done, the filename of the File values can be printed. When this is done, the filename of the
opened file is printed inside of quote marks. If the file value had opened file is printed inside of quote marks. If the file value had
been closed, then the null string is printed. If a file value is the been closed, then the null string is printed. If a file value is the
result of a top-level expression, then in addition to the filename, result of a top-level expression, then in addition to the filename,
@@ -75,7 +75,7 @@ Using files
status is also displayed. status is also displayed.
File values can be used inside of 'if' tests. When this is done, File values can be used inside of 'if' tests. When this is done,
an opened file is TRUE, and a closed file is FALSE. As an example an opened file is TRUE, and a closed file is FALSE. As an example
of this, the following loop will print the names of all the currently of this, the following loop will print the names of all the currently
opened non-standard files with their indexes, and then close them: opened non-standard files with their indexes, and then close them:
@@ -89,9 +89,9 @@ Using files
The functions to read from files are 'fgetline' and 'fgetc'. The functions to read from files are 'fgetline' and 'fgetc'.
The 'fgetline' function accepts a file value, and returns the next The 'fgetline' function accepts a file value, and returns the next
input line from a file. The line is returned as a string value, and input line from a file. The line is returned as a string value, and
does not contain the end of line character. Empty lines return the does not contain the end of line character. Empty lines return the
null string. When the end of file is reached, fgetline returns the null string. When the end of file is reached, fgetline returns the
null value. (Note the distinction between a null string and a null null value. (Note the distinction between a null string and a null
value.) If the line contained a numeric value, then the 'eval' value.) If the line contained a numeric value, then the 'eval'
function can then be used to convert the string to a numeric value. function can then be used to convert the string to a numeric value.
Care should be used when doing this, however, since eval will Care should be used when doing this, however, since eval will
@@ -103,7 +103,7 @@ Using files
The 'printf' and 'fprintf' functions are used to print results to a The 'printf' and 'fprintf' functions are used to print results to a
file (which could be stdout or stderr). The 'fprintf' function file (which could be stdout or stderr). The 'fprintf' function
accepts a file variable, whereas the 'printf' function assumes the accepts a file variable, whereas the 'printf' function assumes the
use of 'files(1)' (stdout). They both require a format string, which use of 'files(1)' (stdout). They both require a format string, which
is used in almost the same way as in normal C. The differences come is used in almost the same way as in normal C. The differences come
in the interpretation of values to be printed for various formats. in the interpretation of values to be printed for various formats.
Unlike in C, where an unmatched format type and value will cause Unlike in C, where an unmatched format type and value will cause

View File

@@ -25,7 +25,7 @@ DESCRIPTION
files are already open by the calculator and cannot be closed. files are already open by the calculator and cannot be closed.
When calc starts up, it scans for open file descriptors above When calc starts up, it scans for open file descriptors above
stderr (2) and below MAXFILES (20). Any open descriptor found stderr (2) and below MAXFILES (20). Any open descriptor found
is assumed to be an open file opened in an unknown mode. Calc is assumed to be an open file opened in an unknown mode. Calc
will try to read and write to this file when directed. will try to read and write to this file when directed.

View File

@@ -20,7 +20,7 @@ DESCRIPTION
"a" appending "a" appending
Names of files are subject to ~ expansion just like the C or Names of files are subject to ~ expansion just like the C or
Korn shell. For example, the file name: Korn shell. For example, the file name:
~/lib/gleet ~/lib/gleet

View File

@@ -6,7 +6,7 @@ SYNOPSIS
TYPES TYPES
fs file stream open for writing fs file stream open for writing
s_1, ... string s_1, ... string
return null or error value return null or error value
@@ -22,9 +22,9 @@ EXAMPLE
> fputstr(f, "Alpha", "Beta") > fputstr(f, "Alpha", "Beta")
> freopen(f, "r") > freopen(f, "r")
> fgetstr(f) > fgetstr(f)
"Alpha" "Alpha"
> fgetstr(f) > fgetstr(f)
"Beta" "Beta"
> fgetstr(f) > fgetstr(f)
> >
> fputstr(f, "Gamma") > fputstr(f, "Gamma")

View File

@@ -5,14 +5,14 @@ SYNOPSIS
free(a, b, ...) free(a, b, ...)
TYPES TYPES
a, b, ... any a, b, ... any
return null value return null value
DESCRIPTION DESCRIPTION
Those of the arguments a, b, ... that specify lvalues are assigned Those of the arguments a, b, ... that specify lvalues are assigned
the null value, effectively freeing whatever memory is used to the null value, effectively freeing whatever memory is used to
store their current values. Other arguments are ignored. store their current values. Other arguments are ignored.
free(.) frees the current "old value". free(.) frees the current "old value".

View File

@@ -19,10 +19,10 @@ EXAMPLE
Name Level Type Name Level Type
---- ----- ----- ---- ----- -----
a 1 real = 2 a 1 real = 2
a 0 real = 1 a 0 real = 1
b 0 list b 0 list
c 0 matrix c 0 matrix
Number: 4 Number: 4
> freeglobals() > freeglobals()
@@ -30,10 +30,10 @@ EXAMPLE
Name Level Type Name Level Type
---- ----- ----- ---- ----- -----
a 1 null a 1 null
a 0 null a 0 null
b 0 null b 0 null
c 0 null c 0 null
Number: 4 Number: 4

View File

@@ -15,8 +15,8 @@ EXAMPLE
> a = rcin(10,27) > a = rcin(10,27)
> b = rcin(10,15) > b = rcin(10,15)
> show redc > show redc
0 1 27 0 1 27
1 2 15 1 2 15
> freeredc() > freeredc()
> show redc > show redc
> >

View File

@@ -26,7 +26,7 @@ EXAMPLE
Name Scopes Type Name Scopes Type
---- ------ ----- ---- ------ -----
a 1 0 real = 6 a 1 0 real = 6
Number: 1 Number: 1
> freestatics() > freestatics()

View File

@@ -14,7 +14,7 @@ DESCRIPTION
If x and y are not zero and n is the largest non-negative integer If x and y are not zero and n is the largest non-negative integer
for which y^n is a divisor of x, frem(x,y) returns abs(x/y^n). for which y^n is a divisor of x, frem(x,y) returns abs(x/y^n).
In particular, abs(x) is returned if x is not divisible by In particular, abs(x) is returned if x is not divisible by
y or if abs(y) = 1. If abs(y) > 1, frem(x,y) is the greatest y or if abs(y) = 1. If abs(y) > 1, frem(x,y) is the greatest
divisor of x not divisible by y. divisor of x not divisible by y.
For all x, frem(x,0) is defined to equal abs(x). For all x, frem(x,0) is defined to equal abs(x).

View File

@@ -18,7 +18,7 @@ DESCRIPTION
With three arguments, fs, if open, is closed, and an attempt is made to With three arguments, fs, if open, is closed, and an attempt is made to
open the file with the specified name and assign it to the stream open the file with the specified name and assign it to the stream
fs. A non-null value is returned only if the attempt fails. fs. A non-null value is returned only if the attempt fails.
EXAMPLE EXAMPLE

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