mirror of
https://github.com/lcn2/calc.git
synced 2025-08-16 01:03:29 +03:00
Release calc version 2.11.0t10
This commit is contained in:
6
BUGS
6
BUGS
@@ -75,7 +75,7 @@ not currently a member of the calc-tester mailing list.
|
||||
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
* 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.
|
||||
|
||||
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:
|
||||
|
||||
DEBUG= -g
|
||||
|
@@ -21,7 +21,7 @@ Installing calc in 4 easy steps:
|
||||
|
||||
The CALCBINDINGS is matter of personal taste. As shipped
|
||||
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.
|
||||
|
||||
Set TOPDIR to be the place under which help files, calc,
|
||||
|
34
LIBRARY
34
LIBRARY
@@ -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.
|
||||
|
||||
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
|
||||
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!
|
||||
@@ -60,7 +60,7 @@ External programs may want to compile with:
|
||||
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
|
||||
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
|
||||
@@ -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.
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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.
|
||||
@@ -248,7 +248,7 @@ If the value is too large for ztofull(), ztoulong() or ztolong(), only
|
||||
the low order bits converted.
|
||||
|
||||
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.
|
||||
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
|
||||
@@ -267,7 +267,7 @@ is always positive. If the NUMBER is an integer, the denominator has the
|
||||
value 1.
|
||||
|
||||
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.
|
||||
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
|
||||
@@ -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,
|
||||
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
|
||||
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
|
||||
numbers are:
|
||||
|
||||
@@ -294,7 +294,7 @@ numbers are:
|
||||
q3 = atoq("456.78");
|
||||
|
||||
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
|
||||
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
|
||||
@@ -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.
|
||||
|
||||
There are some transcendental functions in the library, such as sin and cos.
|
||||
These cannot be evaluated exactly as fractions. Therefore, they accept
|
||||
another argument which tells how accurate you want the result. This is an
|
||||
These cannot be evaluated exactly as fractions. Therefore, they accept
|
||||
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
|
||||
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:
|
||||
|
||||
NUMBER *q, *ans, *epsilon;
|
||||
@@ -363,7 +363,7 @@ macros are:
|
||||
The comparisons for NUMBERs are similar to the ones for ZVALUEs. You use the
|
||||
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_.
|
||||
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
|
||||
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
|
||||
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,
|
||||
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
|
||||
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,
|
||||
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)
|
||||
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
|
||||
for equality. The ccmp function returns TRUE if two complex numbers differ.
|
||||
|
||||
There are three predefined values for complex numbers. You should clink
|
||||
them when you want to use them. They are _czero_, _cone_, and _conei_.
|
||||
There are three predefined values for complex numbers. You should clink
|
||||
them when you want to use them. They are _czero_, _cone_, and _conei_.
|
||||
These have the values 0, 1, and i.
|
||||
|
||||
----------------
|
||||
|
70
Makefile
70
Makefile
@@ -17,12 +17,12 @@
|
||||
|
||||
# Determine the type of terminal controls that you want to use
|
||||
#
|
||||
# value meaning
|
||||
# value meaning
|
||||
# -------- -------
|
||||
# (nothing) let the makefile guess at what you need
|
||||
# -DUSE_TERMIOS use struct termios from <termios.h>
|
||||
# -DUSE_TERMIO use struct termios from <termio.h>
|
||||
# -DUSE_SGTTY use struct sgttyb from <sys/ioctl.h>
|
||||
# -DUSE_TERMIO use struct termios from <termio.h>
|
||||
# -DUSE_SGTTY use struct sgttyb from <sys/ioctl.h>
|
||||
#
|
||||
# If in doubt, leave TERMCONTROL empty.
|
||||
#
|
||||
@@ -41,7 +41,7 @@ TERMCONTROL=
|
||||
# for the best.
|
||||
#
|
||||
# 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
|
||||
# sprintf() will work.
|
||||
#
|
||||
@@ -55,12 +55,12 @@ HAVE_VSPRINTF=
|
||||
# Big Endian: Amdahl, 68k, Pyramid, Mips, Sparc, ...
|
||||
# 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
|
||||
# the endian program. If you get syntax errors when you compile,
|
||||
# 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
|
||||
# a make clobber and try LITTLE_ENDIAN. If that fails, ask a wizard
|
||||
# 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
|
||||
# for help.
|
||||
#
|
||||
BYTE_ORDER=
|
||||
@@ -112,7 +112,7 @@ HAVE_FPOS=
|
||||
#HAVE_FPOS= -DHAVE_NO_FPOS
|
||||
|
||||
# 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.
|
||||
#
|
||||
# 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
|
||||
|
||||
# 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
|
||||
# offset instead.
|
||||
#
|
||||
@@ -192,7 +192,7 @@ HAVE_MEMMOVE=
|
||||
# Determine if we have ustat()
|
||||
#
|
||||
# If HAVE_USTAT is empty, this makefile will run the have_memmv program
|
||||
# to determine if ustat() is supported. If HAVE_USTAT is set to
|
||||
# to determine if ustat() is supported. If HAVE_USTAT is set to
|
||||
# -DHAVE_NO_USTAT, then calc will use internal functions to simulate
|
||||
# the memory move function that does correct overlapping memory modes.
|
||||
#
|
||||
@@ -228,7 +228,7 @@ HAVE_GETPGID=
|
||||
# Determine if we have clock_gettime()
|
||||
#
|
||||
# If HAVE_GETTIME is empty, this makefile will run the have_memmv program
|
||||
# to determine if clock_gettime() is supported. If HAVE_GETTIME is set to
|
||||
# to determine if clock_gettime() is supported. If HAVE_GETTIME is set to
|
||||
# -DHAVE_NO_GETTIME, then calc will use internal functions to simulate
|
||||
# the memory move function that does correct overlapping memory modes.
|
||||
#
|
||||
@@ -289,7 +289,7 @@ HAVE_STRDUP=
|
||||
# that are not alligned on a 32 bit boundary.
|
||||
#
|
||||
# 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= let align32.c figure out if alignment is needed
|
||||
@@ -426,8 +426,8 @@ CALCBINDINGS= bindings
|
||||
# and history libs
|
||||
# READLINE_INCLUDE Where the readline include files reside
|
||||
#
|
||||
# NOTE: The GNU-readline code is not shipped with calc. You must have
|
||||
# the appropriate headers and libs installed on your system in
|
||||
# NOTE: The GNU-readline code is not shipped with calc. You must have
|
||||
# the appropriate headers and libs installed on your system in
|
||||
# order to use it.
|
||||
#
|
||||
# If in doubt, set USE_READLINE, READLINE_LIB and READLINE_INCLUDE to nothing.
|
||||
@@ -483,7 +483,7 @@ DEBUG= -O2 -g3
|
||||
# BSD NO_SHARED=
|
||||
# SYSV NO_SHARED= -dn
|
||||
# IRIX NO_SHARED= -non_shared
|
||||
# disable NO_SHARED=
|
||||
# disable 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
|
||||
# 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= LD_NO_SHARED=
|
||||
# others LD_NO_SHARED=
|
||||
# others LD_NO_SHARED=
|
||||
#
|
||||
# If in doubt, use LD_NO_SHARED=
|
||||
#
|
||||
@@ -520,7 +520,7 @@ RANLIB=ranlib
|
||||
#
|
||||
# BSD ${LINT} ${LCFLAGS} ${LINTFLAGS} -u -Ccalc
|
||||
# SYSV ${LINT} ${LCFLAGS} ${LINTFLAGS} -u -o calc
|
||||
# disable :
|
||||
# disable :
|
||||
#
|
||||
# If in doubt and you don't care about lint, use LINTLIB= :
|
||||
#
|
||||
@@ -529,10 +529,10 @@ RANLIB=ranlib
|
||||
LINTLIB= :
|
||||
|
||||
# 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.
|
||||
#
|
||||
# System LINTFLAGS recommendation
|
||||
# System LINTFLAGS recommendation
|
||||
#
|
||||
# SunOs -a -h -v -z
|
||||
#
|
||||
@@ -542,7 +542,7 @@ LINTLIB= :
|
||||
LINTFLAGS=
|
||||
|
||||
# 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
|
||||
# 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
|
||||
# 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
|
||||
#
|
||||
# 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 '/* do we have /usr/include/malloc.h? */' >> have_malloc.h
|
||||
-${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 \
|
||||
echo '#undef HAVE_MALLOC_H /* no */' >> have_malloc.h; \
|
||||
echo '#undef HAVE_MALLOC_H /* no */' >> have_malloc.h; \
|
||||
fi
|
||||
${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 '/* do we have /usr/include/times.h? */' >> have_times.h
|
||||
-${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 \
|
||||
echo '#undef HAVE_TIMES_H /* no */' >> have_times.h; \
|
||||
fi
|
||||
@@ -1365,9 +1365,9 @@ have_stdlib.h: ${MAKE_FILE}
|
||||
${Q}echo '' >> have_stdlib.h
|
||||
${Q}echo '/* do we have /usr/include/stdlib.h? */' >> have_stdlib.h
|
||||
-${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 \
|
||||
echo '#undef HAVE_STDLIB_H /* no */' >> have_stdlib.h; \
|
||||
echo '#undef HAVE_STDLIB_H /* no */' >> have_stdlib.h; \
|
||||
fi
|
||||
${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 '/* do we have /usr/include/unistd.h? */' >> have_unistd.h
|
||||
-${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 \
|
||||
echo '#undef HAVE_UNISTD_H /* no */' >> have_unistd.h; \
|
||||
echo '#undef HAVE_UNISTD_H /* no */' >> have_unistd.h; \
|
||||
fi
|
||||
${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 '/* do we have /usr/include/string.h? */' >> have_string.h
|
||||
-${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 \
|
||||
echo '#undef HAVE_STRING_H /* no */' >> have_string.h; \
|
||||
echo '#undef HAVE_STRING_H /* no */' >> have_string.h; \
|
||||
fi
|
||||
${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 \
|
||||
echo '#define HAVE_URANDOM_H /* yes */' >> have_urandom.h; \
|
||||
else \
|
||||
echo '#undef HAVE_URANDOM_H /* no */' >> have_urandom.h; \
|
||||
echo '#undef HAVE_URANDOM_H /* no */' >> have_urandom.h; \
|
||||
fi
|
||||
${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
|
||||
# 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.
|
||||
#
|
||||
##
|
||||
@@ -2498,7 +2498,7 @@ depend: hsrc
|
||||
-${Q}rm -rf skel
|
||||
${Q}mkdir skel
|
||||
-${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
|
||||
${Q}mkdir skel/custom
|
||||
-${Q}for i in ${H_SRC} ${BUILD_H_SRC} custom.h; do \
|
||||
|
4
README
4
README
@@ -27,7 +27,7 @@ If you run into problems, see the BUGS file.
|
||||
Calc is distributed with an extensive collection of help files that
|
||||
are accessible from the command line. The following assume that you
|
||||
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.
|
||||
|
||||
For list of help topics:
|
||||
@@ -52,7 +52,7 @@ C programmers should note some unexpected differences in the calc syntax:
|
||||
|
||||
> 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
|
||||
|
||||
|
21
addop.c
21
addop.c
@@ -16,8 +16,8 @@
|
||||
#include "symbol.h"
|
||||
|
||||
|
||||
#define FUNCALLOCSIZE 20 /* reallocate size for functions */
|
||||
#define OPCODEALLOCSIZE 100 /* reallocate size for opcodes in functions */
|
||||
#define FUNCALLOCSIZE 20 /* reallocate size for functions */
|
||||
#define OPCODEALLOCSIZE 100 /* reallocate size for opcodes in functions */
|
||||
|
||||
|
||||
static long maxopcodes; /* number of opcodes available */
|
||||
@@ -168,7 +168,7 @@ endfunc(void)
|
||||
if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) ||
|
||||
(!inputisterminal() && conf->lib_debug & LIBDBG_FILE_FUNC)) {
|
||||
printf("%s(", fp->f_name);
|
||||
for (index = 0; index < fp->f_paramcount; index++) {
|
||||
for (index = 0; index < fp->f_paramcount; index++) {
|
||||
if (index)
|
||||
putchar(',');
|
||||
printf("%s", paramname(index));
|
||||
@@ -291,12 +291,12 @@ rmalluserfunc(void)
|
||||
long
|
||||
getuserfunc(char *name)
|
||||
{
|
||||
long index;
|
||||
long index;
|
||||
|
||||
index = findstr(&funcnames, name);
|
||||
if (index >= 0 && functions[index] != NULL)
|
||||
return index;
|
||||
return -1L;
|
||||
index = findstr(&funcnames, name);
|
||||
if (index >= 0 && functions[index] != NULL)
|
||||
return index;
|
||||
return -1L;
|
||||
}
|
||||
|
||||
|
||||
@@ -535,8 +535,7 @@ addop(long op)
|
||||
qfree(q);
|
||||
fp->f_opcodes[count - 2] = OP_ZERO;
|
||||
fp->f_opcodecount--;
|
||||
}
|
||||
else if (qisone(q)) {
|
||||
} else if (qisone(q)) {
|
||||
qfree(q);
|
||||
fp->f_opcodes[count - 2] = OP_ONE;
|
||||
fp->f_opcodecount--;
|
||||
@@ -639,5 +638,3 @@ addoplabel(long op, LABEL *label)
|
||||
addop(op);
|
||||
uselabel(label);
|
||||
}
|
||||
|
||||
/* END CODE */
|
||||
|
10
align32.c
10
align32.c
@@ -12,11 +12,11 @@
|
||||
* copyright this code.
|
||||
*
|
||||
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER-
|
||||
* CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT
|
||||
* NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER-
|
||||
* CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT
|
||||
* NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
@@ -70,7 +70,7 @@ main(void)
|
||||
* buserr - catch an alignment error
|
||||
*
|
||||
* given:
|
||||
* arg to keep ANSI C happy
|
||||
* arg to keep ANSI C happy
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
static void
|
||||
|
19
assocfunc.c
19
assocfunc.c
@@ -14,10 +14,10 @@
|
||||
#include "value.h"
|
||||
|
||||
|
||||
#define MINHASHSIZE 31 /* minimum size of hash tables */
|
||||
#define GROWHASHSIZE 50 /* approximate growth for hash tables */
|
||||
#define CHAINLENGTH 10 /* desired number of elements on a hash chain */
|
||||
#define ELEMSIZE(n) (sizeof(ASSOCELEM) + (sizeof(VALUE) * ((n) - 1)))
|
||||
#define MINHASHSIZE 31 /* minimum size of hash tables */
|
||||
#define GROWHASHSIZE 50 /* approximate growth for hash tables */
|
||||
#define CHAINLENGTH 10 /* desired number of elements on a hash chain */
|
||||
#define ELEMSIZE(n) (sizeof(ASSOCELEM) + (sizeof(VALUE) * ((n) - 1)))
|
||||
|
||||
|
||||
static ASSOCELEM *elemindex(ASSOC *ap, long index);
|
||||
@@ -245,8 +245,7 @@ assoccmp(ASSOC *ap1, ASSOC *ap2)
|
||||
hash = ep1->e_hash;
|
||||
dim = ep1->e_dim;
|
||||
for (ep2 = ap2->a_table[hash % size2]; ;
|
||||
ep2 = ep2->e_next)
|
||||
{
|
||||
ep2 = ep2->e_next) {
|
||||
if (ep2 == NULL)
|
||||
return TRUE;
|
||||
if (ep2->e_hash != hash)
|
||||
@@ -283,8 +282,7 @@ assoccopy(ASSOC *oldap)
|
||||
|
||||
for (oldhi = 0; oldhi < oldap->a_size; oldhi++) {
|
||||
for (oldep = oldap->a_table[oldhi]; oldep;
|
||||
oldep = oldep->e_next)
|
||||
{
|
||||
oldep = oldep->e_next) {
|
||||
ep = (ASSOCELEM *) malloc(ELEMSIZE(oldep->e_dim));
|
||||
if (ep == NULL) {
|
||||
math_error("Cannot allocate association element");
|
||||
@@ -449,8 +447,7 @@ assocprint(ASSOC *ap, long max_print)
|
||||
((ap->a_count == 1) ? "" : "s"));
|
||||
|
||||
for (index = 0; ((index < max_print) && (index < ap->a_count));
|
||||
index++)
|
||||
{
|
||||
index++) {
|
||||
ep = elemindex(ap, index);
|
||||
if (ep == NULL)
|
||||
continue;
|
||||
@@ -491,5 +488,3 @@ compareindices(VALUE *v1, VALUE *v2, long dim)
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* END CODE */
|
||||
|
16
blkcpy.c
16
blkcpy.c
@@ -547,7 +547,7 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
|
||||
int
|
||||
copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
|
||||
{
|
||||
FILEIO *fiop;
|
||||
FILEIO *fiop;
|
||||
FILE *fp;
|
||||
unsigned int numw;
|
||||
|
||||
@@ -563,7 +563,7 @@ copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
|
||||
return E_COPYF1;
|
||||
fp = fiop->fp;
|
||||
if (id == 1 || id == 2) {
|
||||
numw = idfputstr(id, (char *)sblk->data + ssi); /* XXX */
|
||||
numw = idfputstr(id, (char *)sblk->data + ssi); /* XXX */
|
||||
return 0;
|
||||
}
|
||||
if (dsi >= 0) {
|
||||
@@ -584,7 +584,7 @@ copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
|
||||
int
|
||||
copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
|
||||
{
|
||||
FILEIO *fiop;
|
||||
FILEIO *fiop;
|
||||
FILE *fp;
|
||||
unsigned int numw;
|
||||
ZVALUE fsize;
|
||||
@@ -672,7 +672,7 @@ copystr2file(STRING *str, long ssi, long num, FILEID id, long dsi)
|
||||
return E_COPYF1;
|
||||
fp = fiop->fp;
|
||||
if (id == 1 || id == 2) {
|
||||
numw = idfputstr(id, str->s_str + ssi); /* XXX */
|
||||
numw = idfputstr(id, str->s_str + ssi); /* XXX */
|
||||
return 0;
|
||||
}
|
||||
if (dsi >= 0) {
|
||||
@@ -830,7 +830,7 @@ int
|
||||
copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi)
|
||||
{
|
||||
long len;
|
||||
char *c, *c1;
|
||||
char *c, *c1;
|
||||
|
||||
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.
|
||||
*
|
||||
* given:
|
||||
* s1 destination
|
||||
* s2 source
|
||||
* s1 destination
|
||||
* s2 source
|
||||
* n octet count
|
||||
*
|
||||
* returns:
|
||||
@@ -959,7 +959,7 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
|
||||
long newsize;
|
||||
USB8 *newdata;
|
||||
#if CALC_BYTE_ORDER == BIG_ENDIAN
|
||||
ZVALUE *swnum; /* byte swapped numerator */
|
||||
ZVALUE *swnum; /* byte swapped numerator */
|
||||
#endif
|
||||
|
||||
if (ssi > snum->num.len)
|
||||
|
2
blkcpy.h
2
blkcpy.h
@@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
#if !defined(__BLKCPY_H__)
|
||||
#define __BLKCPY_H__
|
||||
#define __BLKCPY_H__
|
||||
|
||||
/*
|
||||
* the main copy gateway function
|
||||
|
27
block.c
27
block.c
@@ -23,7 +23,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
@@ -141,7 +141,7 @@ blk_free(BLOCK *blk)
|
||||
/*
|
||||
* 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,
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
* how much storage is malloced for current or future use).
|
||||
* It can change the memory footprint (in terms of
|
||||
* how much storage is malloced for current or future use).
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
@@ -329,7 +329,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
|
||||
/*
|
||||
* 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
|
||||
* down to an absolute minimum.
|
||||
*
|
||||
@@ -479,7 +479,7 @@ blk_print(BLOCK *blk)
|
||||
BOOL havetail;
|
||||
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",
|
||||
(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",
|
||||
(int)blk->blkchunk, (int)blk->maxsize, (int)blk->datalen);
|
||||
printf("NULL");
|
||||
}
|
||||
else
|
||||
} else {
|
||||
blk_print(blk);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -556,8 +556,7 @@ reallocnblock(int id, int len, int chunk)
|
||||
math_error("Allocation failed");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
}
|
||||
else if (newsize != oldsize) {
|
||||
} else if (newsize != oldsize) {
|
||||
newdata = realloc(blk->data, newsize);
|
||||
if (newdata == NULL) {
|
||||
math_error("Reallocation failed");
|
||||
@@ -719,7 +718,7 @@ findnblock(int id)
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
BLOCK *
|
||||
@@ -730,7 +729,7 @@ copyrealloc(BLOCK *blk, int newlen, int newchunk)
|
||||
|
||||
oldlen = blk->datalen;
|
||||
|
||||
if (newlen < 0) /* retain length */
|
||||
if (newlen < 0) /* retain length */
|
||||
newlen = oldlen;
|
||||
|
||||
if (newchunk < 0) /* retain chunksize */
|
||||
|
8
block.h
8
block.h
@@ -23,7 +23,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
|
||||
#if !defined(__BLOCK_H__)
|
||||
#define __BLOCK_H__
|
||||
#define __BLOCK_H__
|
||||
|
||||
|
||||
/*
|
||||
@@ -139,8 +139,8 @@
|
||||
* style of output = {
|
||||
* "line", lines in blkbase with no spaces between octets
|
||||
* "string", as one long line with no spaces between octets
|
||||
* "od_style", position, spaces between octets
|
||||
* "hd_style"} position, spaces between octets, chars on end
|
||||
* "od_style", position, spaces between octets
|
||||
* "hd_style"} position, spaces between octets, chars on end
|
||||
*/
|
||||
struct block {
|
||||
LEN blkchunk; /* allocation chunk size */
|
||||
|
@@ -28,9 +28,9 @@
|
||||
* swap_b8_in_HALFs - swap 8 and if needed, 16 bits in an array of HALFs
|
||||
*
|
||||
* 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
|
||||
* src - pointer to a HALF array to swap
|
||||
* src - pointer to a HALF array to swap
|
||||
* len - length of the src HALF array
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* 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
|
||||
* src - pointer to a HALF array to swap
|
||||
* src - pointer to a HALF array to swap
|
||||
* len - length of the src HALF array
|
||||
*
|
||||
* returns:
|
||||
|
2
calc.c
2
calc.c
@@ -394,7 +394,7 @@ main(int argc, char **argv)
|
||||
printf("DEBUG: run_state from %s to %s\n",
|
||||
run_state_name(run_state),
|
||||
run_state_name(RUN_EXIT_WITH_ERROR));
|
||||
run_state = RUN_EXIT_WITH_ERROR;
|
||||
run_state = RUN_EXIT_WITH_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
62
calc.h
62
calc.h
@@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
#if !defined(__CALC_H__)
|
||||
#define __CALC_H__
|
||||
#define __CALC_H__
|
||||
|
||||
#include <setjmp.h>
|
||||
|
||||
@@ -20,42 +20,42 @@
|
||||
/*
|
||||
* Configuration definitions
|
||||
*/
|
||||
#define CALCPATH "CALCPATH" /* environment variable for files */
|
||||
#define CALCRC "CALCRC" /* environment variable for startup */
|
||||
#define CALCBINDINGS "CALCBINDINGS" /* environment variable for hist bindings */
|
||||
#define HOME "HOME" /* environment variable for home dir */
|
||||
#define PAGER "PAGER" /* environment variable for help */
|
||||
#define SHELL "SHELL" /* environment variable for shell */
|
||||
#define DEFAULTCALCHELP "help" /* help file that -h prints */
|
||||
#define CALCPATH "CALCPATH" /* environment variable for files */
|
||||
#define CALCRC "CALCRC" /* environment variable for startup */
|
||||
#define CALCBINDINGS "CALCBINDINGS" /* environment variable for hist bindings */
|
||||
#define HOME "HOME" /* environment variable for home dir */
|
||||
#define PAGER "PAGER" /* environment variable for help */
|
||||
#define SHELL "SHELL" /* environment variable for shell */
|
||||
#define DEFAULTCALCHELP "help" /* help file that -h prints */
|
||||
#define DEFAULTSHELL "sh" /* default shell to use */
|
||||
#define CALCEXT ".cal" /* extension for files read in */
|
||||
#define MAX_CALCRC 1024 /* maximum length of $CALCRC */
|
||||
#define HOMECHAR '~' /* char which indicates home directory */
|
||||
#define CALCEXT ".cal" /* extension for files read in */
|
||||
#define MAX_CALCRC 1024 /* maximum length of $CALCRC */
|
||||
#define HOMECHAR '~' /* char which indicates home directory */
|
||||
#define DOTCHAR '.' /* char which indicates current directory */
|
||||
#define PATHCHAR '/' /* char which separates path components */
|
||||
#define LISTCHAR ':' /* char which separates paths in a list */
|
||||
#define MAXCMD 16384 /* maximum length of command invocation */
|
||||
#define MAXERROR 512 /* maximum length of error message string */
|
||||
#define PATHCHAR '/' /* char which separates path components */
|
||||
#define LISTCHAR ':' /* char which separates paths in a list */
|
||||
#define MAXCMD 16384 /* maximum length of command invocation */
|
||||
#define MAXERROR 512 /* maximum length of error message string */
|
||||
|
||||
#define SYMBOLSIZE 256 /* maximum symbol name size */
|
||||
#define MAXINDICES 20 /* maximum number of indices for objects */
|
||||
#define MAXLABELS 100 /* maximum number of user labels in function */
|
||||
#define MAXSTRING 1024 /* maximum size of string constant */
|
||||
#define MAXSTACK 1000 /* maximum depth of evaluation stack */
|
||||
#define MAXFILES 20 /* maximum number of opened files */
|
||||
#define SYMBOLSIZE 256 /* maximum symbol name size */
|
||||
#define MAXINDICES 20 /* maximum number of indices for objects */
|
||||
#define MAXLABELS 100 /* maximum number of user labels in function */
|
||||
#define MAXSTRING 1024 /* maximum size of string constant */
|
||||
#define MAXSTACK 1000 /* maximum depth of evaluation stack */
|
||||
#define MAXFILES 20 /* maximum number of opened files */
|
||||
#define PROMPT1 "> " /* default normal prompt*/
|
||||
#define PROMPT2 ">> " /* default prompt inside multi-line input */
|
||||
|
||||
|
||||
#define TRACE_NORMAL 0x00 /* normal trace flags */
|
||||
#define TRACE_OPCODES 0x01 /* trace every opcode */
|
||||
#define TRACE_NODEBUG 0x02 /* suppress debugging opcodes */
|
||||
#define TRACE_NORMAL 0x00 /* normal trace flags */
|
||||
#define TRACE_OPCODES 0x01 /* trace every opcode */
|
||||
#define TRACE_NODEBUG 0x02 /* suppress debugging opcodes */
|
||||
#define TRACE_LINKS 0x04 /* display links for real and complex numbers */
|
||||
#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_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_MATH 3 /* abort on any math operation */
|
||||
#define ABORT_NOW 4 /* abort right away */
|
||||
@@ -65,10 +65,10 @@
|
||||
/*
|
||||
* File ids corresponding to standard in, out, error, and when not in use.
|
||||
*/
|
||||
#define FILEID_STDIN ((FILEID) 0)
|
||||
#define FILEID_STDOUT ((FILEID) 1)
|
||||
#define FILEID_STDERR ((FILEID) 2)
|
||||
#define FILEID_NONE ((FILEID) -1)
|
||||
#define FILEID_STDIN ((FILEID) 0)
|
||||
#define FILEID_STDOUT ((FILEID) 1)
|
||||
#define FILEID_STDERR ((FILEID) 2)
|
||||
#define FILEID_NONE ((FILEID) -1)
|
||||
|
||||
/*
|
||||
* 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 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 */
|
||||
|
||||
/*
|
||||
|
4
calc.man
4
calc.man
@@ -340,7 +340,7 @@ Normally on startup,
|
||||
attempts to execute a collection of
|
||||
library scripts.
|
||||
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.
|
||||
No error conditions are produced if these startup
|
||||
library scripts are not found.
|
||||
@@ -589,7 +589,7 @@ Ernest also supplied the original text for many of the help files.
|
||||
.sp
|
||||
Portions of this program are derived from an earlier set of
|
||||
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.
|
||||
.sp
|
||||
Most of this source and binary has one of the following copyrights:
|
||||
|
@@ -6,12 +6,12 @@ BEGIN {
|
||||
printf(" * names of calc error values\n");
|
||||
printf(" */\n");
|
||||
printf("CONST char *error_table[E__COUNT+2] = {\n");
|
||||
printf(" \"No error\",\n");
|
||||
printf(" \"No error\",\n");
|
||||
}
|
||||
{
|
||||
print $0;
|
||||
}
|
||||
END {
|
||||
printf(" NULL\n");
|
||||
printf(" NULL\n");
|
||||
printf("};\n");
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
# 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
|
||||
# 3 lines of context around unexpected output.
|
||||
#
|
||||
|
4
cmath.h
4
cmath.h
@@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
#if !defined(__CMATH_H__)
|
||||
#define __CMATH_H__
|
||||
#define __CMATH_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 cisrunit(c) (cisreal(c) && qisunit((c)->real))
|
||||
#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 cisint(c) (qisint((c)->real) && qisint((c)->imag))
|
||||
#define ciseven(c) (qiseven((c)->real) && qiseven((c)->imag))
|
||||
|
22
codegen.c
22
codegen.c
@@ -180,8 +180,8 @@ getcommands(BOOL toplevel)
|
||||
/*
|
||||
* Evaluate a line of statements.
|
||||
* This is done by treating the current line as a function body,
|
||||
* compiling it, and then executing it. Returns TRUE if the line
|
||||
* successfully compiled and executed. The last expression result
|
||||
* compiling it, and then executing it. Returns TRUE if the line
|
||||
* successfully compiled and executed. The last expression result
|
||||
* is saved in the f_savedvalue element of the current function.
|
||||
* The nestflag variable should be FALSE for the outermost evaluation
|
||||
* 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.
|
||||
* 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
|
||||
* is an OBJ statement, otherwise this is part of a declaration which will
|
||||
* define new symbols with the specified type.
|
||||
@@ -1305,7 +1305,7 @@ getcondition(void)
|
||||
|
||||
/*
|
||||
* 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.
|
||||
* Returns flags describing the type of the last assignment or expression found.
|
||||
* exprlist = assignment [ ',' assignment ] ...
|
||||
@@ -1359,8 +1359,8 @@ getopassignment(void)
|
||||
case T_MODEQUALS: op = OP_MOD; break;
|
||||
case T_ANDEQUALS: op = OP_AND; break;
|
||||
case T_OREQUALS: op = OP_OR; break;
|
||||
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
|
||||
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
|
||||
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
|
||||
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
|
||||
case T_POWEREQUALS: op = OP_POWER; break;
|
||||
case T_HASHEQUALS: op = OP_HASHOP; break;
|
||||
case T_TILDEEQUALS: op = OP_XOR; break;
|
||||
@@ -1400,8 +1400,8 @@ getopassignment(void)
|
||||
case T_MODEQUALS: op = OP_MOD; break;
|
||||
case T_ANDEQUALS: op = OP_AND; break;
|
||||
case T_OREQUALS: op = OP_OR; break;
|
||||
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
|
||||
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
|
||||
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
|
||||
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
|
||||
case T_POWEREQUALS: op = OP_POWER; break;
|
||||
case T_HASHEQUALS: op = OP_HASHOP; break;
|
||||
case T_TILDEEQUALS: op = OP_XOR; break;
|
||||
@@ -1746,7 +1746,7 @@ getshiftexpr(void)
|
||||
case T_NOT: op = OP_NOT; break;
|
||||
case T_DIV: op = OP_INVERT; 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;
|
||||
}
|
||||
if (op) {
|
||||
@@ -1759,7 +1759,7 @@ getshiftexpr(void)
|
||||
switch (gettoken()) {
|
||||
case T_POWER: op = OP_POWER; break;
|
||||
case T_LEFTSHIFT: op = OP_LEFTSHIFT; break;
|
||||
case T_RIGHTSHIFT: op = OP_RIGHTSHIFT; break;
|
||||
case T_RIGHTSHIFT: op = OP_RIGHTSHIFT; break;
|
||||
default:
|
||||
rescantoken();
|
||||
return type;
|
||||
@@ -2187,7 +2187,7 @@ getmatargs(void)
|
||||
/*
|
||||
* Normal indexing with the indexes separated by commas.
|
||||
* 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
|
||||
* it will call writeindexop to change the flag in the opcode.
|
||||
*/
|
||||
|
45
comfunc.c
45
comfunc.c
@@ -138,38 +138,6 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
||||
|
||||
up1 = up2 = 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;
|
||||
es = qsquare(epsilon);
|
||||
aes = qqdiv(c->real, es);
|
||||
@@ -255,8 +223,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
||||
up2 = -1;
|
||||
zfree(tmp1);
|
||||
zfree(aa);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
s1 = zsqrt(tmp3, &cc, 0);
|
||||
zfree(tmp3);
|
||||
zadd(cc, a, &tmp1);
|
||||
@@ -333,9 +300,9 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
||||
zfree(mul2);
|
||||
mul2 = tmp2;
|
||||
}
|
||||
if (ziszero(mul1))
|
||||
if (ziszero(mul1)) {
|
||||
u = qlink(&_qzero_);
|
||||
else {
|
||||
} else {
|
||||
mul1.sign = sign ^ epsilon->num.sign;
|
||||
u = qalloc();
|
||||
zreduce(mul1, epsilon->den, &tmp2, &u->den);
|
||||
@@ -343,9 +310,9 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
||||
zfree(tmp2);
|
||||
}
|
||||
zfree(mul1);
|
||||
if (ziszero(mul2))
|
||||
if (ziszero(mul2)) {
|
||||
v = qlink(&_qzero_);
|
||||
else {
|
||||
} else {
|
||||
mul2.sign = imsign ^ sign ^ epsilon->num.sign;
|
||||
v = qalloc();
|
||||
zreduce(mul2, epsilon->den, &tmp2, &v->den);
|
||||
@@ -1147,5 +1114,3 @@ cprintfr(COMPLEX *c)
|
||||
zprintval(i->den, 0L, 0L);
|
||||
}
|
||||
}
|
||||
|
||||
/* END CODE */
|
||||
|
@@ -69,7 +69,7 @@ csub(COMPLEX *c1, COMPLEX *c2)
|
||||
/*
|
||||
* Multiply two complex numbers.
|
||||
* 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)
|
||||
* q2 = a * c
|
||||
* q3 = b * d
|
||||
|
12
config.c
12
config.c
@@ -48,7 +48,7 @@ NAMETYPE configs[] = {
|
||||
{"maxerr", CONFIG_MAXSCAN}, /* old name for maxscan */
|
||||
{"prompt", CONFIG_PROMPT},
|
||||
{"more", CONFIG_MORE},
|
||||
{"blkmaxprint", CONFIG_BLKMAXPRINT},
|
||||
{"blkmaxprint", CONFIG_BLKMAXPRINT},
|
||||
{"blkverbose", CONFIG_BLKVERBOSE},
|
||||
{"blkbase", CONFIG_BLKBASE},
|
||||
{"blkfmt", CONFIG_BLKFMT},
|
||||
@@ -96,7 +96,7 @@ CONFIG oldstd = { /* backward compatible standard configuration */
|
||||
BLK_FMT_HD_STYLE, /* block output format */
|
||||
0, /* internal calc debug level */
|
||||
3, /* calc library debug level */
|
||||
0, /* user defined debug level */
|
||||
0, /* user defined debug level */
|
||||
TRUE /* print Quit or abort executed messages */
|
||||
};
|
||||
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 */
|
||||
0, /* internal calc debug level */
|
||||
3, /* calc library debug level */
|
||||
0, /* user defined debug level */
|
||||
0, /* user defined debug level */
|
||||
TRUE /* print Quit or abort executed messages */
|
||||
};
|
||||
CONFIG *conf = NULL; /* loaded in at startup - current configuration */
|
||||
@@ -148,7 +148,7 @@ static NAMETYPE modes[] = {
|
||||
{"int", MODE_INT},
|
||||
{"real", MODE_REAL},
|
||||
{"exp", MODE_EXP},
|
||||
{"hexadecimal", MODE_HEX},
|
||||
{"hexadecimal", MODE_HEX},
|
||||
{"hex", MODE_HEX},
|
||||
{"octal", MODE_OCTAL},
|
||||
{"oct", MODE_OCTAL},
|
||||
@@ -184,7 +184,7 @@ static NAMETYPE truth[] = {
|
||||
* Possible block base output modes
|
||||
*/
|
||||
static NAMETYPE blk_base[] = {
|
||||
{"hexadecimal", BLK_BASE_HEX},
|
||||
{"hexadecimal", BLK_BASE_HEX},
|
||||
{"hex", BLK_BASE_HEX},
|
||||
{"octal", BLK_BASE_OCT},
|
||||
{"oct", BLK_BASE_OCT},
|
||||
@@ -361,7 +361,7 @@ setconfig(int type, VALUE *vp)
|
||||
|
||||
switch (type) {
|
||||
case CONFIG_ALL:
|
||||
newconf = NULL; /* firewall */
|
||||
newconf = NULL; /* firewall */
|
||||
if (vp->v_type == V_STR) {
|
||||
if (strcmp(vp->v_str->s_str, "oldstd") == 0) {
|
||||
newconf = &oldstd;
|
||||
|
28
config.h
28
config.h
@@ -20,16 +20,16 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
*
|
||||
* chongo <was here> /\../\
|
||||
*/
|
||||
@@ -52,11 +52,11 @@
|
||||
#define CONFIG_EPSILON 3
|
||||
#define CONFIG_EPSILONPREC 3 /* not a real type -- tied to CONFIG_EPSILON */
|
||||
#define CONFIG_TRACE 4
|
||||
#define CONFIG_MAXPRINT 5
|
||||
#define CONFIG_MUL2 6
|
||||
#define CONFIG_SQ2 7
|
||||
#define CONFIG_POW2 8
|
||||
#define CONFIG_REDC2 9
|
||||
#define CONFIG_MAXPRINT 5
|
||||
#define CONFIG_MUL2 6
|
||||
#define CONFIG_SQ2 7
|
||||
#define CONFIG_POW2 8
|
||||
#define CONFIG_REDC2 9
|
||||
#define CONFIG_TILDE 10
|
||||
#define CONFIG_TAB 11
|
||||
#define CONFIG_QUOMOD 12
|
||||
@@ -66,10 +66,10 @@
|
||||
#define CONFIG_APPR 16
|
||||
#define CONFIG_CFAPPR 17
|
||||
#define CONFIG_CFSIM 18
|
||||
#define CONFIG_OUTROUND 19
|
||||
#define CONFIG_OUTROUND 19
|
||||
#define CONFIG_ROUND 20
|
||||
#define CONFIG_LEADZERO 21
|
||||
#define CONFIG_FULLZERO 22
|
||||
#define CONFIG_LEADZERO 21
|
||||
#define CONFIG_FULLZERO 22
|
||||
#define CONFIG_MAXSCAN 23
|
||||
#define CONFIG_PROMPT 24
|
||||
#define CONFIG_MORE 25
|
||||
@@ -87,7 +87,7 @@
|
||||
* config default symbols
|
||||
*/
|
||||
#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 NEW_EPSILON_DEFAULT "1e-10" /* newstd EPSILON_DEFAULT */
|
||||
#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 */
|
||||
BOOL verbose_quit; /* TRUE => print Quit or abort executed msg */
|
||||
};
|
||||
typedef struct config CONFIG;
|
||||
typedef struct config CONFIG;
|
||||
|
||||
|
||||
/*
|
||||
|
4
custom.c
4
custom.c
@@ -20,7 +20,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
@@ -117,7 +117,7 @@ showcustom(void)
|
||||
{
|
||||
#if defined(CUSTOM)
|
||||
|
||||
CONST struct custom *p; /* current function */
|
||||
CONST struct custom *p; /* current function */
|
||||
|
||||
/*
|
||||
* disable custom functions unless -C was given
|
||||
|
8
custom.h
8
custom.h
@@ -20,16 +20,16 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
*
|
||||
* chongo <was here> /\../\
|
||||
*/
|
||||
|
@@ -6,7 +6,7 @@ Step 0: Determine if is should it be done?
|
||||
multi-precision calculations in a C-like environment. You should
|
||||
consider implementing algorithms in the calc language as a first
|
||||
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.
|
||||
|
||||
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
|
||||
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
|
||||
string arg that was given to the custom()
|
||||
builtin. This is the equivalent of argv[0] for
|
||||
@@ -215,11 +215,11 @@ Step 5: Write your custom function
|
||||
|
||||
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[1] points to b
|
||||
vals[2] points to c
|
||||
vals[0] points to a
|
||||
vals[1] points to b
|
||||
vals[2] points to c
|
||||
|
||||
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 v_type VALUE element determines which union element is
|
||||
being used. Assume that we have:
|
||||
being used. Assume that we have:
|
||||
|
||||
VALUE *vp;
|
||||
|
||||
@@ -427,12 +427,12 @@ Step 6: Register the function in the custom interface table
|
||||
level Makefile, one does not have unsatisfied symbols.
|
||||
|
||||
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
|
||||
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
|
||||
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:
|
||||
|
||||
custom("curds") /* call blocked at high level interface */
|
||||
|
@@ -22,7 +22,7 @@
|
||||
# PERFORMANCE OF THIS SOFTWARE.
|
||||
#
|
||||
# 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,
|
||||
#
|
||||
@@ -146,7 +146,7 @@ DEBUG= -O
|
||||
# BSD NO_SHARED=
|
||||
# SYSV NO_SHARED= -dn
|
||||
# IRIX NO_SHARED= -non_shared
|
||||
# disable NO_SHARED=
|
||||
# disable 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.
|
||||
#
|
||||
# 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
|
||||
# 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
|
||||
# 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
|
||||
#
|
||||
# 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
|
||||
# sub-directory called calc/lib.
|
||||
#
|
||||
# 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/custom
|
||||
-${Q}for i in ${C_SRC}; do \
|
||||
${SED} -n '/^#[ ]*include[ ]*"/p' \
|
||||
${SED} -n '/^#[ ]*include[ ]*"/p' \
|
||||
"$$i" > "skel/custom/$$i"; \
|
||||
done
|
||||
-${Q}for i in /dev/null ${H_SRC}; do \
|
||||
|
10
custom/argv
10
custom/argv
@@ -23,11 +23,11 @@ DESCRIPTION
|
||||
EXAMPLE
|
||||
> foo=5^713; bar=17; baz=list(2,3,4);
|
||||
> custom("argv", foo, bar, baz, 3+4.5i, pi())
|
||||
arg[0] rational_value size=1 sizeof=272
|
||||
arg[1] rational_value size=1 sizeof=68
|
||||
arg[2] list size=3 sizeof=256
|
||||
arg[3] complex_value size=1 sizeof=140
|
||||
arg[4] rational_value size=1 sizeof=84
|
||||
arg[0] rational_value size=1 sizeof=272
|
||||
arg[1] rational_value size=1 sizeof=68
|
||||
arg[2] list size=3 sizeof=256
|
||||
arg[3] complex_value size=1 sizeof=140
|
||||
arg[4] rational_value size=1 sizeof=84
|
||||
5
|
||||
|
||||
LIMITS
|
||||
|
@@ -11,12 +11,12 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
*
|
||||
* chongo <was here> /\../\
|
||||
*/
|
||||
@@ -98,13 +98,13 @@ c_argv(char *name, int count, VALUE **vals)
|
||||
case V_FILE: /* opened file id */
|
||||
type = "file";
|
||||
break;
|
||||
case V_RAND: /* address of additive 55 random state */
|
||||
case V_RAND: /* address of additive 55 random state */
|
||||
type = "rand_state";
|
||||
break;
|
||||
case V_RANDOM: /* address of Blum random state */
|
||||
case V_RANDOM: /* address of Blum random state */
|
||||
type = "random_state";
|
||||
break;
|
||||
case V_CONFIG: /* configuration state */
|
||||
case V_CONFIG: /* configuration state */
|
||||
type = "config_state";
|
||||
break;
|
||||
case V_HASH: /* hash state */
|
||||
@@ -115,7 +115,7 @@ c_argv(char *name, int count, VALUE **vals)
|
||||
break;
|
||||
#if 0
|
||||
/* XXX - V_OCTET is subject to change */
|
||||
case V_OCTET: /* octet (unsigned char) */
|
||||
case V_OCTET: /* octet (unsigned char) */
|
||||
type = "octet";
|
||||
break;
|
||||
#endif
|
||||
|
@@ -11,12 +11,12 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
*
|
||||
* chongo <was here> /\../\
|
||||
*/
|
||||
|
@@ -11,12 +11,12 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
*
|
||||
* chongo <was here> /\../\
|
||||
*/
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* Permission to use, copy, modify, and distribute this software and
|
||||
* 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)
|
||||
@@ -20,7 +20,7 @@
|
||||
*
|
||||
* given:
|
||||
* count = 1;
|
||||
* vals[0] real number;
|
||||
* vals[0] real number;
|
||||
*
|
||||
* returns:
|
||||
* null
|
||||
@@ -29,7 +29,7 @@
|
||||
VALUE
|
||||
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 */
|
||||
long half_cnt; /* number of HALFs in the numerator */
|
||||
USB8 *h; /* octet pointer */
|
||||
|
@@ -11,12 +11,12 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
*
|
||||
* chongo <was here> /\../\
|
||||
*/
|
||||
|
@@ -20,12 +20,12 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* 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,
|
||||
*
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
* Landon Curt Noll
|
||||
* http://reality.sgi.com/chongo/
|
||||
*
|
||||
* chongo <was here> /\../\
|
||||
*/
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
/*
|
||||
* NOTE: See the file CUSTOM for instructions on how to add
|
||||
* custom functions.
|
||||
* custom functions.
|
||||
*/
|
||||
|
||||
|
||||
|
@@ -10,7 +10,7 @@ TYPES
|
||||
return null
|
||||
|
||||
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.
|
||||
|
||||
EXAMPLE
|
||||
|
@@ -11,7 +11,7 @@ TYPES
|
||||
|
||||
DESCRIPTION
|
||||
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
|
||||
and the byte order of the system. See:
|
||||
@@ -26,15 +26,15 @@ DESCRIPTION
|
||||
|
||||
EXAMPLE
|
||||
> custom("pzasusb8", 0x01020304050607080910111213141516);
|
||||
0: 13141516
|
||||
1: 09101112
|
||||
2: 05060708
|
||||
3: 01020304
|
||||
0: 13141516
|
||||
1: 09101112
|
||||
2: 05060708
|
||||
3: 01020304
|
||||
|
||||
> custom("pzasusb8", 10^25)
|
||||
0: 4a000000
|
||||
1: 16140148
|
||||
2: 00084595
|
||||
0: 4a000000
|
||||
1: 16140148
|
||||
2: 00084595
|
||||
|
||||
> printf("%x\n", 10^25);
|
||||
0x84595161401484a000000
|
||||
|
28
file.c
28
file.c
@@ -19,7 +19,7 @@
|
||||
#include "file.h"
|
||||
#include "calcerr.h"
|
||||
|
||||
#define READSIZE 1024 /* buffer size for reading */
|
||||
#define READSIZE 1024 /* buffer size for reading */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
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"},
|
||||
{FILEID_STDOUT, NULL, (dev_t)0, (ino_t)0,
|
||||
"(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 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
|
||||
* closed files is allowed.
|
||||
*/
|
||||
@@ -536,7 +536,7 @@ flushall(void)
|
||||
*
|
||||
* bit 0: at newline
|
||||
* 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 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
|
||||
* values. Mismatches do not cause errors, instead something reasonable is
|
||||
* 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);
|
||||
if (fiop == NULL) {
|
||||
/* file not open */
|
||||
/* file not open */
|
||||
return -1;
|
||||
}
|
||||
fp = fiop->fp;
|
||||
@@ -1467,7 +1467,7 @@ setloc(FILEID id, ZVALUE zpos)
|
||||
*/
|
||||
fiop = findid(id, 0);
|
||||
if (fiop == NULL) {
|
||||
/* file not open */
|
||||
/* file not open */
|
||||
return -1;
|
||||
}
|
||||
fp = fiop->fp;
|
||||
@@ -1635,7 +1635,7 @@ getsize(FILEID id, ZVALUE *res)
|
||||
*/
|
||||
fiop = findid(id, 0);
|
||||
if (fiop == NULL) {
|
||||
/* file not open */
|
||||
/* file not open */
|
||||
return 1;
|
||||
}
|
||||
fp = fiop->fp;
|
||||
@@ -1671,7 +1671,7 @@ get_device(FILEID id, ZVALUE *dev)
|
||||
*/
|
||||
fiop = findid(id, 0);
|
||||
if (fiop == NULL) {
|
||||
/* file not open */
|
||||
/* file not open */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1704,7 +1704,7 @@ get_inode(FILEID id, ZVALUE *inode)
|
||||
*/
|
||||
fiop = findid(id, 0);
|
||||
if (fiop == NULL) {
|
||||
/* file not open */
|
||||
/* file not open */
|
||||
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.
|
||||
* For example, -23.45..67. is interpreted as -23.4567
|
||||
* 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
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
int
|
||||
@@ -2513,7 +2513,7 @@ fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res)
|
||||
* zero if string found, position stored at res
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
int
|
||||
|
4
file.h
4
file.h
@@ -42,7 +42,7 @@ typedef struct {
|
||||
* 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).
|
||||
* 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)
|
||||
|
||||
@@ -51,7 +51,7 @@ typedef struct {
|
||||
|
||||
#else
|
||||
|
||||
#define f_seek_set(stream, loc) \
|
||||
#define f_seek_set(stream, loc) \
|
||||
fseek((FILE*)(stream), *(FILEPOS*)(loc), SEEK_SET)
|
||||
#define f_tell(stream, loc) (*((FILEPOS*)(loc)) = ftell((FILE*)(stream)))
|
||||
|
||||
|
@@ -12,7 +12,7 @@
|
||||
*
|
||||
* 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
|
||||
* 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
|
||||
|
99
func.c
99
func.c
@@ -133,8 +133,8 @@ static STRINGHEAD newerrorstr;
|
||||
* arg count definitons
|
||||
*/
|
||||
#define IN 100 /* maximum number of arguments */
|
||||
#define FE 0x01 /* flag to indicate default epsilon argument */
|
||||
#define FA 0x02 /* preserve addresses of variables */
|
||||
#define FE 0x01 /* flag to indicate default epsilon argument */
|
||||
#define FA 0x02 /* preserve addresses of variables */
|
||||
|
||||
|
||||
/*
|
||||
@@ -146,7 +146,7 @@ struct builtin {
|
||||
short b_maxargs; /* maximum number of arguments */
|
||||
short b_flags; /* special handling flags */
|
||||
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 */
|
||||
char *b_desc; /* description of function */
|
||||
};
|
||||
@@ -566,7 +566,7 @@ f_factor(int count, NUMBER **vals)
|
||||
NUMBER *err; /* error return, NULL => use math_error */
|
||||
ZVALUE limit; /* highest prime factor in search */
|
||||
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 */
|
||||
|
||||
/*
|
||||
@@ -966,7 +966,7 @@ f_srand(int count, VALUE **vals)
|
||||
if (!qisint(vals[0]->v_num)) {
|
||||
math_error(
|
||||
"srand number seed must be an integer");
|
||||
/*NOTREACHED*/
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
result.v_rand = zsrand(&vals[0]->v_num->num, NULL);
|
||||
break;
|
||||
@@ -1117,7 +1117,7 @@ f_srandom(int count, VALUE **vals)
|
||||
if (!qisint(vals[0]->v_num)) {
|
||||
math_error(
|
||||
"srandom number seed must be an integer");
|
||||
/*NOTREACHED*/
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
result.v_random = zsrandom1(vals[0]->v_num->num, TRUE);
|
||||
break;
|
||||
@@ -1476,9 +1476,9 @@ f_min(int count, VALUE **vals)
|
||||
if (qisneg(rel.v_num)) {
|
||||
freevalue(&min);
|
||||
min = term;
|
||||
}
|
||||
else
|
||||
} else {
|
||||
freevalue(&term);
|
||||
}
|
||||
freevalue(&rel);
|
||||
}
|
||||
return min;
|
||||
@@ -1532,9 +1532,9 @@ f_max(int count, VALUE **vals)
|
||||
if (qisneg(rel.v_num)) {
|
||||
freevalue(&max);
|
||||
max = term;
|
||||
}
|
||||
else
|
||||
} else {
|
||||
freevalue(&term);
|
||||
}
|
||||
freevalue(&rel);
|
||||
}
|
||||
return max;
|
||||
@@ -3370,9 +3370,9 @@ f_root(int count, VALUE **vals)
|
||||
err.v_subtype = V_NOSUBTYPE;
|
||||
result.v_subtype = V_NOSUBTYPE;
|
||||
|
||||
if (count > 2)
|
||||
if (count > 2) {
|
||||
vp = vals[2];
|
||||
else {
|
||||
} else {
|
||||
err.v_num = conf->epsilon;
|
||||
err.v_type = V_NUM;
|
||||
vp = &err;
|
||||
@@ -3391,9 +3391,9 @@ f_power(int count, VALUE **vals)
|
||||
err.v_subtype = V_NOSUBTYPE;
|
||||
result.v_subtype = V_NOSUBTYPE;
|
||||
|
||||
if (count > 2)
|
||||
if (count > 2) {
|
||||
vp = vals[2];
|
||||
else {
|
||||
} else {
|
||||
err.v_num = conf->epsilon;
|
||||
err.v_type = V_NUM;
|
||||
vp = &err;
|
||||
@@ -3413,9 +3413,9 @@ f_polar(int count, VALUE **vals)
|
||||
err.v_subtype = V_NOSUBTYPE;
|
||||
result.v_subtype = V_NOSUBTYPE;
|
||||
|
||||
if (count > 2)
|
||||
if (count > 2) {
|
||||
vp = vals[2];
|
||||
else {
|
||||
} else {
|
||||
err.v_num = conf->epsilon;
|
||||
err.v_type = V_NUM;
|
||||
vp = &err;
|
||||
@@ -4138,9 +4138,9 @@ f_search(int count, VALUE **vals)
|
||||
qfree(start);
|
||||
start = qlink(&_qzero_);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else {
|
||||
start = qlink(start);
|
||||
}
|
||||
}
|
||||
if (end) {
|
||||
if (!qispos(end)) {
|
||||
@@ -4388,8 +4388,7 @@ f_rsearch(int count, VALUE **vals)
|
||||
else
|
||||
end = qlink(size);
|
||||
start = qlink(&_qzero_);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if (start == NULL)
|
||||
start = qlink(&_qzero_);
|
||||
if (end == NULL)
|
||||
@@ -4726,9 +4725,9 @@ f_freopen(int count, VALUE **vals)
|
||||
return error_value(E_FREOPEN2);
|
||||
}
|
||||
errno = 0;
|
||||
if (count == 2)
|
||||
if (count == 2) {
|
||||
id = reopenid(vals[0]->v_file, mode, NULL);
|
||||
else {
|
||||
} else {
|
||||
if (vals[2]->v_type != V_STR)
|
||||
return error_value(E_FREOPEN3);
|
||||
id = reopenid(vals[0]->v_file, mode,
|
||||
@@ -4963,9 +4962,9 @@ f_newerror(int count, VALUE **vals)
|
||||
if (nexterrnum == E_USERDEF)
|
||||
initstr(&newerrorstr);
|
||||
index = findstr(&newerrorstr, str);
|
||||
if (index >= 0)
|
||||
if (index >= 0) {
|
||||
errnum = E_USERDEF + index;
|
||||
else {
|
||||
} else {
|
||||
if (nexterrnum == 32767)
|
||||
math_error("Too many new error values");
|
||||
errnum = nexterrnum++;
|
||||
@@ -5092,9 +5091,9 @@ f_fflush(int count, VALUE **vals)
|
||||
|
||||
i = 0;
|
||||
errno = 0;
|
||||
if (count == 0)
|
||||
if (count == 0) {
|
||||
i = flushall();
|
||||
else {
|
||||
} else {
|
||||
for (n = 0; n < count; n++) {
|
||||
if (vals[n]->v_type != V_FILE)
|
||||
return error_value(E_FFLUSH);
|
||||
@@ -5130,9 +5129,9 @@ f_error(int count, VALUE **vals)
|
||||
r = E_ERROR2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
} else {
|
||||
r = set_errno(-1);
|
||||
}
|
||||
|
||||
return error_value(r);
|
||||
}
|
||||
@@ -5192,9 +5191,9 @@ f_fseek(int count, VALUE **vals)
|
||||
return error_value(E_FSEEK1);
|
||||
if (vals[1]->v_type != V_NUM || qisfrac(vals[1]->v_num))
|
||||
return error_value(E_FSEEK2);
|
||||
if (count == 2)
|
||||
if (count == 2) {
|
||||
whence = 0;
|
||||
else {
|
||||
} else {
|
||||
if (vals[2]->v_type != V_NUM || qisfrac(vals[2]->v_num) ||
|
||||
qisneg(vals[2]->v_num))
|
||||
return error_value(E_FSEEK2);
|
||||
@@ -5248,10 +5247,10 @@ f_rewind(int count, VALUE **vals)
|
||||
/* initialize VALUE */
|
||||
result.v_subtype = V_NOSUBTYPE;
|
||||
|
||||
if (count == 0)
|
||||
if (count == 0) {
|
||||
rewindall();
|
||||
|
||||
else {
|
||||
} else {
|
||||
for (n = 0; n < count; n++) {
|
||||
if (vals[n]->v_type != V_FILE)
|
||||
return error_value(E_REWIND1);
|
||||
@@ -5337,7 +5336,7 @@ static int
|
||||
filescan(FILEID id, int count, VALUE **vals)
|
||||
{
|
||||
char *str;
|
||||
int i;
|
||||
int i;
|
||||
int n = 0;
|
||||
VALUE val;
|
||||
VALUE result;
|
||||
@@ -6331,10 +6330,10 @@ static VALUE
|
||||
f_cmdbuf(void)
|
||||
{
|
||||
VALUE result;
|
||||
char *newcp;
|
||||
char *newcp;
|
||||
|
||||
/* initialize VALUE */
|
||||
result.v_type = V_STR;
|
||||
result.v_type = V_STR;
|
||||
result.v_subtype = V_NOSUBTYPE;
|
||||
|
||||
newcp = (char *)malloc(strlen(cmdbuf) + 1);
|
||||
@@ -6357,7 +6356,7 @@ f_getenv(VALUE *v1)
|
||||
math_error("Non-string argument for getenv");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
result.v_type = V_STR;
|
||||
result.v_type = V_STR;
|
||||
str = getenv(v1->v_str->s_str);
|
||||
if (str == NULL)
|
||||
result.v_type = V_NULL;
|
||||
@@ -6468,7 +6467,7 @@ static VALUE
|
||||
f_putenv(int count, VALUE **vals)
|
||||
{
|
||||
VALUE result;
|
||||
char *putenv_str;
|
||||
char *putenv_str;
|
||||
|
||||
/* initialize VALUE */
|
||||
result.v_type = V_NUM;
|
||||
@@ -6530,8 +6529,8 @@ static VALUE
|
||||
f_strpos(VALUE *haystack, VALUE *needle)
|
||||
{
|
||||
VALUE result;
|
||||
char *cpointer;
|
||||
int cindex;
|
||||
char *cpointer;
|
||||
int cindex;
|
||||
|
||||
/* initialize VALUE */
|
||||
result.v_type = V_NUM;
|
||||
@@ -6541,11 +6540,11 @@ f_strpos(VALUE *haystack, VALUE *needle)
|
||||
math_error("Non-string argument for index");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
cpointer = strstr(haystack->v_str->s_str,
|
||||
cpointer = strstr(haystack->v_str->s_str,
|
||||
needle->v_str->s_str);
|
||||
if (cpointer == NULL)
|
||||
if (cpointer == NULL)
|
||||
cindex = 0;
|
||||
else
|
||||
else
|
||||
cindex = cpointer - haystack->v_str->s_str + 1;
|
||||
result.v_num = itoq((long) cindex);
|
||||
return result;
|
||||
@@ -6584,7 +6583,7 @@ static NUMBER *
|
||||
f_base(int count, NUMBER **vals)
|
||||
{
|
||||
long base; /* output base/mode */
|
||||
long oldbase=0; /* output base/mode */
|
||||
long oldbase=0; /* output base/mode */
|
||||
|
||||
/* deal with just a query */
|
||||
if (count != 1) {
|
||||
@@ -6886,9 +6885,9 @@ f_blocks(int count, VALUE **vals)
|
||||
|
||||
nblk = findnblock(id);
|
||||
|
||||
if (nblk == NULL)
|
||||
if (nblk == NULL) {
|
||||
return error_value(E_BLOCKS2);
|
||||
else {
|
||||
} else {
|
||||
result.v_type = V_NBLOCK;
|
||||
result.v_nblock = nblk;
|
||||
}
|
||||
@@ -7311,14 +7310,14 @@ f_md5(int count, VALUE **vals)
|
||||
*
|
||||
* For nice output, when the description of function (b_desc)
|
||||
* 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:
|
||||
*
|
||||
* ... very long description that goes beyond col 79
|
||||
*
|
||||
* 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:
|
||||
* 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,
|
||||
"smallest integer greater than or equal to number"},
|
||||
{"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,
|
||||
"simplify number using continued fractions"},
|
||||
{"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,
|
||||
"whether the type of a is same as the type of b"},
|
||||
{"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 one or more lists into one list"},
|
||||
{"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,
|
||||
"integer corresponding to character value"},
|
||||
{"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,
|
||||
"permutation number a!/(a-b)!"},
|
||||
{"prevcand", 1, 5, 0, OP_NOP, f_prevcand, 0,
|
||||
|
2
func.h
2
func.h
@@ -6,7 +6,7 @@
|
||||
|
||||
|
||||
#if !defined(__FUNC_H__)
|
||||
#define __FUNC_H__
|
||||
#define __FUNC_H__
|
||||
|
||||
|
||||
#include "calc.h"
|
||||
|
6
hash.c
6
hash.c
@@ -248,14 +248,14 @@ hash_final(HASH *state)
|
||||
*
|
||||
* given:
|
||||
* type - hash type (see hash.h)
|
||||
* longval - a long value
|
||||
* longval - a long value
|
||||
* state - the state to hash
|
||||
*
|
||||
* returns:
|
||||
* the new state
|
||||
* the new state
|
||||
*
|
||||
* 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 *
|
||||
|
4
hash.h
4
hash.h
@@ -52,8 +52,8 @@
|
||||
*/
|
||||
typedef struct hashstate HASH;
|
||||
struct hashstate {
|
||||
int hashtype; /* XYZ_HASH_TYPE debug value */
|
||||
BOOL bytes; /* TRUE => reading bytes rather than words */
|
||||
int hashtype; /* XYZ_HASH_TYPE debug value */
|
||||
BOOL bytes; /* TRUE => reading bytes rather than words */
|
||||
void (*update)(HASH*, USB8*, USB32); /* update arbitrary length */
|
||||
void (*chkpt)(HASH*); /* checkpoint a state */
|
||||
void (*note)(int, HASH*); /* note a special value */
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* have_offscl
|
||||
*
|
||||
* 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
|
||||
* a ZVALUE in order to perform arithmetic operations, assignments and
|
||||
* comparisons.
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* have_posscl
|
||||
*
|
||||
* 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
|
||||
* a ZVALUE in order to perform arithmetic operations, assignments and
|
||||
* comparisons.
|
||||
@@ -51,7 +51,7 @@ main(void)
|
||||
{
|
||||
#if !defined(FILEPOS_NON_SCALAR)
|
||||
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
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* as if it were vsprintf() and hope for the best.
|
||||
*
|
||||
* 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>
|
||||
* include file.
|
||||
*/
|
||||
@@ -109,14 +109,14 @@ main(void)
|
||||
puts(" * SIMULATE_STDARG");
|
||||
puts(" *");
|
||||
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(" */");
|
||||
puts("typedef char *va_list;");
|
||||
puts("#define va_start(ap,parmn) (void)((ap) = (char*)(&(parmn) + 1))");
|
||||
puts("#define va_end(ap) (void)((ap) = 0)");
|
||||
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> */");
|
||||
#else
|
||||
puts("#define STDARG /* use <stdarg.h> */");
|
||||
|
@@ -50,8 +50,8 @@ main(void)
|
||||
|
||||
#else /* HAVE_NO_USTAT */
|
||||
|
||||
struct stat stat_dot; /* stat of "." */
|
||||
struct ustat ustat_dot; /* usage stat of "." */
|
||||
struct stat stat_dot; /* stat of "." */
|
||||
struct ustat ustat_dot; /* usage stat of "." */
|
||||
|
||||
(void) stat(".", &stat_dot);
|
||||
(void) ustat(stat_dot.st_dev, &ustat_dot);
|
||||
|
@@ -6,7 +6,7 @@
|
||||
* and hope for the best.
|
||||
*
|
||||
* 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>
|
||||
* include 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
|
||||
#
|
||||
# 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:
|
||||
rm -f .all
|
||||
@@ -341,7 +341,7 @@ ${SINGULAR_FILES}: ${PLURAL_FILES}
|
||||
# Form the builtin file
|
||||
#
|
||||
# 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
|
||||
# buildable at this point. The hack-a-round used is to convert ../func.c
|
||||
# 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
|
||||
|
@@ -17,7 +17,7 @@ DESCRIPTION
|
||||
acosh(x) is the nonnegative real number v for which cosh(v) = x.
|
||||
It is given by
|
||||
|
||||
acosh(x) = ln(x + sqrt(x^2 - 1))
|
||||
acosh(x) = ln(x + sqrt(x^2 - 1))
|
||||
|
||||
EXAMPLE
|
||||
> print acosh(2, 1e-5), acosh(2, 1e-10), acosh(2, 1e-15), acosh(2, 1e-20)
|
||||
|
@@ -16,7 +16,7 @@ DESCRIPTION
|
||||
|
||||
acoth(x) is the real number v for which coth(v) = x.
|
||||
It is given by
|
||||
acoth(x) = ln((x + 1)/(x - 1))/2
|
||||
acoth(x) = ln((x + 1)/(x - 1))/2
|
||||
|
||||
EXAMPLE
|
||||
> print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20)
|
||||
|
@@ -16,7 +16,7 @@ DESCRIPTION
|
||||
|
||||
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
|
||||
|
@@ -20,7 +20,7 @@ DESCRIPTION
|
||||
otherwise accessing, such a vacated address may be catastrophic.
|
||||
|
||||
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
|
||||
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().
|
||||
@@ -96,7 +96,7 @@ DESCRIPTION
|
||||
> define f(a) = 27 + a;
|
||||
|
||||
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
|
||||
stored elsewhere (e.g. as the "old value" or in another function
|
||||
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
|
||||
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
|
||||
seen from printing &*A, &*B, &*C after
|
||||
|
||||
|
@@ -84,7 +84,7 @@ DESCRIPTION
|
||||
|
||||
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
|
||||
If appr(x,y,z) != x, then abs(x - appr(x,y,z)) < abs(y).
|
||||
|
@@ -16,7 +16,7 @@ DESCRIPTION
|
||||
|
||||
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
|
||||
> print asech(.5,1e-5), asech(.5,1e-10), asech(.5,1e-15), asech(.5,1e-20)
|
||||
|
@@ -16,7 +16,7 @@ DESCRIPTION
|
||||
|
||||
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
|
||||
> print asinh(2, 1e-5), asinh(2, 1e-10), asinh(2, 1e-15), asinh(2, 1e-20)
|
||||
|
@@ -44,7 +44,7 @@ DESCRIPTION
|
||||
In simple assignments, = associates from right to left so that, for
|
||||
example,
|
||||
|
||||
a = b = c
|
||||
a = b = 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
|
||||
@@ -66,7 +66,7 @@ DESCRIPTION
|
||||
that of A[0] = A[1].
|
||||
|
||||
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,
|
||||
mat A[2]= {1,2};
|
||||
A[0] = (A = 3);
|
||||
|
@@ -14,7 +14,7 @@ DESCRIPTION
|
||||
assignments of the forms
|
||||
|
||||
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, a_4] = v_4
|
||||
|
||||
@@ -53,7 +53,7 @@ DESCRIPTION
|
||||
a sequential scan through the elements difficult.
|
||||
|
||||
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.
|
||||
|
||||
Associations can be copied by an assignment, and can be compared
|
||||
|
@@ -18,8 +18,8 @@ DESCRIPTION
|
||||
|
||||
The following convention is used to declare modes:
|
||||
|
||||
base config
|
||||
value string
|
||||
base config
|
||||
value string
|
||||
|
||||
2 "binary" binary fractions
|
||||
8 "octal" octal fractions
|
||||
|
2
help/bit
2
help/bit
@@ -11,7 +11,7 @@ TYPES
|
||||
return int
|
||||
|
||||
DESCRIPTION
|
||||
Determine if the binary bit y is set in x. If:
|
||||
Determine if the binary bit y is set in x. If:
|
||||
|
||||
x
|
||||
int(---) mod 2 == 1
|
||||
|
8
help/blk
8
help/blk
@@ -26,7 +26,7 @@ DESCRIPTION
|
||||
... , B[len-1], these all initially having zero value.
|
||||
|
||||
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
|
||||
|
||||
@@ -70,7 +70,7 @@ DESCRIPTION
|
||||
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
|
||||
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
|
||||
min(len, newlen) octets being copied from B; later octets are
|
||||
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.
|
||||
|
||||
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
|
||||
named blocks. A named block may be used
|
||||
|
||||
The memory allocated to a named block is freed by the blkfree()
|
||||
function with argument the named block, its name, or its id number.
|
||||
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:
|
||||
|
||||
blk(val [, len, chunk])
|
||||
|
@@ -90,7 +90,7 @@ DESCRIPTION
|
||||
so that num can be at most size(B) - ssi.
|
||||
|
||||
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.)
|
||||
|
||||
For copying from a file stream fs, num can be at most size(fs) - ssi.
|
||||
|
12
help/blkfree
12
help/blkfree
@@ -12,7 +12,7 @@ TYPES
|
||||
DESCRIPTION
|
||||
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
|
||||
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,
|
||||
but its size and maxsize becomes zero and the pointer for the start
|
||||
of its data block null.
|
||||
@@ -26,16 +26,16 @@ EXAMPLE
|
||||
> B1 = blk("foo")
|
||||
> B2 = blk("Second block")
|
||||
show blocks
|
||||
id name
|
||||
id name
|
||||
---- -----
|
||||
0 foo
|
||||
1 Second block
|
||||
0 foo
|
||||
1 Second block
|
||||
|
||||
> blkfree(B1)
|
||||
> show blocks
|
||||
id name
|
||||
id name
|
||||
---- -----
|
||||
1 Second block
|
||||
1 Second block
|
||||
|
||||
> B1
|
||||
block 0: foo
|
||||
|
@@ -12,7 +12,7 @@ TYPES
|
||||
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
|
||||
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.
|
||||
|
||||
For other cases:
|
||||
@@ -31,7 +31,7 @@ DESCRIPTION
|
||||
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
|
||||
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.
|
||||
the five low order bits of rnd, as follows:
|
||||
|
||||
|
@@ -4,25 +4,25 @@
|
||||
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,
|
||||
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
|
||||
parameters are explained in the next section.
|
||||
|
||||
The scale function multiplies or divides a number by a power of 2.
|
||||
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.
|
||||
|
||||
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
|
||||
variables which will be assigned the quotient and remainder. For
|
||||
nonnegative arguments, the results are equivalent to computing a//b
|
||||
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
|
||||
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
|
||||
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,
|
||||
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.
|
||||
@@ -37,8 +37,8 @@
|
||||
|
||||
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
|
||||
is at digit position 0. For example, digit(5678, 3) is 5, and
|
||||
bit(0b1000100, 2) is 1. Negative digit positions indicate places
|
||||
is at digit position 0. For example, digit(5678, 3) is 5, and
|
||||
bit(0b1000100, 2) is 1. Negative digit positions indicate places
|
||||
to the right of the decimal or binary point, so that for example,
|
||||
digit(3.456, -1) is 4.
|
||||
|
||||
@@ -139,11 +139,11 @@
|
||||
|
||||
The functions rcin, rcmul, rcout, rcpow, and rcsq are used to
|
||||
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
|
||||
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
|
||||
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,
|
||||
negation, and equality comparison between REDC numbers are done
|
||||
using the normal modular methods. For example, to calculate the
|
||||
@@ -185,8 +185,8 @@
|
||||
|
||||
The following convention is used to declare modes:
|
||||
|
||||
base config
|
||||
value string
|
||||
base config
|
||||
value string
|
||||
|
||||
2 "binary" binary fractions
|
||||
8 "octal" octal fractions
|
||||
|
@@ -1,8 +1,8 @@
|
||||
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
|
||||
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
|
||||
description refers to values or numbers. This display is generated
|
||||
by the 'show builtin' command.
|
||||
|
@@ -10,7 +10,7 @@ TYPES
|
||||
DESCRIPTION
|
||||
This function returns the calculation level at which it is called.
|
||||
When a command is being read from a terminal or from a file,
|
||||
calc is at calculation level zero. The level is increased
|
||||
calc is at calculation level zero. The level is increased
|
||||
by 1 each time calculation starts of a user-defined function
|
||||
or of eval(S) for some expression S which evaluates to a string. It
|
||||
decreases to zero if an error occurs or a quit or abort statement
|
||||
|
@@ -6,7 +6,7 @@ SYNOPSIS
|
||||
|
||||
TYPES
|
||||
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
|
||||
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,
|
||||
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
|
||||
determined by bits 0, 1, 2 and 4 of the argument rnd in the same way as
|
||||
|
@@ -30,7 +30,7 @@ DESCRIPTION
|
||||
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
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
8 0 x - sgn(x)/2 approximant
|
||||
8 0 x - sgn(x)/2 approximant
|
||||
16 x - sgn(x) x + sgn(x)/2 nearest
|
||||
|
||||
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
|
||||
"good" approximations to x with decreasing denominators and
|
||||
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
|
||||
greater than and less than x.)
|
||||
|
||||
|
4
help/cmp
4
help/cmp
@@ -17,7 +17,7 @@ TYPES
|
||||
|
||||
return if x and y are both real: -1, 0, or 1
|
||||
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
|
||||
all other cases: the null value
|
||||
|
||||
@@ -47,7 +47,7 @@ DESCRIPTION
|
||||
obj point {x,y};
|
||||
|
||||
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
|
||||
|
||||
define point_rel(a,b) = sgn(a.x^2 + a.y^2 - b.x^2 - b.y^2);
|
||||
|
14
help/command
14
help/command
@@ -3,7 +3,7 @@ Command sequence
|
||||
This is a sequence of any the following command formats, where
|
||||
each command is terminated by a semicolon or newline. Long command
|
||||
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
|
||||
cases will automatically prompt for more input in a similar manner,
|
||||
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 specified expression value from the specified parameters.
|
||||
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:
|
||||
|
||||
define sumcubes(a, b) = a^3 + b^3
|
||||
@@ -45,7 +45,7 @@ Command sequence
|
||||
read filename
|
||||
read -once 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
|
||||
through the specified directories for the filename,
|
||||
similarly to the use of the PATH environment variable.
|
||||
@@ -54,7 +54,7 @@ Command sequence
|
||||
directory followed by a general calc library directory).
|
||||
The ".cal" extension is defaulted for input files, so
|
||||
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
|
||||
evaluate or functions to define, just like at the top
|
||||
level command level.
|
||||
@@ -82,7 +82,7 @@ Command sequence
|
||||
later read in order to recreate the variable values.
|
||||
For speed reasons, values are written as hex fractions.
|
||||
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.
|
||||
|
||||
If the -m mode disallows opening of files for writing,
|
||||
@@ -247,7 +247,7 @@ Command sequence
|
||||
> <==== calc interactive prompt
|
||||
|
||||
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,
|
||||
even when calc is invoked with '-i'.
|
||||
|
||||
@@ -304,5 +304,5 @@ Command sequence
|
||||
|
||||
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
|
||||
|
32
help/config
32
help/config
@@ -1,10 +1,10 @@
|
||||
Configuration parameters
|
||||
|
||||
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,
|
||||
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
|
||||
until their values are changed by a config or equivalent instruction.
|
||||
The following parameters can be specified:
|
||||
@@ -65,7 +65,7 @@ Configuration parameters
|
||||
It allows functions to control their configuration without impacting
|
||||
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:
|
||||
|
||||
config("all", "oldstd")
|
||||
@@ -105,7 +105,7 @@ Configuration parameters
|
||||
the decimal point to be printed in real or exponential mode in
|
||||
normal unformatted printing (print, strprint, fprint) or in
|
||||
formatted printing (printf, strprintf, fprintf) when precision is not
|
||||
specified. The initial value 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
|
||||
config("display", d) or by display (d). This parameter does not change
|
||||
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
|
||||
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
|
||||
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
|
||||
numbers by the unformatted print functions, and the default
|
||||
("%d" specifier) for formatted print functions. The initial mode
|
||||
is "real". The available modes are:
|
||||
is "real". The available modes are:
|
||||
|
||||
"frac" decimal fractions
|
||||
"int" decimal integer
|
||||
@@ -152,10 +152,10 @@ Configuration parameters
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
@@ -174,9 +174,9 @@ Configuration parameters
|
||||
Redc2 specifies the sizes of numbers at which calc switches from
|
||||
its first to its second algorithm when using the REDC algorithm.
|
||||
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
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
"tab" value is 1.
|
||||
|
||||
@@ -271,7 +271,7 @@ Configuration parameters
|
||||
The default is to print only the first 256 octets.
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
both oldstd and newstd) of config("lib_calc") corresponds to switching
|
||||
off all these routines. For nonzero value, particular bits
|
||||
@@ -401,16 +401,16 @@ Configuration parameters
|
||||
|
||||
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:
|
||||
|
||||
"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:
|
||||
|
||||
config("mode", "exp"); exponential output
|
||||
config("display", 50); 50 digits of output
|
||||
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
|
||||
|
@@ -40,7 +40,7 @@ You should send submissions to:
|
||||
|
||||
[[ 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
|
||||
your efforts and submissions!
|
||||
|
||||
|
@@ -15,7 +15,7 @@ Credits
|
||||
hist.c which is used to do the command line editing.
|
||||
|
||||
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.
|
||||
Ernest also supplied the original text for many of the help files.
|
||||
|
||||
|
@@ -28,7 +28,7 @@ DESCRIPTION
|
||||
calc -C
|
||||
|
||||
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
|
||||
portable calc scripts may be used.
|
||||
|
||||
@@ -36,7 +36,7 @@ DESCRIPTION
|
||||
multi-precision calculations in a C-like environment. You should
|
||||
consider implementing algorithms in the calc language as a first
|
||||
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.
|
||||
|
||||
The custom function interface is intended to make is easy for
|
||||
|
@@ -9,7 +9,7 @@ Function definitions
|
||||
by a return statement, and the function definition is ended with a
|
||||
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
|
||||
execution and be different in different calls to the function. For
|
||||
example, a two-argument function add may be defined by
|
||||
|
2
help/den
2
help/den
@@ -11,7 +11,7 @@ TYPES
|
||||
|
||||
DESCRIPTION
|
||||
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
|
||||
value can be uniquely expressed as:
|
||||
|
||||
|
@@ -14,7 +14,7 @@ Environment variables
|
||||
|
||||
/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.
|
||||
|
||||
The CALCBINDINGS file searches the CALCPATH as well.
|
||||
|
@@ -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
|
||||
|
@@ -11,7 +11,7 @@ TYPES
|
||||
|
||||
DESCRIPTION
|
||||
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
|
||||
reserved keywords (define, show, help, read, write, show, cd) intended
|
||||
for interactive use or for reading from a file.
|
||||
|
2
help/exp
2
help/exp
@@ -1,5 +1,5 @@
|
||||
NAME
|
||||
exp - exponential function
|
||||
exp - exponential function
|
||||
|
||||
SYNOPSIS
|
||||
exp(x [,eps])
|
||||
|
@@ -14,7 +14,7 @@ TYPES
|
||||
DESCRIPTION
|
||||
|
||||
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.
|
||||
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.
|
||||
|
@@ -13,7 +13,7 @@ DESCRIPTION
|
||||
This function closes the open file associated with the descriptor fd.
|
||||
When this is done, the file value associated with the file remains
|
||||
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
|
||||
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 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.
|
||||
|
||||
EXAMPLE
|
||||
|
@@ -14,7 +14,7 @@ DESCRIPTION
|
||||
is set or clear.
|
||||
|
||||
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.
|
||||
|
||||
EXAMPLE
|
||||
@@ -23,14 +23,14 @@ EXAMPLE
|
||||
> fflush(fd1)
|
||||
> fd2 = fopen("/tmp/newfile", "r")
|
||||
> feof(fd2)
|
||||
0
|
||||
0
|
||||
> fgetline(fd2)
|
||||
"Chongo was here"
|
||||
> feof(fd2)
|
||||
0
|
||||
0
|
||||
> fgetline(fd2)
|
||||
> feof(fd2)
|
||||
1
|
||||
1
|
||||
|
||||
LIMITS
|
||||
none
|
||||
|
@@ -20,7 +20,7 @@ DESCRIPTION
|
||||
EXAMPLE
|
||||
> fd = fopen("/etc/motd", "r")
|
||||
> ferror(fd)
|
||||
0
|
||||
0
|
||||
|
||||
LIMITS
|
||||
fd must be associaed with an open file
|
||||
|
@@ -14,7 +14,7 @@ DESCRIPTION
|
||||
associated with fd.
|
||||
|
||||
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.
|
||||
|
||||
EXAMPLE
|
||||
|
@@ -16,7 +16,7 @@ DESCRIPTION
|
||||
characters are skipped. If the reading reaches end-of-file, the
|
||||
null value is returned. If non-whitespace is encountered, formation
|
||||
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
|
||||
be immediately after the first whitespace character of '\0' or at
|
||||
end-of-file.
|
||||
|
@@ -14,7 +14,7 @@ DESCRIPTION
|
||||
the open file associated with fd. Unlike fgets, the trailing
|
||||
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
|
||||
string and a null value.)
|
||||
|
||||
|
18
help/file
18
help/file
@@ -6,7 +6,7 @@ Using files
|
||||
Some differences do occur, as will be explained here.
|
||||
|
||||
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
|
||||
|
||||
@@ -19,8 +19,8 @@ Using files
|
||||
|
||||
A file can be opened for either reading, writing, or appending.
|
||||
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'
|
||||
for writing, and 'a' for appending. For example, to open the file
|
||||
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
|
||||
'foo' for reading, the following could be used:
|
||||
|
||||
fd = fopen('foo', 'r');
|
||||
@@ -53,7 +53,7 @@ Using files
|
||||
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
|
||||
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
|
||||
explicitly close all the copies of a file value. The 'fclose'
|
||||
function returns the numeric value of errno if there had been an
|
||||
@@ -67,7 +67,7 @@ Using files
|
||||
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
|
||||
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,
|
||||
@@ -75,7 +75,7 @@ Using files
|
||||
status is also displayed.
|
||||
|
||||
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
|
||||
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 'fgetline' function accepts a file value, and returns the next
|
||||
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 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'
|
||||
function can then be used to convert the string to a numeric value.
|
||||
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
|
||||
file (which could be stdout or stderr). The 'fprintf' function
|
||||
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
|
||||
in the interpretation of values to be printed for various formats.
|
||||
Unlike in C, where an unmatched format type and value will cause
|
||||
|
@@ -25,7 +25,7 @@ DESCRIPTION
|
||||
files are already open by the calculator and cannot be closed.
|
||||
|
||||
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
|
||||
will try to read and write to this file when directed.
|
||||
|
||||
|
@@ -20,7 +20,7 @@ DESCRIPTION
|
||||
"a" appending
|
||||
|
||||
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
|
||||
|
||||
|
@@ -6,7 +6,7 @@ SYNOPSIS
|
||||
|
||||
TYPES
|
||||
fs file stream open for writing
|
||||
s_1, ... string
|
||||
s_1, ... string
|
||||
|
||||
return null or error value
|
||||
|
||||
@@ -22,9 +22,9 @@ EXAMPLE
|
||||
> fputstr(f, "Alpha", "Beta")
|
||||
> freopen(f, "r")
|
||||
> fgetstr(f)
|
||||
"Alpha"
|
||||
"Alpha"
|
||||
> fgetstr(f)
|
||||
"Beta"
|
||||
"Beta"
|
||||
> fgetstr(f)
|
||||
>
|
||||
> fputstr(f, "Gamma")
|
||||
|
@@ -5,14 +5,14 @@ SYNOPSIS
|
||||
free(a, b, ...)
|
||||
|
||||
TYPES
|
||||
a, b, ... any
|
||||
a, b, ... any
|
||||
|
||||
return null value
|
||||
|
||||
DESCRIPTION
|
||||
Those of the arguments a, b, ... that specify lvalues are assigned
|
||||
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".
|
||||
|
||||
|
@@ -19,10 +19,10 @@ EXAMPLE
|
||||
|
||||
Name Level Type
|
||||
---- ----- -----
|
||||
a 1 real = 2
|
||||
a 0 real = 1
|
||||
b 0 list
|
||||
c 0 matrix
|
||||
a 1 real = 2
|
||||
a 0 real = 1
|
||||
b 0 list
|
||||
c 0 matrix
|
||||
|
||||
Number: 4
|
||||
> freeglobals()
|
||||
@@ -30,10 +30,10 @@ EXAMPLE
|
||||
|
||||
Name Level Type
|
||||
---- ----- -----
|
||||
a 1 null
|
||||
a 0 null
|
||||
b 0 null
|
||||
c 0 null
|
||||
a 1 null
|
||||
a 0 null
|
||||
b 0 null
|
||||
c 0 null
|
||||
|
||||
Number: 4
|
||||
|
||||
|
@@ -15,8 +15,8 @@ EXAMPLE
|
||||
> a = rcin(10,27)
|
||||
> b = rcin(10,15)
|
||||
> show redc
|
||||
0 1 27
|
||||
1 2 15
|
||||
0 1 27
|
||||
1 2 15
|
||||
> freeredc()
|
||||
> show redc
|
||||
>
|
||||
|
@@ -26,7 +26,7 @@ EXAMPLE
|
||||
|
||||
Name Scopes Type
|
||||
---- ------ -----
|
||||
a 1 0 real = 6
|
||||
a 1 0 real = 6
|
||||
|
||||
Number: 1
|
||||
> freestatics()
|
||||
|
@@ -14,7 +14,7 @@ DESCRIPTION
|
||||
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).
|
||||
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.
|
||||
|
||||
For all x, frem(x,0) is defined to equal abs(x).
|
||||
|
@@ -18,7 +18,7 @@ DESCRIPTION
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user