mirror of
https://github.com/lcn2/calc.git
synced 2025-08-19 01:13:27 +03:00
Compare commits
33 Commits
2.11.0t6.3
...
2.11.0t10.
Author | SHA1 | Date | |
---|---|---|---|
|
97ed812cb9 | ||
|
6254c4a14c | ||
|
c7c0de97f2 | ||
|
96c34adee3 | ||
|
86c8e6dcf1 | ||
|
58d32c68f9 | ||
|
7d0b761de3 | ||
|
82ff31f246 | ||
|
7cb0a77c25 | ||
|
afb0e5c32a | ||
|
df32e3956d | ||
|
75e742c716 | ||
|
1b42111665 | ||
|
ea6b3904be | ||
|
f3fceff1b6 | ||
|
69d4a17187 | ||
|
a99a3400e7 | ||
|
9b6c308b42 | ||
|
8927373965 | ||
|
478d68fca9 | ||
|
e6e2556893 | ||
|
a7e363da8b | ||
|
8db10967e8 | ||
|
49be672338 | ||
|
a7d401cd65 | ||
|
5cc680fe42 | ||
|
2c72ea9339 | ||
|
0ffc341b10 | ||
|
2251281027 | ||
|
45a4b8469d | ||
|
9204d2fb8c | ||
|
35982c7cc8 | ||
|
4c0f2691e9 |
134
BUGS
134
BUGS
@@ -20,34 +20,30 @@ configuration, try backing them out and see if things get better.
|
|||||||
|
|
||||||
To be sure that your version of calc is up to date, check out:
|
To be sure that your version of calc is up to date, check out:
|
||||||
|
|
||||||
http://reality.sgi.com/chongo/calc/calc-download.html
|
http://reality.sgi.com/chongo/tech/comp/calc/calc-download.html
|
||||||
|
|
||||||
The calc web site is located at:
|
The calc web site is located at:
|
||||||
|
|
||||||
http://reality.sgi.com/chongo/calc
|
http://reality.sgi.com/chongo/tech/comp/calc/index.html
|
||||||
|
|
||||||
=-=
|
=-=
|
||||||
|
|
||||||
If you have tried all of the above and things still are not right,
|
If you have tried all of the above and things still are not right,
|
||||||
then it may be time to send in a bug report. You can send bug reports to:
|
then it may be time to send in a bug report. You can send bug reports to:
|
||||||
|
|
||||||
calc-tester@postofc.corp.sgi.com
|
calc-bugs at postofc dot corp dot sgi dot com
|
||||||
|
|
||||||
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
|
||||||
When you send your report, please include the following information:
|
When you send your report, please include the following information:
|
||||||
|
|
||||||
* a description of the problem
|
* a description of the problem
|
||||||
|
|
||||||
* the version of calc you are using (if you cannot get calc
|
* the version of calc you are using (if you cannot get calc
|
||||||
it to run, then send us the 4 #define lines from version.c)
|
it to run, then send us the 4 #define lines from version.c)
|
||||||
|
|
||||||
* if you modified calc from an official patch, send me the mods you made
|
* if you modified calc from an official patch, send me the mods you made
|
||||||
|
|
||||||
* the type of system you were using
|
* the type of system you were using
|
||||||
|
|
||||||
* the type of compiler you were using
|
* the type of compiler you were using
|
||||||
|
* any compiler warnings or errors that you saw
|
||||||
* any compiler warnings or erros that you saw
|
|
||||||
|
|
||||||
* cd to the calc source directory, and type:
|
* cd to the calc source directory, and type:
|
||||||
|
|
||||||
make debug > debug.out 2>&1 (sh, ksh, bash users)
|
make debug > debug.out 2>&1 (sh, ksh, bash users)
|
||||||
@@ -62,30 +58,114 @@ Stack traces from core dumps are useful to send as well.
|
|||||||
Send any comments, compiler warning messages, suggestions and most
|
Send any comments, compiler warning messages, suggestions and most
|
||||||
importantly, fixes (in the form of a context diff patch) to:
|
importantly, fixes (in the form of a context diff patch) to:
|
||||||
|
|
||||||
calc-tester@postofc.corp.sgi.com
|
calc-tester at postofc dot corp dot sgi dot com
|
||||||
|
|
||||||
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
|
||||||
|
You should use the above calc-bugs address for bug reports, if you are
|
||||||
|
not currently a member of the calc-tester mailing list.
|
||||||
|
|
||||||
=-=
|
=-=
|
||||||
|
|
||||||
Known problems or mis-features:
|
Known bugs:
|
||||||
|
|
||||||
* Many of and SEE ALSO sections of help files
|
* Calc does not support the #! exec method. For example of the
|
||||||
for builtins are either inconsistent or missing information.
|
following is placed in an executable file (assume the path to
|
||||||
|
calc is correct) called /tmp/xyzzy:
|
||||||
|
|
||||||
* Many of the LIBRARY sections are incorrect now that libcalc.a
|
#!/usr/local/bin/calc
|
||||||
contains most of the calc system.
|
/*
|
||||||
|
* comment
|
||||||
|
*/
|
||||||
|
print 2+3;
|
||||||
|
|
||||||
* There is some places in the source with obscure variable names
|
Will result in '"tmp" is undefined' and '"xyzzy" is undefined'
|
||||||
and not much in the way of comments. We need some major cleanup
|
error messages because calc considers $0 as an expression to
|
||||||
and documentation.
|
evaluate.
|
||||||
|
|
||||||
* On a Dec Alpha, using the Dec Alpha cc (not gcc) make check for
|
* The following file:
|
||||||
version 2.11.0t5.1 fails in the regression test:
|
|
||||||
|
|
||||||
From vandermj@molbio.sbphrd.com Tue Oct 5 04:06:52 1999
|
/* this is bugdemo.cal */
|
||||||
Subject: Re: oops, try calc version 2.10.0t5.1
|
x = eval(prompt(">>> "));
|
||||||
Date: Tue, 05 Oct 1999 07:06:30 -0400
|
print x;
|
||||||
|
|
||||||
Regular cc on Dec alpha, 'make check' dies with:
|
when executed as:
|
||||||
|
|
||||||
1804: surd_value(a) == 2+3i
|
calc read bugdemo.cal
|
||||||
"": line 1706: Calling qfreenum with nozero links!!!
|
|
||||||
|
will obtain a prompt from the terminal, print the value but leave
|
||||||
|
the terminal in a 'bad' state, as if stty -icanon -echo -echoe
|
||||||
|
had been executed.
|
||||||
|
|
||||||
|
* Use of 'fmt' in the 2nd arg of printf() calls in c_sysinfo.c
|
||||||
|
cause some compilers to issue warnings.
|
||||||
|
|
||||||
|
We are sure some more bugs exist. When you find them, please let
|
||||||
|
us know! See the above for details on how to report and were to
|
||||||
|
EMail your bug reports and hopefully patches to fix them.
|
||||||
|
|
||||||
|
=-=
|
||||||
|
|
||||||
|
Problems with known work-a-rounds:
|
||||||
|
|
||||||
|
* There is a bug in gcc-2.95 that causes calc, when compiled with -O2,
|
||||||
|
to fail the regression test. The work-a-round is to compile with -O
|
||||||
|
or to use gcc-2.96 or later.
|
||||||
|
|
||||||
|
* Solaris cc somtimes barfs while compiling zrand.c. In particular, calc
|
||||||
|
barfs on on the SVAL macro. The work-a-round is to use the Solaric cc
|
||||||
|
Makefile set sets -DFORCE_STDC. I.e,:
|
||||||
|
|
||||||
|
CCWARN=
|
||||||
|
CCOPT= ${DEBUG} ${NO_SHARED}
|
||||||
|
CCMISC= -DFORCE_STDC
|
||||||
|
#
|
||||||
|
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
|
||||||
|
ICFLAGS= ${CCWARN} ${CCMISC}
|
||||||
|
#
|
||||||
|
LCFLAGS=
|
||||||
|
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
|
||||||
|
ILDFLAGS=
|
||||||
|
#
|
||||||
|
LCC= cc
|
||||||
|
CC= ${PURIFY} ${LCC}
|
||||||
|
|
||||||
|
* There is a bug in some versions of the Dec/Compaq cc for the Alpha
|
||||||
|
where the following:
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#define SVAL(a,b) (unsigned long)(0x ## a ## b ## ULL)
|
||||||
|
main(){SVAL(b8a8aeb0,8168eadc);}
|
||||||
|
|
||||||
|
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
|
||||||
|
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
|
||||||
|
dies a horrible death starting in test 600 and 622 gives 100s of
|
||||||
|
messages for calc version 2.11.0t9.4 using the Dec's cc with -O2:
|
||||||
|
|
||||||
|
600: Beginning test_bignums
|
||||||
|
601: muldivcheck 1
|
||||||
|
**** abc != acb: 602: muldivcheck 2
|
||||||
|
**** acb != bac: 602: muldivcheck 2
|
||||||
|
...
|
||||||
|
**** t4 != a4: 622: algcheck 1
|
||||||
|
**** t5 != a5: 622: algcheck 1
|
||||||
|
**** t6 != a6: 622: algcheck 1
|
||||||
|
**** t4 != a4: 622: algcheck 1
|
||||||
|
...
|
||||||
|
|
||||||
|
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
|
||||||
|
the Makefile, set:
|
||||||
|
|
||||||
|
DEBUG= -g
|
||||||
|
|
||||||
|
* The sparcv9 support for 64 bit Solaris under gcc-2.96 is able
|
||||||
|
to compile calc, but calc dumps core very early on in startup.
|
||||||
|
It is said that sparcv9 support in gcc-2.96 is very unofficial.
|
||||||
|
There is no work-a-round for this compiler problem.
|
||||||
|
@@ -21,7 +21,7 @@ Installing calc in 4 easy steps:
|
|||||||
|
|
||||||
The CALCBINDINGS is matter of personal taste. As shipped
|
The CALCBINDINGS is matter of personal taste. As shipped
|
||||||
the Makefile assumes a default quasi-emacs-like command
|
the Makefile assumes a default quasi-emacs-like command
|
||||||
line editor. Changing CALCBINDINGS= altbind will cause ^D
|
line editor. Changing CALCBINDINGS= altbind will cause ^D
|
||||||
to end calc in a fashion similar to that of the bc(1) command.
|
to end calc in a fashion similar to that of the bc(1) command.
|
||||||
|
|
||||||
Set TOPDIR to be the place under which help files, calc,
|
Set TOPDIR to be the place under which help files, calc,
|
||||||
|
34
LIBRARY
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.
|
zmath.h, and cmath.h automatically includes qmath.h.
|
||||||
|
|
||||||
The prototypes for the available routines are listed in the above include
|
The prototypes for the available routines are listed in the above include
|
||||||
files. Some of these routines are meant for internal use, and so aren't
|
files. Some of these routines are meant for internal use, and so aren't
|
||||||
convenient for outside use. So you should read the source for a routine
|
convenient for outside use. So you should read the source for a routine
|
||||||
to see if it really does what you think it does. I won't guarantee that
|
to see if it really does what you think it does. I won't guarantee that
|
||||||
obscure internal routines won't change or disappear in future releases!
|
obscure internal routines won't change or disappear in future releases!
|
||||||
@@ -60,7 +60,7 @@ External programs may want to compile with:
|
|||||||
ERROR HANDLING
|
ERROR HANDLING
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Your program MUST provide a function called math_error. This is called by
|
Your program MUST provide a function called math_error. This is called by
|
||||||
the math routines on an error condition, such as malloc failures or a
|
the math routines on an error condition, such as malloc failures or a
|
||||||
division by zero. The routine is called in the manner of printf, with a
|
division by zero. The routine is called in the manner of printf, with a
|
||||||
format string and optional arguments. (However, none of the low level math
|
format string and optional arguments. (However, none of the low level math
|
||||||
@@ -142,7 +142,7 @@ output strings with space filling, output formatted strings like printf, and
|
|||||||
flush the output. Output from these routines is diverted as described above.
|
flush the output. Output from these routines is diverted as described above.
|
||||||
|
|
||||||
You can change the default output mode by calling math_setmode, and you can
|
You can change the default output mode by calling math_setmode, and you can
|
||||||
change the default number of digits printed by calling math_setdigits. These
|
change the default number of digits printed by calling math_setdigits. These
|
||||||
routines return the previous values. The possible modes are described in
|
routines return the previous values. The possible modes are described in
|
||||||
zmath.h.
|
zmath.h.
|
||||||
|
|
||||||
@@ -154,7 +154,7 @@ The arbitrary precision integer routines define a structure called a ZVALUE.
|
|||||||
This is defined in zmath.h. A ZVALUE contains a pointer to an array of
|
This is defined in zmath.h. A ZVALUE contains a pointer to an array of
|
||||||
integers, the length of the array, and a sign flag. The array is allocated
|
integers, the length of the array, and a sign flag. The array is allocated
|
||||||
using malloc, so you need to free this array when you are done with a
|
using malloc, so you need to free this array when you are done with a
|
||||||
ZVALUE. To do this, you should call zfree with the ZVALUE as an argument
|
ZVALUE. To do this, you should call zfree with the ZVALUE as an argument
|
||||||
(or call freeh with the pointer as an argument) and never try to free the
|
(or call freeh with the pointer as an argument) and never try to free the
|
||||||
array yourself using free. The reason for this is that sometimes the pointer
|
array yourself using free. The reason for this is that sometimes the pointer
|
||||||
points to one of two statically allocated arrays which should NOT be freed.
|
points to one of two statically allocated arrays which should NOT be freed.
|
||||||
@@ -248,7 +248,7 @@ If the value is too large for ztofull(), ztoulong() or ztolong(), only
|
|||||||
the low order bits converted.
|
the low order bits converted.
|
||||||
|
|
||||||
There are two types of comparisons you can make on ZVALUEs. This is whether
|
There are two types of comparisons you can make on ZVALUEs. This is whether
|
||||||
or not they are equal, or the ordering on size of the numbers. The zcmp
|
or not they are equal, or the ordering on size of the numbers. The zcmp
|
||||||
function tests whether two ZVALUEs are equal, returning TRUE if they differ.
|
function tests whether two ZVALUEs are equal, returning TRUE if they differ.
|
||||||
The zrel function tests the relative sizes of two ZVALUEs, returning -1 if
|
The zrel function tests the relative sizes of two ZVALUEs, returning -1 if
|
||||||
the first one is smaller, 0 if they are the same, and 1 if the first one
|
the first one is smaller, 0 if they are the same, and 1 if the first one
|
||||||
@@ -267,7 +267,7 @@ is always positive. If the NUMBER is an integer, the denominator has the
|
|||||||
value 1.
|
value 1.
|
||||||
|
|
||||||
Unlike ZVALUEs, NUMBERs are passed using pointers, and pointers to them are
|
Unlike ZVALUEs, NUMBERs are passed using pointers, and pointers to them are
|
||||||
returned by functions. So the basic type for using fractions is not really
|
returned by functions. So the basic type for using fractions is not really
|
||||||
(NUMBER), but is (NUMBER *). NUMBERs are allocated using the qalloc routine.
|
(NUMBER), but is (NUMBER *). NUMBERs are allocated using the qalloc routine.
|
||||||
This returns a pointer to a number which has the value 1. Because of the
|
This returns a pointer to a number which has the value 1. Because of the
|
||||||
special property of a ZVALUE of 1, the numerator and denominator of this
|
special property of a ZVALUE of 1, the numerator and denominator of this
|
||||||
@@ -283,7 +283,7 @@ A better way to create NUMBERs with particular values is to use the itoq,
|
|||||||
iitoq, or atoq functions. Using itoq makes a long value into a NUMBER,
|
iitoq, or atoq functions. Using itoq makes a long value into a NUMBER,
|
||||||
using iitoq makes a pair of longs into the numerator and denominator of a
|
using iitoq makes a pair of longs into the numerator and denominator of a
|
||||||
NUMBER (reducing them first if needed), and atoq converts a string representing
|
NUMBER (reducing them first if needed), and atoq converts a string representing
|
||||||
a number into the corresponding NUMBER. The atoq function accepts input in
|
a number into the corresponding NUMBER. The atoq function accepts input in
|
||||||
integral, fractional, real, or exponential formats. Examples of allocating
|
integral, fractional, real, or exponential formats. Examples of allocating
|
||||||
numbers are:
|
numbers are:
|
||||||
|
|
||||||
@@ -294,7 +294,7 @@ numbers are:
|
|||||||
q3 = atoq("456.78");
|
q3 = atoq("456.78");
|
||||||
|
|
||||||
Also unlike ZVALUEs, NUMBERs are quickly copied. This is because they contain
|
Also unlike ZVALUEs, NUMBERs are quickly copied. This is because they contain
|
||||||
a link count, which is the number of pointers there are to the NUMBER. The
|
a link count, which is the number of pointers there are to the NUMBER. The
|
||||||
qlink macro is used to copy a pointer to a NUMBER, and simply increments
|
qlink macro is used to copy a pointer to a NUMBER, and simply increments
|
||||||
the link count and returns the same pointer. Since it is a macro, the
|
the link count and returns the same pointer. Since it is a macro, the
|
||||||
argument should not be a function call, but a real pointer variable. The
|
argument should not be a function call, but a real pointer variable. The
|
||||||
@@ -329,11 +329,11 @@ denominator, qint to return the integer part of, qfrac to return the
|
|||||||
fractional part of, and qinv to invert a fraction.
|
fractional part of, and qinv to invert a fraction.
|
||||||
|
|
||||||
There are some transcendental functions in the library, such as sin and cos.
|
There are some transcendental functions in the library, such as sin and cos.
|
||||||
These cannot be evaluated exactly as fractions. Therefore, they accept
|
These cannot be evaluated exactly as fractions. Therefore, they accept
|
||||||
another argument which tells how accurate you want the result. This is an
|
another argument which tells how accurate you want the result. This is an
|
||||||
"epsilon" value, and the returned value will be within that quantity of
|
"epsilon" value, and the returned value will be within that quantity of
|
||||||
the correct value. This is usually an absolute difference, but for some
|
the correct value. This is usually an absolute difference, but for some
|
||||||
functions (such as exp), this is a relative difference. For example, to
|
functions (such as exp), this is a relative difference. For example, to
|
||||||
calculate sin(0.5) to 100 decimal places, you could do:
|
calculate sin(0.5) to 100 decimal places, you could do:
|
||||||
|
|
||||||
NUMBER *q, *ans, *epsilon;
|
NUMBER *q, *ans, *epsilon;
|
||||||
@@ -363,7 +363,7 @@ macros are:
|
|||||||
The comparisons for NUMBERs are similar to the ones for ZVALUEs. You use the
|
The comparisons for NUMBERs are similar to the ones for ZVALUEs. You use the
|
||||||
qcmp and qrel functions.
|
qcmp and qrel functions.
|
||||||
|
|
||||||
There are four predefined values for fractions. You should qlink them when
|
There are four predefined values for fractions. You should qlink them when
|
||||||
you want to use them. These are _qzero_, _qone_, _qnegone_, and _qonehalf_.
|
you want to use them. These are _qzero_, _qone_, _qnegone_, and _qonehalf_.
|
||||||
These have the values 0, 1, -1, and 1/2. An example of using them is:
|
These have the values 0, 1, -1, and 1/2. An example of using them is:
|
||||||
|
|
||||||
@@ -377,7 +377,7 @@ USING COMPLEX NUMBERS
|
|||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
The arbitrary precision complex arithmetic routines define a structure
|
The arbitrary precision complex arithmetic routines define a structure
|
||||||
called COMPLEX. This is defined in cmath.h. This contains two NUMBERs
|
called COMPLEX. This is defined in cmath.h. This contains two NUMBERs
|
||||||
for the real and imaginary parts of a complex number, and a count of the
|
for the real and imaginary parts of a complex number, and a count of the
|
||||||
number of links there are to this COMPLEX number.
|
number of links there are to this COMPLEX number.
|
||||||
|
|
||||||
@@ -410,7 +410,7 @@ There is no direct routine to convert a string value into a COMPLEX value.
|
|||||||
But you can do this yourself by converting two strings into two NUMBERS,
|
But you can do this yourself by converting two strings into two NUMBERS,
|
||||||
and then using the qqtoc routine.
|
and then using the qqtoc routine.
|
||||||
|
|
||||||
COMPLEX values are always returned from these routines. To split out the
|
COMPLEX values are always returned from these routines. To split out the
|
||||||
real and imaginary parts into normal NUMBERs, you can simply qlink the
|
real and imaginary parts into normal NUMBERs, you can simply qlink the
|
||||||
two components, as shown in the following example:
|
two components, as shown in the following example:
|
||||||
|
|
||||||
@@ -423,7 +423,7 @@ two components, as shown in the following example:
|
|||||||
|
|
||||||
There are many macros for checking quick things about complex numbers,
|
There are many macros for checking quick things about complex numbers,
|
||||||
similar to the ZVALUE and NUMBER macros. In addition, there are some
|
similar to the ZVALUE and NUMBER macros. In addition, there are some
|
||||||
only used for complex numbers. Examples of macros are:
|
only used for complex numbers. Examples of macros are:
|
||||||
|
|
||||||
cisreal(c) (number is real)
|
cisreal(c) (number is real)
|
||||||
cisimag(c) (number is pure imaginary)
|
cisimag(c) (number is pure imaginary)
|
||||||
@@ -441,8 +441,8 @@ only used for complex numbers. Examples of macros are:
|
|||||||
There is only one comparison you can make for COMPLEX values, and that is
|
There is only one comparison you can make for COMPLEX values, and that is
|
||||||
for equality. The ccmp function returns TRUE if two complex numbers differ.
|
for equality. The ccmp function returns TRUE if two complex numbers differ.
|
||||||
|
|
||||||
There are three predefined values for complex numbers. You should clink
|
There are three predefined values for complex numbers. You should clink
|
||||||
them when you want to use them. They are _czero_, _cone_, and _conei_.
|
them when you want to use them. They are _czero_, _cone_, and _conei_.
|
||||||
These have the values 0, 1, and i.
|
These have the values 0, 1, and i.
|
||||||
|
|
||||||
----------------
|
----------------
|
||||||
|
25
README
25
README
@@ -4,7 +4,7 @@ See the HOWTO.INSTALL file for information on how to build and install calc.
|
|||||||
|
|
||||||
To be sure that your version of calc is up to date, check out:
|
To be sure that your version of calc is up to date, check out:
|
||||||
|
|
||||||
http://reality.sgi.com/chongo/calc/calc-download.html
|
http://reality.sgi.com/chongo/tech/comp/calc/calc-download.html
|
||||||
|
|
||||||
We are interested in any/all feedback on recent versions of calc.
|
We are interested in any/all feedback on recent versions of calc.
|
||||||
In particular we would like to hear about:
|
In particular we would like to hear about:
|
||||||
@@ -27,7 +27,7 @@ If you run into problems, see the BUGS file.
|
|||||||
Calc is distributed with an extensive collection of help files that
|
Calc is distributed with an extensive collection of help files that
|
||||||
are accessible from the command line. The following assume that you
|
are accessible from the command line. The following assume that you
|
||||||
are running calc from the distribution directory or that you have
|
are running calc from the distribution directory or that you have
|
||||||
installed calc. In these examples, the ">" is the calc prompt, not
|
installed calc. In these examples, the ">" is the calc prompt, not
|
||||||
something that you type in.
|
something that you type in.
|
||||||
|
|
||||||
For list of help topics:
|
For list of help topics:
|
||||||
@@ -42,6 +42,7 @@ For overview of calc overview:
|
|||||||
> help define
|
> help define
|
||||||
> help statement
|
> help statement
|
||||||
> help variable
|
> help variable
|
||||||
|
> help usage
|
||||||
|
|
||||||
For list of builtin functions:
|
For list of builtin functions:
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@ C programmers should note some unexpected differences in the calc syntax:
|
|||||||
|
|
||||||
> help unexpected
|
> help unexpected
|
||||||
|
|
||||||
Calc is shipped with a library of calc scripts. For a list see:
|
Calc is shipped with a library of calc scripts. For a list see:
|
||||||
|
|
||||||
> help stdlib
|
> help stdlib
|
||||||
|
|
||||||
@@ -60,10 +61,12 @@ Calc is shipped with a library of calc scripts. For a list see:
|
|||||||
See the file:
|
See the file:
|
||||||
|
|
||||||
help/todo
|
help/todo
|
||||||
|
help/wishlist
|
||||||
|
|
||||||
or run:
|
or run:
|
||||||
|
|
||||||
calc 'help todo'
|
calc help todo
|
||||||
|
calc help wishlist
|
||||||
|
|
||||||
for a wish/todo list. Code contributions are welcome.
|
for a wish/todo list. Code contributions are welcome.
|
||||||
|
|
||||||
@@ -71,7 +74,9 @@ for a wish/todo list. Code contributions are welcome.
|
|||||||
|
|
||||||
To join the calc-tester mailing list. Send a request to:
|
To join the calc-tester mailing list. Send a request to:
|
||||||
|
|
||||||
calc-tester-request@postofc.corp.sgi.com
|
calc-tester-request at postofc dot corp dot sgi dot com
|
||||||
|
|
||||||
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
|
||||||
Your message body (not the subject) should consist of:
|
Your message body (not the subject) should consist of:
|
||||||
|
|
||||||
@@ -82,6 +87,14 @@ Your message body (not the subject) should consist of:
|
|||||||
where ``address'' is your EMail address and ``your_full_name'' is
|
where ``address'' is your EMail address and ``your_full_name'' is
|
||||||
your full name.
|
your full name.
|
||||||
|
|
||||||
|
Calc bug reports, however should be sent to:
|
||||||
|
|
||||||
|
calc-bugs at postofc dot corp dot sgi dot com
|
||||||
|
|
||||||
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
|
||||||
|
but see the BUGS file first.
|
||||||
|
|
||||||
The calc web site is located at:
|
The calc web site is located at:
|
||||||
|
|
||||||
http://reality.sgi.com/chongo/calc
|
http://reality.sgi.com/chongo/tech/comp/calc/
|
||||||
|
73
README.OLD
73
README.OLD
@@ -1,73 +0,0 @@
|
|||||||
# Copyright (c) 1997 David I. Bell
|
|
||||||
# Permission is granted to use, distribute, or modify this source,
|
|
||||||
# provided that this copyright notice remains intact.
|
|
||||||
#
|
|
||||||
# Arbitrary precision calculator.
|
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
NOTE: This is an old historic README. We recommend that
|
|
||||||
you read README and HOWTO.INSTALL for more info.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
I am allowing this calculator to be freely distributed for your enjoyment.
|
|
||||||
Like all multi-precision programs, you should not depend absolutely on
|
|
||||||
its results, since bugs in such programs can be insidious and only rarely
|
|
||||||
show up.
|
|
||||||
|
|
||||||
-dbell-
|
|
||||||
|
|
||||||
p.s. By Landon Curt Noll:
|
|
||||||
|
|
||||||
Building calc in 3 easy steps:
|
|
||||||
|
|
||||||
1) Look at the makefile, and adjust it to suit your needs.
|
|
||||||
|
|
||||||
Here are some Makefile hints:
|
|
||||||
|
|
||||||
In the past, some people have had to adjust the VARARG or
|
|
||||||
TERMCONTROL because the Makefile cannot always guess
|
|
||||||
correctly for certain systems. You may need to play with
|
|
||||||
these values if you experience problems.
|
|
||||||
|
|
||||||
The default compiler used is 'cc'. The default compiler flag
|
|
||||||
is '-O'. If you have gcc, or gcc v2 (or better) you should use
|
|
||||||
that instead. Some compilers allow for optimization beyond
|
|
||||||
just -O (gcc v2 has -O2, mips cc has -O3). You should select
|
|
||||||
the best flag for speed optimization. Calc can be cpu intensive
|
|
||||||
so selecting a quality compiler and good optimization level can
|
|
||||||
really pay off.
|
|
||||||
|
|
||||||
2) build calc:
|
|
||||||
|
|
||||||
make all
|
|
||||||
|
|
||||||
3) test calc:
|
|
||||||
|
|
||||||
make check
|
|
||||||
|
|
||||||
==>>>If you run into problems, follow the instructions in the BUGS file<<<==
|
|
||||||
|
|
||||||
=-=
|
|
||||||
|
|
||||||
For further reading:
|
|
||||||
|
|
||||||
LIBRARY
|
|
||||||
explains how programs can use libcalc.a to take advantage
|
|
||||||
of the calc multi-precision routines.
|
|
||||||
|
|
||||||
help/todo
|
|
||||||
current wish list for calc
|
|
||||||
|
|
||||||
CHANGES
|
|
||||||
recent changes to calc
|
|
||||||
|
|
||||||
BUGS
|
|
||||||
known bugs, mis-features and how to report problems
|
|
||||||
|
|
||||||
help/full
|
|
||||||
full set of calc documentation
|
|
||||||
|
|
||||||
=-=
|
|
||||||
|
|
||||||
David I. Bell dbell@auug.org.au
|
|
||||||
chongo <Landon Curt Noll> /\../\
|
|
38
addop.c
38
addop.c
@@ -16,8 +16,8 @@
|
|||||||
#include "symbol.h"
|
#include "symbol.h"
|
||||||
|
|
||||||
|
|
||||||
#define FUNCALLOCSIZE 20 /* reallocate size for functions */
|
#define FUNCALLOCSIZE 20 /* reallocate size for functions */
|
||||||
#define OPCODEALLOCSIZE 100 /* reallocate size for opcodes in functions */
|
#define OPCODEALLOCSIZE 100 /* reallocate size for opcodes in functions */
|
||||||
|
|
||||||
|
|
||||||
static long maxopcodes; /* number of opcodes available */
|
static long maxopcodes; /* number of opcodes available */
|
||||||
@@ -114,6 +114,7 @@ beginfunc(char *name, BOOL newflag)
|
|||||||
fp->f_localcount = 0;
|
fp->f_localcount = 0;
|
||||||
fp->f_opcodecount = 0;
|
fp->f_opcodecount = 0;
|
||||||
fp->f_savedvalue.v_type = V_NULL;
|
fp->f_savedvalue.v_type = V_NULL;
|
||||||
|
fp->f_savedvalue.v_subtype = V_NOSUBTYPE;
|
||||||
fp->f_name = namestr(&funcnames, newindex);
|
fp->f_name = namestr(&funcnames, newindex);
|
||||||
curfunc = fp;
|
curfunc = fp;
|
||||||
initlocals();
|
initlocals();
|
||||||
@@ -164,10 +165,10 @@ endfunc(void)
|
|||||||
size += dumpop(&fp->f_opcodes[size]);
|
size += dumpop(&fp->f_opcodes[size]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((inputisterminal() && conf->lib_debug & 1) ||
|
if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) ||
|
||||||
(!inputisterminal() && conf->lib_debug & 2)) {
|
(!inputisterminal() && conf->lib_debug & LIBDBG_FILE_FUNC)) {
|
||||||
printf("%s(", fp->f_name);
|
printf("%s(", fp->f_name);
|
||||||
for (index = 0; index < fp->f_paramcount; index++) {
|
for (index = 0; index < fp->f_paramcount; index++) {
|
||||||
if (index)
|
if (index)
|
||||||
putchar(',');
|
putchar(',');
|
||||||
printf("%s", paramname(index));
|
printf("%s", paramname(index));
|
||||||
@@ -238,8 +239,8 @@ rmuserfunc(char *name)
|
|||||||
return;
|
return;
|
||||||
freenumbers(functions[index]);
|
freenumbers(functions[index]);
|
||||||
free(functions[index]);
|
free(functions[index]);
|
||||||
if ((inputisterminal() && conf->lib_debug & 1) ||
|
if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) ||
|
||||||
(!inputisterminal() && conf->lib_debug & 2))
|
(!inputisterminal() && conf->lib_debug & LIBDBG_FILE_FUNC))
|
||||||
printf("%s() undefined\n", name);
|
printf("%s() undefined\n", name);
|
||||||
functions[index] = NULL;
|
functions[index] = NULL;
|
||||||
}
|
}
|
||||||
@@ -290,12 +291,12 @@ rmalluserfunc(void)
|
|||||||
long
|
long
|
||||||
getuserfunc(char *name)
|
getuserfunc(char *name)
|
||||||
{
|
{
|
||||||
long index;
|
long index;
|
||||||
|
|
||||||
index = findstr(&funcnames, name);
|
index = findstr(&funcnames, name);
|
||||||
if (index >= 0 && functions[index] != NULL)
|
if (index >= 0 && functions[index] != NULL)
|
||||||
return index;
|
return index;
|
||||||
return -1L;
|
return -1L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -449,6 +450,11 @@ addop(long op)
|
|||||||
case OP_GLOBALADDR:
|
case OP_GLOBALADDR:
|
||||||
diff = 1 + PTR_SIZE;
|
diff = 1 + PTR_SIZE;
|
||||||
break;
|
break;
|
||||||
|
case OP_UNDEF:
|
||||||
|
fp->f_opcodecount -= 1;
|
||||||
|
oldop = OP_NOP;
|
||||||
|
oldoldop = OP_NOP;
|
||||||
|
return;
|
||||||
default:
|
default:
|
||||||
cut = FALSE;
|
cut = FALSE;
|
||||||
}
|
}
|
||||||
@@ -456,7 +462,8 @@ addop(long op)
|
|||||||
fp->f_opcodecount -= diff;
|
fp->f_opcodecount -= diff;
|
||||||
oldop = OP_NOP;
|
oldop = OP_NOP;
|
||||||
oldoldop = OP_NOP;
|
oldoldop = OP_NOP;
|
||||||
fprintf(stderr, "%ld: unused value ignored\n",
|
fprintf(stderr,
|
||||||
|
"Line %ld: unused value ignored\n",
|
||||||
linenumber());
|
linenumber());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -529,8 +536,7 @@ addop(long op)
|
|||||||
qfree(q);
|
qfree(q);
|
||||||
fp->f_opcodes[count - 2] = OP_ZERO;
|
fp->f_opcodes[count - 2] = OP_ZERO;
|
||||||
fp->f_opcodecount--;
|
fp->f_opcodecount--;
|
||||||
}
|
} else if (qisone(q)) {
|
||||||
else if (qisone(q)) {
|
|
||||||
qfree(q);
|
qfree(q);
|
||||||
fp->f_opcodes[count - 2] = OP_ONE;
|
fp->f_opcodes[count - 2] = OP_ONE;
|
||||||
fp->f_opcodecount--;
|
fp->f_opcodecount--;
|
||||||
@@ -633,5 +639,3 @@ addoplabel(long op, LABEL *label)
|
|||||||
addop(op);
|
addop(op);
|
||||||
uselabel(label);
|
uselabel(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* END CODE */
|
|
||||||
|
15
align32.c
15
align32.c
@@ -3,17 +3,20 @@
|
|||||||
*
|
*
|
||||||
* This file was written by:
|
* This file was written by:
|
||||||
*
|
*
|
||||||
* Landon Curt Noll (chongo@toad.com) chongo <was here> /\../\
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
|
*
|
||||||
|
* chongo <was here> /\../\
|
||||||
*
|
*
|
||||||
* This code has been placed in the public domain. Please do not
|
* This code has been placed in the public domain. Please do not
|
||||||
* copyright this code.
|
* copyright this code.
|
||||||
*
|
*
|
||||||
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||||
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER-
|
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER-
|
||||||
* CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT
|
* CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT
|
||||||
* NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
* NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
@@ -67,7 +70,7 @@ main(void)
|
|||||||
* buserr - catch an alignment error
|
* buserr - catch an alignment error
|
||||||
*
|
*
|
||||||
* given:
|
* given:
|
||||||
* arg to keep ANSI C happy
|
* arg to keep ANSI C happy
|
||||||
*/
|
*/
|
||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
static void
|
static void
|
||||||
|
23
assocfunc.c
23
assocfunc.c
@@ -14,10 +14,10 @@
|
|||||||
#include "value.h"
|
#include "value.h"
|
||||||
|
|
||||||
|
|
||||||
#define MINHASHSIZE 31 /* minimum size of hash tables */
|
#define MINHASHSIZE 31 /* minimum size of hash tables */
|
||||||
#define GROWHASHSIZE 50 /* approximate growth for hash tables */
|
#define GROWHASHSIZE 50 /* approximate growth for hash tables */
|
||||||
#define CHAINLENGTH 10 /* desired number of elements on a hash chain */
|
#define CHAINLENGTH 10 /* desired number of elements on a hash chain */
|
||||||
#define ELEMSIZE(n) (sizeof(ASSOCELEM) + (sizeof(VALUE) * ((n) - 1)))
|
#define ELEMSIZE(n) (sizeof(ASSOCELEM) + (sizeof(VALUE) * ((n) - 1)))
|
||||||
|
|
||||||
|
|
||||||
static ASSOCELEM *elemindex(ASSOC *ap, long index);
|
static ASSOCELEM *elemindex(ASSOC *ap, long index);
|
||||||
@@ -57,7 +57,7 @@ associndex(ASSOC *ap, BOOL create, long dim, VALUE *indices)
|
|||||||
* so that we can first select the correct hash chain, and
|
* so that we can first select the correct hash chain, and
|
||||||
* also so we can quickly compare each element for a match.
|
* also so we can quickly compare each element for a match.
|
||||||
*/
|
*/
|
||||||
hash = (QCKHASH)0;
|
hash = FNV1_32_BASIS;
|
||||||
for (i = 0; i < dim; i++)
|
for (i = 0; i < dim; i++)
|
||||||
hash = hashvalue(&indices[i], hash);
|
hash = hashvalue(&indices[i], hash);
|
||||||
|
|
||||||
@@ -80,6 +80,7 @@ associndex(ASSOC *ap, BOOL create, long dim, VALUE *indices)
|
|||||||
*/
|
*/
|
||||||
if (!create) {
|
if (!create) {
|
||||||
val.v_type = V_NULL;
|
val.v_type = V_NULL;
|
||||||
|
val.v_subtype = V_NOSUBTYPE;
|
||||||
return &val;
|
return &val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,8 +245,7 @@ assoccmp(ASSOC *ap1, ASSOC *ap2)
|
|||||||
hash = ep1->e_hash;
|
hash = ep1->e_hash;
|
||||||
dim = ep1->e_dim;
|
dim = ep1->e_dim;
|
||||||
for (ep2 = ap2->a_table[hash % size2]; ;
|
for (ep2 = ap2->a_table[hash % size2]; ;
|
||||||
ep2 = ep2->e_next)
|
ep2 = ep2->e_next) {
|
||||||
{
|
|
||||||
if (ep2 == NULL)
|
if (ep2 == NULL)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
if (ep2->e_hash != hash)
|
if (ep2->e_hash != hash)
|
||||||
@@ -282,8 +282,7 @@ assoccopy(ASSOC *oldap)
|
|||||||
|
|
||||||
for (oldhi = 0; oldhi < oldap->a_size; oldhi++) {
|
for (oldhi = 0; oldhi < oldap->a_size; oldhi++) {
|
||||||
for (oldep = oldap->a_table[oldhi]; oldep;
|
for (oldep = oldap->a_table[oldhi]; oldep;
|
||||||
oldep = oldep->e_next)
|
oldep = oldep->e_next) {
|
||||||
{
|
|
||||||
ep = (ASSOCELEM *) malloc(ELEMSIZE(oldep->e_dim));
|
ep = (ASSOCELEM *) malloc(ELEMSIZE(oldep->e_dim));
|
||||||
if (ep == NULL) {
|
if (ep == NULL) {
|
||||||
math_error("Cannot allocate association element");
|
math_error("Cannot allocate association element");
|
||||||
@@ -292,6 +291,7 @@ assoccopy(ASSOC *oldap)
|
|||||||
ep->e_dim = oldep->e_dim;
|
ep->e_dim = oldep->e_dim;
|
||||||
ep->e_hash = oldep->e_hash;
|
ep->e_hash = oldep->e_hash;
|
||||||
ep->e_value.v_type = V_NULL;
|
ep->e_value.v_type = V_NULL;
|
||||||
|
ep->e_value.v_subtype = V_NOSUBTYPE;
|
||||||
for (i = 0; i < ep->e_dim; i++)
|
for (i = 0; i < ep->e_dim; i++)
|
||||||
copyvalue(&oldep->e_indices[i], &ep->e_indices[i]);
|
copyvalue(&oldep->e_indices[i], &ep->e_indices[i]);
|
||||||
copyvalue(&oldep->e_value, &ep->e_value);
|
copyvalue(&oldep->e_value, &ep->e_value);
|
||||||
@@ -447,8 +447,7 @@ assocprint(ASSOC *ap, long max_print)
|
|||||||
((ap->a_count == 1) ? "" : "s"));
|
((ap->a_count == 1) ? "" : "s"));
|
||||||
|
|
||||||
for (index = 0; ((index < max_print) && (index < ap->a_count));
|
for (index = 0; ((index < max_print) && (index < ap->a_count));
|
||||||
index++)
|
index++) {
|
||||||
{
|
|
||||||
ep = elemindex(ap, index);
|
ep = elemindex(ap, index);
|
||||||
if (ep == NULL)
|
if (ep == NULL)
|
||||||
continue;
|
continue;
|
||||||
@@ -489,5 +488,3 @@ compareindices(VALUE *v1, VALUE *v2, long dim)
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* END CODE */
|
|
||||||
|
19
blkcpy.c
19
blkcpy.c
@@ -4,7 +4,7 @@
|
|||||||
* provided that this copyright notice remains intact.
|
* provided that this copyright notice remains intact.
|
||||||
*
|
*
|
||||||
* By: Ernest Bowen and Landon Curt Noll
|
* By: Ernest Bowen and Landon Curt Noll
|
||||||
* ernie@neumann.une.edu.au and chongo@toad.com
|
* ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -330,6 +330,7 @@ copyblk2mat(BLOCK *blk, long ssi, long num, MATRIX *dmat, long dsi)
|
|||||||
i = num;
|
i = num;
|
||||||
while (i-- > 0) {
|
while (i-- > 0) {
|
||||||
vp->v_type = V_NUM;
|
vp->v_type = V_NUM;
|
||||||
|
vp->v_subtype = V_NOSUBTYPE;
|
||||||
vp->v_num = itoq((long) *op++);
|
vp->v_num = itoq((long) *op++);
|
||||||
vp++;
|
vp++;
|
||||||
}
|
}
|
||||||
@@ -546,7 +547,7 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
|
|||||||
int
|
int
|
||||||
copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
|
copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
|
||||||
{
|
{
|
||||||
FILEIO *fiop;
|
FILEIO *fiop;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
unsigned int numw;
|
unsigned int numw;
|
||||||
|
|
||||||
@@ -562,7 +563,7 @@ copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
|
|||||||
return E_COPYF1;
|
return E_COPYF1;
|
||||||
fp = fiop->fp;
|
fp = fiop->fp;
|
||||||
if (id == 1 || id == 2) {
|
if (id == 1 || id == 2) {
|
||||||
numw = idfputstr(id, (char *)sblk->data + ssi); /* XXX */
|
numw = idfputstr(id, (char *)sblk->data + ssi); /* XXX */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (dsi >= 0) {
|
if (dsi >= 0) {
|
||||||
@@ -583,7 +584,7 @@ copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
|
|||||||
int
|
int
|
||||||
copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
|
copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
|
||||||
{
|
{
|
||||||
FILEIO *fiop;
|
FILEIO *fiop;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
unsigned int numw;
|
unsigned int numw;
|
||||||
ZVALUE fsize;
|
ZVALUE fsize;
|
||||||
@@ -671,7 +672,7 @@ copystr2file(STRING *str, long ssi, long num, FILEID id, long dsi)
|
|||||||
return E_COPYF1;
|
return E_COPYF1;
|
||||||
fp = fiop->fp;
|
fp = fiop->fp;
|
||||||
if (id == 1 || id == 2) {
|
if (id == 1 || id == 2) {
|
||||||
numw = idfputstr(id, str->s_str + ssi); /* XXX */
|
numw = idfputstr(id, str->s_str + ssi); /* XXX */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (dsi >= 0) {
|
if (dsi >= 0) {
|
||||||
@@ -829,7 +830,7 @@ int
|
|||||||
copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi)
|
copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi)
|
||||||
{
|
{
|
||||||
long len;
|
long len;
|
||||||
char *c, *c1;
|
char *c, *c1;
|
||||||
|
|
||||||
len = (long)strlen(sstr);
|
len = (long)strlen(sstr);
|
||||||
|
|
||||||
@@ -897,8 +898,8 @@ copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
|
|||||||
* Copying between objects that overlap will take place correctly.
|
* Copying between objects that overlap will take place correctly.
|
||||||
*
|
*
|
||||||
* given:
|
* given:
|
||||||
* s1 destination
|
* s1 destination
|
||||||
* s2 source
|
* s2 source
|
||||||
* n octet count
|
* n octet count
|
||||||
*
|
*
|
||||||
* returns:
|
* returns:
|
||||||
@@ -958,7 +959,7 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
|
|||||||
long newsize;
|
long newsize;
|
||||||
USB8 *newdata;
|
USB8 *newdata;
|
||||||
#if CALC_BYTE_ORDER == BIG_ENDIAN
|
#if CALC_BYTE_ORDER == BIG_ENDIAN
|
||||||
ZVALUE *swnum; /* byte swapped numerator */
|
ZVALUE *swnum; /* byte swapped numerator */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ssi > snum->num.len)
|
if (ssi > snum->num.len)
|
||||||
|
2
blkcpy.h
2
blkcpy.h
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#if !defined(__BLKCPY_H__)
|
#if !defined(__BLKCPY_H__)
|
||||||
#define __BLKCPY_H__
|
#define __BLKCPY_H__
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the main copy gateway function
|
* the main copy gateway function
|
||||||
|
55
block.c
55
block.c
@@ -23,16 +23,14 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -106,7 +104,7 @@ blkalloc(int len, int chunk)
|
|||||||
/*
|
/*
|
||||||
* return BLOCK
|
* return BLOCK
|
||||||
*/
|
*/
|
||||||
if (conf->calc_debug > 0) {
|
if (conf->calc_debug & CALCDBG_BLOCK) {
|
||||||
blkchk(nblk);
|
blkchk(nblk);
|
||||||
}
|
}
|
||||||
return nblk;
|
return nblk;
|
||||||
@@ -143,17 +141,15 @@ blk_free(BLOCK *blk)
|
|||||||
/*
|
/*
|
||||||
* blkchk - check the sanity of a block
|
* blkchk - check the sanity of a block
|
||||||
*
|
*
|
||||||
* These checks should never fail if calc is working correctly. During
|
* These checks should never fail if calc is working correctly. During
|
||||||
* debug time, we plan to call this function often. Once we are satisfied,
|
* debug time, we plan to call this function often. Once we are satisfied,
|
||||||
* we will normally call this code only in a few places.
|
* we will normally call this code only in a few places.
|
||||||
*
|
*
|
||||||
* This function is normally called whenever the following builtins are called:
|
* If "calc_debug" has the bit corresponding to CALCDBG_BLOCK set, this
|
||||||
|
* function is called during execution of the following builtins:
|
||||||
*
|
*
|
||||||
* alloc(), realloc(), free()
|
* alloc(), realloc(), free()
|
||||||
*
|
*
|
||||||
* unless the "calc_debug" is set to -1. If "calc_debug" is > 0, then
|
|
||||||
* most blk builtins will call this function.
|
|
||||||
*
|
|
||||||
* given:
|
* given:
|
||||||
* blk - the BLOCK to check
|
* blk - the BLOCK to check
|
||||||
*
|
*
|
||||||
@@ -168,7 +164,7 @@ blkchk(BLOCK *blk)
|
|||||||
/*
|
/*
|
||||||
* firewall - general sanity check
|
* firewall - general sanity check
|
||||||
*/
|
*/
|
||||||
if (conf->calc_debug == -1) {
|
if ((conf->calc_debug & CALCDBG_BLOCK) == 0) {
|
||||||
/* do nothing when debugging is disabled */
|
/* do nothing when debugging is disabled */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -209,13 +205,13 @@ blkchk(BLOCK *blk)
|
|||||||
*
|
*
|
||||||
* Reallocation of a block can change several aspects of a block.
|
* Reallocation of a block can change several aspects of a block.
|
||||||
*
|
*
|
||||||
* It can change the much data it holds or can hold.
|
* It can change the much data it holds or can hold.
|
||||||
*
|
*
|
||||||
* It can change the memory footprint (in terms of
|
* It can change the memory footprint (in terms of
|
||||||
* how much storage is malloced for current or future use).
|
* how much storage is malloced for current or future use).
|
||||||
*
|
*
|
||||||
* It can change the chunk size used to grow malloced size
|
* It can change the chunk size used to grow malloced size
|
||||||
* as the data size grows.
|
* as the data size grows.
|
||||||
*
|
*
|
||||||
* Each of the len and chunksize may be kept the same.
|
* Each of the len and chunksize may be kept the same.
|
||||||
*
|
*
|
||||||
@@ -233,7 +229,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
|
|||||||
/*
|
/*
|
||||||
* firewall
|
* firewall
|
||||||
*/
|
*/
|
||||||
if (conf->calc_debug != -1) {
|
if (conf->calc_debug & CALCDBG_BLOCK) {
|
||||||
blkchk(blk);
|
blkchk(blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,7 +288,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
|
|||||||
memset(blk->data, 0, blk->maxsize);
|
memset(blk->data, 0, blk->maxsize);
|
||||||
}
|
}
|
||||||
blk->datalen = 0;
|
blk->datalen = 0;
|
||||||
if (conf->calc_debug > 0) {
|
if (conf->calc_debug & CALCDBG_BLOCK) {
|
||||||
blkchk(blk);
|
blkchk(blk);
|
||||||
}
|
}
|
||||||
return blk;
|
return blk;
|
||||||
@@ -323,7 +319,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
|
|||||||
/*
|
/*
|
||||||
* return realloced type
|
* return realloced type
|
||||||
*/
|
*/
|
||||||
if (conf->calc_debug > 0) {
|
if (conf->calc_debug & CALCDBG_BLOCK) {
|
||||||
blkchk(blk);
|
blkchk(blk);
|
||||||
}
|
}
|
||||||
return blk;
|
return blk;
|
||||||
@@ -333,7 +329,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
|
|||||||
/*
|
/*
|
||||||
* blktrunc - truncate a BLOCK down to a minimal fixed block
|
* blktrunc - truncate a BLOCK down to a minimal fixed block
|
||||||
*
|
*
|
||||||
* NOTE: THIS IS NOT THE INTERNAL CALC FREE FUNCTION!! This
|
* NOTE: THIS IS NOT THE INTERNAL CALC FREE FUNCTION!! This
|
||||||
* is what blktrunc() builtin calls to reduce storage of a block
|
* is what blktrunc() builtin calls to reduce storage of a block
|
||||||
* down to an absolute minimum.
|
* down to an absolute minimum.
|
||||||
*
|
*
|
||||||
@@ -351,7 +347,7 @@ blktrunc(BLOCK *blk)
|
|||||||
/*
|
/*
|
||||||
* firewall
|
* firewall
|
||||||
*/
|
*/
|
||||||
if (conf->calc_debug != -1) {
|
if (conf->calc_debug & CALCDBG_BLOCK) {
|
||||||
blkchk(blk);
|
blkchk(blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,7 +368,7 @@ blktrunc(BLOCK *blk)
|
|||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
blk->data[0] = (USB8)0;
|
blk->data[0] = (USB8)0;
|
||||||
if (conf->calc_debug > 0) {
|
if (conf->calc_debug & CALCDBG_BLOCK) {
|
||||||
blkchk(blk);
|
blkchk(blk);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -483,7 +479,7 @@ blk_print(BLOCK *blk)
|
|||||||
BOOL havetail;
|
BOOL havetail;
|
||||||
USB8 *ptr;
|
USB8 *ptr;
|
||||||
|
|
||||||
/* XXX - use the config parameters for better print control */
|
/* XXX - should use the config parameters for better print control */
|
||||||
|
|
||||||
printf("chunksize = %d, maxsize = %d, datalen = %d\n\t",
|
printf("chunksize = %d, maxsize = %d, datalen = %d\n\t",
|
||||||
(int)blk->blkchunk, (int)blk->maxsize, (int)blk->datalen);
|
(int)blk->blkchunk, (int)blk->maxsize, (int)blk->datalen);
|
||||||
@@ -516,9 +512,9 @@ nblock_print(NBLOCK *nblk)
|
|||||||
printf("chunksize = %d, maxsize = %d, datalen = %d\n\t",
|
printf("chunksize = %d, maxsize = %d, datalen = %d\n\t",
|
||||||
(int)blk->blkchunk, (int)blk->maxsize, (int)blk->datalen);
|
(int)blk->blkchunk, (int)blk->maxsize, (int)blk->datalen);
|
||||||
printf("NULL");
|
printf("NULL");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
blk_print(blk);
|
blk_print(blk);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -560,8 +556,7 @@ reallocnblock(int id, int len, int chunk)
|
|||||||
math_error("Allocation failed");
|
math_error("Allocation failed");
|
||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
}
|
} else if (newsize != oldsize) {
|
||||||
else if (newsize != oldsize) {
|
|
||||||
newdata = realloc(blk->data, newsize);
|
newdata = realloc(blk->data, newsize);
|
||||||
if (newdata == NULL) {
|
if (newdata == NULL) {
|
||||||
math_error("Reallocation failed");
|
math_error("Reallocation failed");
|
||||||
@@ -723,7 +718,7 @@ findnblock(int id)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a new block with specified newlen and new chunksize and copy
|
* Create a new block with specified newlen and new chunksize and copy
|
||||||
* min(newlen, oldlen) octets to the new block. The old block is
|
* min(newlen, oldlen) octets to the new block. The old block is
|
||||||
* not changed.
|
* not changed.
|
||||||
*/
|
*/
|
||||||
BLOCK *
|
BLOCK *
|
||||||
@@ -734,7 +729,7 @@ copyrealloc(BLOCK *blk, int newlen, int newchunk)
|
|||||||
|
|
||||||
oldlen = blk->datalen;
|
oldlen = blk->datalen;
|
||||||
|
|
||||||
if (newlen < 0) /* retain length */
|
if (newlen < 0) /* retain length */
|
||||||
newlen = oldlen;
|
newlen = oldlen;
|
||||||
|
|
||||||
if (newchunk < 0) /* retain chunksize */
|
if (newchunk < 0) /* retain chunksize */
|
||||||
|
16
block.h
16
block.h
@@ -23,21 +23,19 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#if !defined(__BLOCK_H__)
|
#if !defined(__BLOCK_H__)
|
||||||
#define __BLOCK_H__
|
#define __BLOCK_H__
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -141,8 +139,8 @@
|
|||||||
* style of output = {
|
* style of output = {
|
||||||
* "line", lines in blkbase with no spaces between octets
|
* "line", lines in blkbase with no spaces between octets
|
||||||
* "string", as one long line with no spaces between octets
|
* "string", as one long line with no spaces between octets
|
||||||
* "od_style", position, spaces between octets
|
* "od_style", position, spaces between octets
|
||||||
* "hd_style"} position, spaces between octets, chars on end
|
* "hd_style"} position, spaces between octets, chars on end
|
||||||
*/
|
*/
|
||||||
struct block {
|
struct block {
|
||||||
LEN blkchunk; /* allocation chunk size */
|
LEN blkchunk; /* allocation chunk size */
|
||||||
|
@@ -28,9 +28,9 @@
|
|||||||
* swap_b8_in_HALFs - swap 8 and if needed, 16 bits in an array of HALFs
|
* swap_b8_in_HALFs - swap 8 and if needed, 16 bits in an array of HALFs
|
||||||
*
|
*
|
||||||
* given:
|
* given:
|
||||||
* dest - pointer to where the swapped src wil be put or
|
* dest - pointer to where the swapped src wil be put or
|
||||||
* NULL to allocate the storage
|
* NULL to allocate the storage
|
||||||
* src - pointer to a HALF array to swap
|
* src - pointer to a HALF array to swap
|
||||||
* len - length of the src HALF array
|
* len - length of the src HALF array
|
||||||
*
|
*
|
||||||
* returns:
|
* returns:
|
||||||
@@ -263,9 +263,9 @@ swap_b8_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all)
|
|||||||
* swap_b16_in_HALFs - swap 16 bits in an array of HALFs
|
* swap_b16_in_HALFs - swap 16 bits in an array of HALFs
|
||||||
*
|
*
|
||||||
* given:
|
* given:
|
||||||
* dest - pointer to where the swapped src wil be put or
|
* dest - pointer to where the swapped src wil be put or
|
||||||
* NULL to allocate the storage
|
* NULL to allocate the storage
|
||||||
* src - pointer to a HALF array to swap
|
* src - pointer to a HALF array to swap
|
||||||
* len - length of the src HALF array
|
* len - length of the src HALF array
|
||||||
*
|
*
|
||||||
* returns:
|
* returns:
|
||||||
|
270
calc.c
270
calc.c
@@ -11,7 +11,6 @@
|
|||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
#define CALC_C
|
#define CALC_C
|
||||||
#include "calc.h"
|
#include "calc.h"
|
||||||
@@ -37,33 +36,9 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* external definitions and functions
|
|
||||||
*/
|
|
||||||
extern int abortlevel; /* current level of aborts */
|
|
||||||
extern BOOL inputwait; /* TRUE if in a terminal input wait */
|
|
||||||
extern jmp_buf jmpbuf; /* for errors */
|
|
||||||
extern int isatty(int tty); /* TRUE if fd is a tty */
|
|
||||||
|
|
||||||
extern int p_flag; /* TRUE => pipe mode */
|
|
||||||
extern int q_flag; /* TRUE => don't execute rc files */
|
|
||||||
extern int u_flag; /* TRUE => unbuffer stdin and stdout */
|
|
||||||
|
|
||||||
extern char *pager; /* $PAGER or default */
|
|
||||||
extern int stdin_tty; /* TRUE if stdin is a tty */
|
|
||||||
extern int interactive; /* TRUE if interactive session (no cmd args) */
|
|
||||||
extern char *program; /* our name */
|
|
||||||
extern char cmdbuf[]; /* command line expression */
|
|
||||||
|
|
||||||
extern char *version(void); /* return version string */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* static definitions and functions
|
* static definitions and functions
|
||||||
*/
|
*/
|
||||||
static char *usage = "usage: %s [-C] [-e] [-h] [-i] [-m mode] [-n] [-p]\n"
|
|
||||||
"\t[-q] [-u] [[--] calc_cmd ...]\n";
|
|
||||||
static void intint(int arg); /* interrupt routine */
|
static void intint(int arg); /* interrupt routine */
|
||||||
|
|
||||||
|
|
||||||
@@ -78,13 +53,14 @@ main(int argc, char **argv)
|
|||||||
extern char *optarg; /* option argument */
|
extern char *optarg; /* option argument */
|
||||||
extern int optind; /* option index */
|
extern int optind; /* option index */
|
||||||
int c; /* option */
|
int c; /* option */
|
||||||
|
char *p;
|
||||||
long i;
|
long i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* parse args
|
* parse args
|
||||||
*/
|
*/
|
||||||
program = argv[0];
|
program = argv[0];
|
||||||
while ((c = getopt(argc, argv, "Cehim:npquv")) != -1) {
|
while ((c = getopt(argc, argv, "Cehim:npquvcdD:")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'C':
|
case 'C':
|
||||||
#if defined(CUSTOM)
|
#if defined(CUSTOM)
|
||||||
@@ -107,10 +83,10 @@ main(int argc, char **argv)
|
|||||||
want_defhelp = 1;
|
want_defhelp = 1;
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
ign_errmax = TRUE;
|
i_flag = TRUE;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
if (optarg[1] == '\0' || *optarg<'0' || *optarg>'7') {
|
if (optarg[1] != '\0' || *optarg<'0' || *optarg>'7') {
|
||||||
/*
|
/*
|
||||||
* we are too early in processing to
|
* we are too early in processing to
|
||||||
* call libcalc_call_me_last()
|
* call libcalc_call_me_last()
|
||||||
@@ -136,6 +112,12 @@ main(int argc, char **argv)
|
|||||||
case 'u':
|
case 'u':
|
||||||
u_flag = TRUE;
|
u_flag = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'c':
|
||||||
|
c_flag = TRUE;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
d_flag = TRUE;
|
||||||
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
/*
|
/*
|
||||||
* we are too early in processing to call
|
* we are too early in processing to call
|
||||||
@@ -143,16 +125,40 @@ main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
printf("%s (version %s)\n", CALC_TITLE, version());
|
printf("%s (version %s)\n", CALC_TITLE, version());
|
||||||
exit(0);
|
exit(0);
|
||||||
|
case 'D':
|
||||||
|
/*
|
||||||
|
* parse the -D optarg
|
||||||
|
*
|
||||||
|
* Could be calc_debug
|
||||||
|
* or calc_debug:lib_debug
|
||||||
|
* or calc_debug:lib_debug:user_debug
|
||||||
|
*/
|
||||||
|
calc_debug = optarg;
|
||||||
|
p = strchr(optarg, ':');
|
||||||
|
if (p != NULL) {
|
||||||
|
*p = '\0';
|
||||||
|
lib_debug = p+1;
|
||||||
|
p = strchr(lib_debug, ':');
|
||||||
|
if (p != NULL) {
|
||||||
|
*p = '\0';
|
||||||
|
user_debug = p+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/*
|
/*
|
||||||
* we are too early in processing to call
|
* we are too early in processing to call
|
||||||
* libcalc_call_me_last() - nothing to cleanup
|
* libcalc_call_me_last() - nothing to cleanup
|
||||||
*/
|
*/
|
||||||
fprintf(stderr, usage, program);
|
fprintf(stderr,
|
||||||
|
"usage: %s [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]\n"
|
||||||
|
"\t[-D calc_debug[:lib_debug:[user_debug]]]\n"
|
||||||
|
"\t[-n] [-p] [-q] [-u] [-v] [[--] calc_cmd ...]\n",
|
||||||
|
program);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
interactive = (optind >= argc);
|
havecommands = (optind < argc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* look at the length of any trailing command args
|
* look at the length of any trailing command args
|
||||||
@@ -201,8 +207,9 @@ main(int argc, char **argv)
|
|||||||
* initialize
|
* initialize
|
||||||
*/
|
*/
|
||||||
libcalc_call_me_first();
|
libcalc_call_me_first();
|
||||||
stdin_tty = TRUE; /* assume internactive default */
|
stdin_tty = isatty(0); /* assume stdin is on fd 0 */
|
||||||
conf->tab_ok = TRUE; /* assume internactive default */
|
if (conf->calc_debug & CALCDBG_TTY)
|
||||||
|
printf("DEBUG: stdin_tty is %d\n", stdin_tty);
|
||||||
if (want_defhelp) {
|
if (want_defhelp) {
|
||||||
givehelp(DEFAULTCALCHELP);
|
givehelp(DEFAULTCALCHELP);
|
||||||
libcalc_call_me_last();
|
libcalc_call_me_last();
|
||||||
@@ -212,22 +219,13 @@ main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* if allowed or needed, print version and setup bindings
|
* if allowed or needed, print version and setup bindings
|
||||||
*/
|
*/
|
||||||
if (interactive) {
|
if (!havecommands && stdin_tty) {
|
||||||
/*
|
if (!d_flag) {
|
||||||
* check for pipe mode and/or non-tty stdin
|
|
||||||
*/
|
|
||||||
if (!p_flag) {
|
|
||||||
stdin_tty = isatty(0); /* assume stdin is on fd 0 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if tty, setup bindings
|
|
||||||
*/
|
|
||||||
if (stdin_tty) {
|
|
||||||
printf("%s (version %s)\n", CALC_TITLE, version());
|
printf("%s (version %s)\n", CALC_TITLE, version());
|
||||||
printf("[%s]\n\n",
|
printf("[%s]\n\n",
|
||||||
"Type \"exit\" to exit, or \"help\" for help.");
|
"Type \"exit\" to exit, or \"help\" for help.");
|
||||||
switch (hist_init(calcbindings)) {
|
}
|
||||||
|
switch (hist_init(calcbindings)) {
|
||||||
case HIST_NOFILE:
|
case HIST_NOFILE:
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s: Cannot open bindings file \"%s\", "
|
"%s: Cannot open bindings file \"%s\", "
|
||||||
@@ -240,7 +238,6 @@ main(int argc, char **argv)
|
|||||||
"%s: Cannot set terminal modes, "
|
"%s: Cannot set terminal modes, "
|
||||||
"fancy editing disabled\n", program);
|
"fancy editing disabled\n", program);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,53 +249,162 @@ main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* reset/initialize the computing environment
|
* reset/initialize the computing environment
|
||||||
*/
|
*/
|
||||||
if (post_init) {
|
if (post_init)
|
||||||
initialize();
|
initialize();
|
||||||
} else {
|
post_init = TRUE;
|
||||||
/* initialize already done, jmpbuf is ready */
|
|
||||||
post_init = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if arg mode or non-tty mode, just do the work and be gone
|
|
||||||
*/
|
|
||||||
if (!interactive || !stdin_tty) {
|
|
||||||
if (q_flag == FALSE && allow_read) {
|
|
||||||
runrcfiles();
|
|
||||||
q_flag = TRUE;
|
|
||||||
}
|
|
||||||
if (interactive)
|
|
||||||
(void) openterminal();
|
|
||||||
else
|
|
||||||
(void) openstring(cmdbuf);
|
|
||||||
start_done = TRUE;
|
|
||||||
getcommands(FALSE);
|
|
||||||
libcalc_call_me_last();
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* if in arg mode, we should not get here */
|
|
||||||
if (!interactive) {
|
|
||||||
libcalc_call_me_last();
|
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* process commands
|
* (re)establish the interrupt handler
|
||||||
*/
|
*/
|
||||||
if (!start_done) {
|
|
||||||
reinitialize();
|
|
||||||
}
|
|
||||||
(void) signal(SIGINT, intint);
|
(void) signal(SIGINT, intint);
|
||||||
start_done = TRUE;
|
|
||||||
getcommands(TRUE);
|
/*
|
||||||
|
* execute calc code based on the run state
|
||||||
|
*/
|
||||||
|
if (run_state == RUN_BEGIN) {
|
||||||
|
if (!q_flag && allow_read) {
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_RCFILES));
|
||||||
|
run_state = RUN_RCFILES;
|
||||||
|
runrcfiles();
|
||||||
|
}
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_PRE_CMD_ARGS));
|
||||||
|
run_state = RUN_PRE_CMD_ARGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (run_state == RUN_RCFILES) {
|
||||||
|
fprintf(stderr, "Error in rcfiles\n");
|
||||||
|
if ((c_flag && !stoponerror) || stoponerror < 0) {
|
||||||
|
getcommands(FALSE);
|
||||||
|
if (inputlevel() == 0) {
|
||||||
|
closeinput();
|
||||||
|
runrcfiles();
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_PRE_CMD_ARGS));
|
||||||
|
run_state = RUN_PRE_CMD_ARGS;
|
||||||
|
} else {
|
||||||
|
closeinput();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((havecommands && !i_flag) || !stdin_tty) {
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
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;
|
||||||
|
} else {
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_PRE_CMD_ARGS));
|
||||||
|
run_state = RUN_PRE_CMD_ARGS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (run_state == RUN_PRE_CMD_ARGS) {
|
||||||
|
if (havecommands) {
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_CMD_ARGS));
|
||||||
|
run_state = RUN_CMD_ARGS;
|
||||||
|
(void) openstring(cmdbuf, (long) strlen(cmdbuf));
|
||||||
|
getcommands(FALSE);
|
||||||
|
closeinput();
|
||||||
|
}
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_PRE_TOP_LEVEL));
|
||||||
|
run_state = RUN_PRE_TOP_LEVEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (run_state == RUN_CMD_ARGS) {
|
||||||
|
fprintf(stderr, "Error in commands\n");
|
||||||
|
if ((c_flag && !stoponerror) || stoponerror < 0) {
|
||||||
|
getcommands(FALSE);
|
||||||
|
if (inputlevel() == 0)
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_PRE_TOP_LEVEL));
|
||||||
|
run_state = RUN_PRE_TOP_LEVEL;
|
||||||
|
closeinput();
|
||||||
|
} else {
|
||||||
|
closeinput();
|
||||||
|
if (!stdin_tty || !i_flag || p_flag) {
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
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;
|
||||||
|
} else {
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_PRE_TOP_LEVEL));
|
||||||
|
run_state = RUN_PRE_TOP_LEVEL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (run_state == RUN_PRE_TOP_LEVEL) {
|
||||||
|
if (stdin_tty && ((havecommands && !i_flag) || p_flag)) {
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_EXIT));
|
||||||
|
run_state = RUN_EXIT;
|
||||||
|
} else {
|
||||||
|
if (stdin_tty) {
|
||||||
|
reinitialize();
|
||||||
|
} else {
|
||||||
|
resetinput();
|
||||||
|
openterminal();
|
||||||
|
}
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
printf("DEBUG: run_state from %s to %s\n",
|
||||||
|
run_state_name(run_state),
|
||||||
|
run_state_name(RUN_TOP_LEVEL));
|
||||||
|
run_state = RUN_TOP_LEVEL;
|
||||||
|
getcommands(TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (run_state == RUN_TOP_LEVEL) {
|
||||||
|
if ((c_flag && !stoponerror) || stoponerror < 0) {
|
||||||
|
getcommands(TRUE);
|
||||||
|
if (!inputisterminal())
|
||||||
|
closeinput();
|
||||||
|
} else {
|
||||||
|
if (stdin_tty) {
|
||||||
|
reinitialize();
|
||||||
|
getcommands(TRUE);
|
||||||
|
} else {
|
||||||
|
if (conf->calc_debug & CALCDBG_RUNSTATE)
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* all done
|
* all done
|
||||||
*/
|
*/
|
||||||
libcalc_call_me_last();
|
libcalc_call_me_last();
|
||||||
/* exit(0); */
|
return (run_state == RUN_EXIT_WITH_ERROR ||
|
||||||
return 0;
|
run_state == RUN_UNKNOWN) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
121
calc.h
121
calc.h
@@ -8,63 +8,67 @@
|
|||||||
|
|
||||||
|
|
||||||
#if !defined(__CALC_H__)
|
#if !defined(__CALC_H__)
|
||||||
#define __CALC_H__
|
#define __CALC_H__
|
||||||
|
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
#include "value.h"
|
#include "value.h"
|
||||||
|
|
||||||
|
#include "have_const.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configuration definitions
|
* Configuration definitions
|
||||||
*/
|
*/
|
||||||
#define CALCPATH "CALCPATH" /* environment variable for files */
|
#define CALCPATH "CALCPATH" /* environment variable for files */
|
||||||
#define CALCRC "CALCRC" /* environment variable for startup */
|
#define CALCRC "CALCRC" /* environment variable for startup */
|
||||||
#define CALCBINDINGS "CALCBINDINGS" /* environment variable for hist bindings */
|
#define CALCBINDINGS "CALCBINDINGS" /* environment variable for hist bindings */
|
||||||
#define HOME "HOME" /* environment variable for home dir */
|
#define HOME "HOME" /* environment variable for home dir */
|
||||||
#define PAGER "PAGER" /* environment variable for help */
|
#define PAGER "PAGER" /* environment variable for help */
|
||||||
#define SHELL "SHELL" /* environment variable for shell */
|
#define SHELL "SHELL" /* environment variable for shell */
|
||||||
#define DEFAULTCALCHELP "help" /* help file that -h prints */
|
#define DEFAULTCALCHELP "help" /* help file that -h prints */
|
||||||
#define DEFAULTSHELL "sh" /* default shell to use */
|
#define DEFAULTSHELL "sh" /* default shell to use */
|
||||||
#define CALCEXT ".cal" /* extension for files read in */
|
#define CALCEXT ".cal" /* extension for files read in */
|
||||||
#define MAX_CALCRC 1024 /* maximum length of $CALCRC */
|
#define MAX_CALCRC 1024 /* maximum length of $CALCRC */
|
||||||
#define HOMECHAR '~' /* char which indicates home directory */
|
#define HOMECHAR '~' /* char which indicates home directory */
|
||||||
#define DOTCHAR '.' /* char which indicates current directory */
|
#define DOTCHAR '.' /* char which indicates current directory */
|
||||||
#define PATHCHAR '/' /* char which separates path components */
|
#define PATHCHAR '/' /* char which separates path components */
|
||||||
#define LISTCHAR ':' /* char which separates paths in a list */
|
#define LISTCHAR ':' /* char which separates paths in a list */
|
||||||
#define MAXCMD 16384 /* maximum length of command invocation */
|
#define MAXCMD 16384 /* maximum length of command invocation */
|
||||||
#define MAXERROR 512 /* maximum length of error message string */
|
#define MAXERROR 512 /* maximum length of error message string */
|
||||||
|
|
||||||
#define SYMBOLSIZE 256 /* maximum symbol name size */
|
#define SYMBOLSIZE 256 /* maximum symbol name size */
|
||||||
#define MAXINDICES 20 /* maximum number of indices for objects */
|
#define MAXINDICES 20 /* maximum number of indices for objects */
|
||||||
#define MAXLABELS 100 /* maximum number of user labels in function */
|
#define MAXLABELS 100 /* maximum number of user labels in function */
|
||||||
#define MAXOBJECTS 128 /* maximum number of object types */
|
#define MAXSTRING 1024 /* maximum size of string constant */
|
||||||
#define MAXSTRING 1024 /* maximum size of string constant */
|
#define MAXSTACK 1000 /* maximum depth of evaluation stack */
|
||||||
#define MAXSTACK 1000 /* maximum depth of evaluation stack */
|
#define MAXFILES 20 /* maximum number of opened files */
|
||||||
#define MAXFILES 20 /* maximum number of opened files */
|
|
||||||
#define PROMPT1 "> " /* default normal prompt*/
|
#define PROMPT1 "> " /* default normal prompt*/
|
||||||
#define PROMPT2 ">> " /* default prompt inside multi-line input */
|
#define PROMPT2 ">> " /* default prompt inside multi-line input */
|
||||||
|
|
||||||
|
|
||||||
#define TRACE_NORMAL 0x00 /* normal trace flags */
|
#define TRACE_NORMAL 0x00 /* normal trace flags */
|
||||||
#define TRACE_OPCODES 0x01 /* trace every opcode */
|
#define TRACE_OPCODES 0x01 /* trace every opcode */
|
||||||
#define TRACE_NODEBUG 0x02 /* suppress debugging opcodes */
|
#define TRACE_NODEBUG 0x02 /* suppress debugging opcodes */
|
||||||
#define TRACE_LINKS 0x04 /* display links for real and complex numbers */
|
#define TRACE_LINKS 0x04 /* display links for real and complex numbers */
|
||||||
#define TRACE_FNCODES 0x08 /* display code for newly defined function */
|
#define TRACE_FNCODES 0x08 /* display code for newly defined function */
|
||||||
#define TRACE_MAX 0x0f /* maximum value for trace flag */
|
#define TRACE_MAX 0x0f /* maximum value for trace flag */
|
||||||
|
|
||||||
#define ABORT_NONE 0 /* abort not needed yet */
|
#define ABORT_NONE 0 /* abort not needed yet */
|
||||||
#define ABORT_STATEMENT 1 /* abort on statement boundary */
|
#define ABORT_STATEMENT 1 /* abort on statement boundary */
|
||||||
#define ABORT_OPCODE 2 /* abort on any opcode boundary */
|
#define ABORT_OPCODE 2 /* abort on any opcode boundary */
|
||||||
#define ABORT_MATH 3 /* abort on any math operation */
|
#define ABORT_MATH 3 /* abort on any math operation */
|
||||||
#define ABORT_NOW 4 /* abort right away */
|
#define ABORT_NOW 4 /* abort right away */
|
||||||
|
|
||||||
|
#define ERRMAX 20 /* default errmax value */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* File ids corresponding to standard in, out, error, and when not in use.
|
* File ids corresponding to standard in, out, error, and when not in use.
|
||||||
*/
|
*/
|
||||||
#define FILEID_STDIN ((FILEID) 0)
|
#define FILEID_STDIN ((FILEID) 0)
|
||||||
#define FILEID_STDOUT ((FILEID) 1)
|
#define FILEID_STDOUT ((FILEID) 1)
|
||||||
#define FILEID_STDERR ((FILEID) 2)
|
#define FILEID_STDERR ((FILEID) 2)
|
||||||
#define FILEID_NONE ((FILEID) -1)
|
#define FILEID_NONE ((FILEID) -1)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* File I/O routines.
|
* File I/O routines.
|
||||||
@@ -110,7 +114,7 @@ extern void trimconstants(void);
|
|||||||
/*
|
/*
|
||||||
* Input routines.
|
* Input routines.
|
||||||
*/
|
*/
|
||||||
extern int openstring(char *str);
|
extern int openstring(char *str, long num);
|
||||||
extern int openterminal(void);
|
extern int openterminal(void);
|
||||||
extern int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok);
|
extern int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok);
|
||||||
extern char *nextline(void);
|
extern char *nextline(void);
|
||||||
@@ -119,12 +123,13 @@ extern void reread(void);
|
|||||||
extern void resetinput(void);
|
extern void resetinput(void);
|
||||||
extern void setprompt(char *);
|
extern void setprompt(char *);
|
||||||
extern BOOL inputisterminal(void);
|
extern BOOL inputisterminal(void);
|
||||||
|
extern int inputlevel(void);
|
||||||
|
extern long calclevel(void);
|
||||||
extern char *inputname(void);
|
extern char *inputname(void);
|
||||||
extern long linenumber(void);
|
extern long linenumber(void);
|
||||||
extern void runrcfiles(void);
|
extern void runrcfiles(void);
|
||||||
extern void closeinput(void);
|
extern void closeinput(void);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Other routines.
|
* Other routines.
|
||||||
*/
|
*/
|
||||||
@@ -137,22 +142,42 @@ extern void givehelp(char *type);
|
|||||||
extern void libcalc_call_me_first(void);
|
extern void libcalc_call_me_first(void);
|
||||||
extern void libcalc_call_me_last(void);
|
extern void libcalc_call_me_last(void);
|
||||||
extern void showerrors(void);
|
extern void showerrors(void);
|
||||||
|
extern char *calc_strdup(CONST char *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialization
|
* Initialization
|
||||||
*/
|
*/
|
||||||
extern void initialize(void);
|
extern void initialize(void);
|
||||||
extern void reinitialize(void);
|
extern void reinitialize(void);
|
||||||
|
extern int isatty(int tty); /* TRUE if fd is a tty */
|
||||||
|
extern char *version(void); /* return version string */
|
||||||
|
extern int post_init; /* TRUE => setjmp for math_error is ready */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global data definitions.
|
* global flags and definitions
|
||||||
*/
|
*/
|
||||||
|
extern int abortlevel; /* current level of aborts */
|
||||||
|
extern BOOL inputwait; /* TRUE if in a terminal input wait */
|
||||||
|
extern jmp_buf jmpbuf; /* for errors */
|
||||||
|
|
||||||
|
extern int p_flag; /* TRUE => pipe mode */
|
||||||
|
extern int q_flag; /* TRUE => don't execute rc files */
|
||||||
|
extern int u_flag; /* TRUE => unbuffer stdin and stdout */
|
||||||
|
extern int d_flag; /* TRUE => disable heading, lib_debug == 0 */
|
||||||
|
extern int c_flag; /* TRUE => continue after error if permitted */
|
||||||
|
extern int i_flag; /* TRUE => try to go interactive after error */
|
||||||
|
extern int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */
|
||||||
|
extern BOOL abort_now; /* TRUE => try to go interactive */
|
||||||
|
|
||||||
|
extern char *pager; /* $PAGER or default */
|
||||||
|
extern int stdin_tty; /* TRUE if stdin is a tty */
|
||||||
|
extern int havecommands; /* TRUE if have cmd args) */
|
||||||
|
extern char *program; /* our name */
|
||||||
|
extern char cmdbuf[]; /* command line expression */
|
||||||
|
|
||||||
extern int abortlevel; /* current level of aborts */
|
extern int abortlevel; /* current level of aborts */
|
||||||
extern BOOL inputwait; /* TRUE if in a terminal input wait */
|
extern BOOL inputwait; /* TRUE if in a terminal input wait */
|
||||||
extern VALUE *stack; /* execution stack */
|
extern VALUE *stack; /* execution stack */
|
||||||
extern int start_done; /* TRUE => start up processing finished */
|
|
||||||
extern int dumpnames; /* TRUE => dump names rather than indices */
|
extern int dumpnames; /* TRUE => dump names rather than indices */
|
||||||
|
|
||||||
extern char *calcpath; /* $CALCPATH or default */
|
extern char *calcpath; /* $CALCPATH or default */
|
||||||
@@ -163,15 +188,29 @@ extern char *shell; /* $SHELL or default */
|
|||||||
extern char *program; /* our name (argv[0]) */
|
extern char *program; /* our name (argv[0]) */
|
||||||
|
|
||||||
extern int no_env; /* TRUE (-e) => ignore env vars on startup */
|
extern int no_env; /* TRUE (-e) => ignore env vars on startup */
|
||||||
extern int ign_errmax; /* TRUE (-i) => ignore when errcount exceeds errmax */
|
extern int errmax; /* if >= 0, error when errcount exceeds errmax */
|
||||||
extern int new_std; /* TRUE (-n) => use newstd configuration */
|
extern int new_std; /* TRUE (-n) => use newstd configuration */
|
||||||
|
|
||||||
extern int allow_read; /* FALSE => may not open any files for reading */
|
extern int allow_read; /* FALSE => may not open any files for reading */
|
||||||
extern int allow_write; /* FALSE => may not open any files for writing */
|
extern int allow_write; /* FALSE => may not open any files for writing */
|
||||||
extern int allow_exec; /* FALSE => may not execute any commands */
|
extern int allow_exec; /* FALSE => may not execute any commands */
|
||||||
|
|
||||||
extern int post_init; /* TRUE => setjmp for math_error is ready */
|
/*
|
||||||
|
* calc startup and run state
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
RUN_UNKNOWN = -1, /* unknown or unset start state */
|
||||||
|
RUN_BEGIN = 0, /* calc execution starts */
|
||||||
|
RUN_RCFILES = 1, /* rc files being evaluated */
|
||||||
|
RUN_PRE_CMD_ARGS = 2, /* prepare to evaluate cmd args */
|
||||||
|
RUN_CMD_ARGS = 3, /* cmd args being evaluated */
|
||||||
|
RUN_PRE_TOP_LEVEL = 4, /* prepare to start top level activity */
|
||||||
|
RUN_TOP_LEVEL = 5, /* running at top level */
|
||||||
|
RUN_EXIT = 6, /* normal exit from calc */
|
||||||
|
RUN_EXIT_WITH_ERROR = 7 /* exit with error */
|
||||||
|
} run;
|
||||||
|
extern run run_state;
|
||||||
|
extern char *run_state_name(run state);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* calc version information
|
* calc version information
|
||||||
|
611
calc.man
611
calc.man
@@ -1,190 +1,396 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 1994 David I. Bell and Landon Curt Noll
|
.\" Copyright (c) 1993 David I. Bell and Landon Curt Noll
|
||||||
|
.\" Original man page dated 15nov93
|
||||||
|
.\" Copyright (c) 1999 David I. Bell and Landon Curt Noll
|
||||||
.\" Permission is granted to use, distribute, or modify this source,
|
.\" Permission is granted to use, distribute, or modify this source,
|
||||||
.\" provided that this copyright notice remains intact.
|
.\" provided that this copyright notice remains intact.
|
||||||
.\"
|
.\"
|
||||||
.\" calculator by David I. Bell
|
.\" calculator by David I. Bell
|
||||||
.\" man page by Landon Noll
|
.\" man page by Landon Noll
|
||||||
.TH calc 1 "^..^" "15nov93"
|
.TH calc 1 "^..^" "15Oct1999"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
calc \- arbitrary precision calculator
|
calc \- arbitrary precision calculator
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
\fIcalc\fP
|
\fIcalc\fP
|
||||||
[\fI\-h\fP]
|
.RB [ \-c ]
|
||||||
[\fI\-m mode\fP]
|
.RB [ \-C ]
|
||||||
[\fI\-p\fP]
|
.RB [ \-d ]
|
||||||
[\fI\-q\fP]
|
.RB [ -D\ \&calc_debug[:lib_debug:[user_debug]] ]
|
||||||
[\fI\-u\fP]
|
.br
|
||||||
[\fI\-v\fP]
|
.in +5n
|
||||||
[\fIcalc_cmd \&.\|.\|.\fp]
|
.RB [ \-e ]
|
||||||
|
.RB [ \-h ]
|
||||||
|
.RB [ \-i ]
|
||||||
|
.RB [ \-m\ \&mode ]
|
||||||
|
.RB [ \-n ]
|
||||||
|
.RB [ \-p ]
|
||||||
|
.RB [ \-q ]
|
||||||
|
.RB [ \-u ]
|
||||||
|
.RB [ \-v ]
|
||||||
|
.br
|
||||||
|
.RB [ calc_cmd\ \&.\|.\|. ]
|
||||||
|
.in -5n
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
\&
|
\&
|
||||||
.br
|
.br
|
||||||
CALC COMMAND LINE
|
CALC COMMAND LINE
|
||||||
.PP
|
.PP
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fI\-h\fP
|
.B \-c
|
||||||
Print a help message.
|
Continue reading command lines even after an execution
|
||||||
This option implies \fI \-q\fP.
|
error has caused the abandonment of a line.
|
||||||
This is equivalent to the calc command \fIhelp help\fP.
|
.sp 1
|
||||||
The help facility is disabled unless the \fImode\fP is 5 or 7.
|
For example:
|
||||||
See \fI\-m\fP below.
|
.sp 1
|
||||||
.sp
|
.in +5n
|
||||||
.TP
|
|
||||||
\fI\-m mode\fP
|
|
||||||
This flag sets the permission mode of calc.
|
|
||||||
It controls the ability for \fIcalc\fP to open files
|
|
||||||
and execute programs.
|
|
||||||
\fIMode\fP may be a number from 0 to 7.
|
|
||||||
.sp
|
|
||||||
The \fImode\fP value is interpreted in a way similar
|
|
||||||
to that of the \fRchmod(1)\fP octal mode:
|
|
||||||
.sp
|
|
||||||
.in +0.5i
|
|
||||||
.nf
|
.nf
|
||||||
0 do not open any file, do not execute progs
|
calc read many_errors.cal
|
||||||
1 do not open any file
|
|
||||||
2 do not open files for reading, do not execute progs
|
|
||||||
3 do not open files for reading
|
|
||||||
4 do not open files for writing, do not execute progs
|
|
||||||
5 do not open files for writing
|
|
||||||
6 do not execute any program
|
|
||||||
7 allow everything (default mode)
|
|
||||||
.fi
|
.fi
|
||||||
.in -0.5i
|
.in -5n
|
||||||
.sp
|
.sp 1
|
||||||
If one wished to run calc from a privledged user, one might
|
will cause
|
||||||
want to use \fI\-m 0\fP in an effort to make calc more secure.
|
.B calc
|
||||||
.sp
|
to abort on the first error, whereas:
|
||||||
\fIMode\fP bits for reading and writing apply only on an open.
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
.nf
|
||||||
|
calc -c read many_errors.cal
|
||||||
|
.fi
|
||||||
|
.in -5n
|
||||||
|
.sp 1
|
||||||
|
will
|
||||||
|
cause
|
||||||
|
.B calc
|
||||||
|
to try to process each line being read
|
||||||
|
despite the errors that it encounters.
|
||||||
|
.sp 1
|
||||||
|
By default, calc startup scripts ($CALCRC) are silently
|
||||||
|
ignored if not found.
|
||||||
|
This flag will report missing
|
||||||
|
startup scripts unless
|
||||||
|
.B \-d
|
||||||
|
is also given.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-C
|
||||||
|
Permit the execution of custom builtin functions. Without
|
||||||
|
this flag, calling the custom() builtin function will
|
||||||
|
simply generate an error.
|
||||||
|
.sp 1
|
||||||
|
Use if this flag may cause
|
||||||
|
.B calc
|
||||||
|
to execute functions that
|
||||||
|
are non-standard and that are not portable. Custom builtin
|
||||||
|
functions are disabled by default for this reason.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-d
|
||||||
|
Disable the printing of the opening title. The printing
|
||||||
|
of library debug and informational messages is also disabled
|
||||||
|
as if \fBconfig("lib_debug", 0)\fP had been executed.
|
||||||
|
.sp 1
|
||||||
|
For example:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
calc 'read qtime; qtime(2)'
|
||||||
|
.in -5n
|
||||||
|
.sp 1
|
||||||
|
will output something like:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
.nf
|
||||||
|
qtime(utc_hr_offset) defined
|
||||||
|
It's nearly ten past six.
|
||||||
|
.fi
|
||||||
|
.in -5n
|
||||||
|
.sp 1
|
||||||
|
whereas:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
.nf
|
||||||
|
calc -d 'read qtime; qtime(2)'
|
||||||
|
.fi
|
||||||
|
.in -5n
|
||||||
|
.sp 1
|
||||||
|
will just say:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
.nf
|
||||||
|
It's nearly ten past six.
|
||||||
|
.fi
|
||||||
|
.in -5n
|
||||||
|
.sp 1
|
||||||
|
This flag disables the reporting of missing calc
|
||||||
|
startup scripts ($CALCRC).
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BR -D " calc_debug[:lib_debug:[user_debug]]"
|
||||||
|
Force the initial value of config("calc_debug"),
|
||||||
|
config("lib_debug") and config("user_debug").
|
||||||
|
.sp 1
|
||||||
|
The : separated strings are interpreted as signed 32 bit values.
|
||||||
|
After an optional leading sign a leading zero indicates octal
|
||||||
|
conversion, and a leading ``0x'' or ``0X'' hexadecimal
|
||||||
|
conversion. Otherwise, decimal conversion is assumed.
|
||||||
|
.sp 1
|
||||||
|
By default,
|
||||||
|
.I calc_debug
|
||||||
|
is 0,
|
||||||
|
.I lib_debug
|
||||||
|
is 3 and
|
||||||
|
.I lib_debug
|
||||||
|
is 0.
|
||||||
|
.sp 1
|
||||||
|
For more information use the following
|
||||||
|
.B calc
|
||||||
|
command:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
.nf
|
||||||
|
help config
|
||||||
|
.fi
|
||||||
|
.in -5n
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-e
|
||||||
|
Ignore any environment variables on startup.
|
||||||
|
The getenv() builtin will still return values, however.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-h
|
||||||
|
Print a help message. This option implies
|
||||||
|
.BR \-q .
|
||||||
|
This
|
||||||
|
is equivalent to the
|
||||||
|
.B calc
|
||||||
|
command help help.
|
||||||
|
The help facility is disabled unless the mode is 5 or 7.
|
||||||
|
See
|
||||||
|
.BR \-m .
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-i
|
||||||
|
Become interactive if possible.
|
||||||
|
Be default, if
|
||||||
|
.I calc_cmd
|
||||||
|
args are given,
|
||||||
|
.B calc
|
||||||
|
will execute them and exit.
|
||||||
|
This flag args are given,
|
||||||
|
.B calc
|
||||||
|
will execute them and exit.
|
||||||
|
This flag will cause
|
||||||
|
.B calc
|
||||||
|
to drop into interactive mode after the
|
||||||
|
commands are executed.
|
||||||
|
.sp 1
|
||||||
|
For example:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
.nf
|
||||||
|
calc 2+5
|
||||||
|
.fi
|
||||||
|
.in -5n
|
||||||
|
.sp 1
|
||||||
|
will print the value 7 and exit whereas:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
.nf
|
||||||
|
calc -i 2+5
|
||||||
|
.fi
|
||||||
|
.in -5n
|
||||||
|
.sp 1
|
||||||
|
will print the value 7 and prompt the user for more
|
||||||
|
.B calc
|
||||||
|
commands.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BR \-m " mode"
|
||||||
|
This flag sets the permission mode of
|
||||||
|
.BR calc .
|
||||||
|
It controls the ability for
|
||||||
|
.B calc
|
||||||
|
to open files and execute programs.
|
||||||
|
.I Mode
|
||||||
|
may be a number from 0 to 7.
|
||||||
|
.sp 1
|
||||||
|
The mode value is interpreted in a way similar to that
|
||||||
|
of the
|
||||||
|
.BR chmod (1)
|
||||||
|
octal mode:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
.nf
|
||||||
|
0 do not open any file, do not execute progs
|
||||||
|
1 do not open any file
|
||||||
|
2 do not open files for reading, do not execute progs
|
||||||
|
3 do not open files for reading
|
||||||
|
4 do not open files for writing, do not execute progs
|
||||||
|
5 do not open files for writing
|
||||||
|
6 do not execute any program
|
||||||
|
7 allow everything (default mode)
|
||||||
|
.fi
|
||||||
|
.in -5n
|
||||||
|
.sp 1
|
||||||
|
If one wished to run
|
||||||
|
.B calc
|
||||||
|
from a privileged user, one might want to use
|
||||||
|
.BR \-m " 0"
|
||||||
|
in an effort to make
|
||||||
|
.B calc
|
||||||
|
somewhat more secure.
|
||||||
|
.sp 1
|
||||||
|
Mode bits for reading and writing apply only on an
|
||||||
|
open.
|
||||||
Files already open are not effected.
|
Files already open are not effected.
|
||||||
Thus if one wanted to use the \fI\-m 0\fP in an effort to make
|
Thus if one wanted to use the
|
||||||
\fIcalc\fP more secure, but still wanted to read and write a specific
|
.BR \-m " 0"
|
||||||
file, one might want to do:
|
in an effort to make
|
||||||
.sp
|
.B calc
|
||||||
.in +0.5i
|
somewhat more secure, but still wanted to read and write a specific
|
||||||
|
file, one might want to do in
|
||||||
|
.BR sh (1),
|
||||||
|
.BR ksh (1),
|
||||||
|
.BR bash (1)-like
|
||||||
|
shells:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
.nf
|
.nf
|
||||||
\fRcalc \-m 0 3<a.file\fP
|
calc -m 0 3<a.file
|
||||||
.fi
|
.fi
|
||||||
.in -0.5i
|
.in -5n
|
||||||
.sp
|
.sp 1
|
||||||
Files presented to \fIcalc\fP in this way are opened in an unknown mode.
|
Files presented to
|
||||||
\fICalc\fP will attempt to read or write them if directed.
|
.B calc
|
||||||
.sp
|
in this way are opened in an
|
||||||
If the \fImode\fP disables opening of files for reading, then
|
unknown mode.
|
||||||
the startup library scripts are disabled as of \fI\-q\fP was given.
|
.B Calc
|
||||||
The reading of key bindings is also disabled when the \fImode\fP
|
will attempt to read or write them if directed.
|
||||||
disables opening of files for reading.
|
.sp 1
|
||||||
|
If the mode disables opening of files for reading, then
|
||||||
|
the startup library scripts are disabled as of
|
||||||
|
.B \-q
|
||||||
|
was given.
|
||||||
|
The reading of key bindings is also disabled
|
||||||
|
when the mode disables opening of files for reading.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fI \-p\fP
|
.B \-n
|
||||||
Pipe processing is enabled by use of \-p. For example:
|
Use the new configuration defaults instead of the old
|
||||||
.sp
|
default classic defaults.
|
||||||
.in +0.5i
|
This flag as the same effect
|
||||||
|
as executing \fBconfig("all", "newcfg")\fP at startup time.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-p
|
||||||
|
Pipe processing is enabled by use of
|
||||||
|
.BR \-p .
|
||||||
|
For example:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
.nf
|
.nf
|
||||||
\fRecho "print 2^21701\-1, 2^23209\-1" | calc \-p | fizzbin\fP
|
calc -p '2^21701-1' | fizzbin
|
||||||
.fi
|
.fi
|
||||||
.in -0.5i
|
.in -5n
|
||||||
.sp
|
.sp 1
|
||||||
In pipe mode, \fIcalc\fP does not prompt, does not print leading tabs
|
In pipe mode,
|
||||||
and does not print the initial header.
|
.B calc
|
||||||
|
does not prompt, does not print leading
|
||||||
|
tabs and does not print the initial header.
|
||||||
|
The
|
||||||
|
.B \-p
|
||||||
|
flag overrides
|
||||||
|
.BR \-i .
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fI \-q\fP
|
.B \-q
|
||||||
Disable the use of the \fI$CALCRC\fP startup scripts.
|
Disable the use of the $CALCRC startup scripts.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fI \-u\fP
|
.B \-u
|
||||||
Disable buffering of stdin and stdout.
|
Disable buffering of stdin and stdout.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fI \-v\fP
|
.B \-v
|
||||||
Print the version and exit.
|
Print the
|
||||||
|
.B calc
|
||||||
|
version number and exit.
|
||||||
.PP
|
.PP
|
||||||
Without \fIcalc_cmd\fPs, \fIcalc\fP operates interactively.
|
Without
|
||||||
If one or more \fIcalc_cmd\fPs are given on the command line,
|
.IR calc_cmd ,
|
||||||
\fIcalc\fP will execute them and exit.
|
.B calc
|
||||||
The printing of leading tabs on output is disabled
|
operates interactively.
|
||||||
as if \fIconfig("tab",0)\fP had been executed.
|
If one or more
|
||||||
|
.I calc_cmd
|
||||||
|
are given on the command line,
|
||||||
|
.B calc
|
||||||
|
will execute them and exit.
|
||||||
|
If
|
||||||
|
.B \-i
|
||||||
|
is given,
|
||||||
|
.B calc
|
||||||
|
will attempt to become interactive
|
||||||
|
even of one or more
|
||||||
|
.I calc_cmd
|
||||||
|
are given on the command line.
|
||||||
.PP
|
.PP
|
||||||
Normally on startup, \fIcalc\fP attempts to execute a collection
|
Normally on startup,
|
||||||
of library scripts.
|
.B calc
|
||||||
The environment variable \fI$CALCRC\fP (if non-existent then
|
attempts to execute a collection of
|
||||||
a compiled in value) contains a \fI:\fP separated list of
|
library scripts.
|
||||||
startup library scripts.
|
The environment variable $CALCRC (if non-existent
|
||||||
No error conditions are produced if these startup library scripts
|
then a compiled in value) contains a : separated list of startup
|
||||||
are not found.
|
library scripts.
|
||||||
|
No error conditions are produced if these startup
|
||||||
|
library scripts are not found.
|
||||||
.PP
|
.PP
|
||||||
If the \fImode\fP disables opening of files for reading, then
|
If the mode disables opening of files for reading, then the startup
|
||||||
the startup library scripts are disabled as of \fI\-q\fP was given
|
library scripts are disabled as of
|
||||||
and \fI$CALCRC\fP as well as the default compiled in value are ignored.
|
.B \-q
|
||||||
|
was given and $CALCRC as well
|
||||||
|
as the default compiled in value are ignored.
|
||||||
.PP
|
.PP
|
||||||
Filenames are subject to ``~'' expansion (see below).
|
Filenames are subject to ``~'' expansion (see below).
|
||||||
The environment variable \fI$CALCPATH\fP (if non-existent then
|
The
|
||||||
a compiled in value) contains a \fI:\fP separated list of search
|
environment variable $CALCPATH (if non-existent then a compiled in
|
||||||
directories.
|
value) contains a : separated list of search directories.
|
||||||
If a file does not begin with \fI/\fP, \fI~\fP or \fI./\fP,
|
If a
|
||||||
then it is searched for under each directory listed in the \fI$CALCPATH\fP.
|
file does not begin with /, ~ or ./, then it is searched for under
|
||||||
It is an error if no such readable file is found.
|
each directory listed in the $CALCPATH.
|
||||||
|
It is an error if no such
|
||||||
|
readable file is found.
|
||||||
.PP
|
.PP
|
||||||
Calc treats all open files, other than stdin, stdout and stderr
|
.B Calc
|
||||||
as files available for reading and writing.
|
treats all open files, other than stdin, stdout and
|
||||||
One may present calc with an already open file in the following way:
|
stderr as files available for reading and writing.
|
||||||
.sp
|
One may
|
||||||
.in +0.5i
|
present
|
||||||
|
.B calc
|
||||||
|
with an already open file using
|
||||||
|
.BR sh (1),
|
||||||
|
.BR ksh (1),
|
||||||
|
.BR bash (1)-like
|
||||||
|
shells is to:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
|
calc 3<open_file 4<open_file2
|
||||||
|
.in -5n
|
||||||
|
.sp 1
|
||||||
|
For more information use the following
|
||||||
|
.B calc
|
||||||
|
commands:
|
||||||
|
.sp 1
|
||||||
|
.in +5n
|
||||||
.nf
|
.nf
|
||||||
\fRcalc 3<open_file 4<open_file2\fP
|
|
||||||
.fi
|
|
||||||
.in -0.5i
|
|
||||||
.PP
|
|
||||||
For more information use the following calc commands:
|
|
||||||
.PP
|
|
||||||
.in 1.0i
|
|
||||||
help usage
|
|
||||||
.br
|
|
||||||
help help
|
help help
|
||||||
.br
|
help overview
|
||||||
|
help usage
|
||||||
help environment
|
help environment
|
||||||
.in -1.0i
|
help config
|
||||||
.PP
|
.fi
|
||||||
OVERVIEW
|
.in -5n
|
||||||
.PP
|
.sp 1
|
||||||
\fICalc\fP is arbitrary precision arithmetic system that uses
|
|
||||||
a C-like language.
|
|
||||||
\fICalc\fP is useful as a calculator, an algorithm prototyped
|
|
||||||
and as a mathematical research tool.
|
|
||||||
More importantly, \fIcalc\fP provides one with a machine
|
|
||||||
independent means of computation.
|
|
||||||
.PP
|
|
||||||
\fICalc\fP comes with a rich set of builtin mathematical
|
|
||||||
and programmatic functions.
|
|
||||||
.PP
|
|
||||||
\fICalc\fP is distributed with library of scripts.
|
|
||||||
Written in the same C-like language, library scripts may be
|
|
||||||
read in and executed during a \fIcalc\fP session.
|
|
||||||
These library scripts are also provided because they are
|
|
||||||
useful and to serve as examples of the \fIcalc\fP language.
|
|
||||||
One may further extend \fIcalc\fP thru the
|
|
||||||
use of user defined scripts.
|
|
||||||
.PP
|
|
||||||
Internally calc represents numeric values as fractions reduced to their
|
|
||||||
lowest terms.
|
|
||||||
The numerators and denominators of these factions may grow to
|
|
||||||
arbitrarily large values.
|
|
||||||
Numeric values read in are automatically converted into rationals.
|
|
||||||
The user need not be aware of this internal representation.
|
|
||||||
.PP
|
|
||||||
For more information use the following calc commands:
|
|
||||||
.PP
|
|
||||||
.in 1.0i
|
|
||||||
help intro
|
|
||||||
.br
|
|
||||||
help builtin
|
|
||||||
.br
|
|
||||||
help stdlib
|
|
||||||
.br
|
|
||||||
help define
|
|
||||||
.br
|
|
||||||
show builtins
|
|
||||||
.br
|
|
||||||
show functions
|
|
||||||
.in -1.0i
|
|
||||||
.PP
|
.PP
|
||||||
DATA TYPES
|
DATA TYPES
|
||||||
.PP
|
.PP
|
||||||
@@ -199,7 +405,9 @@ multiplication, division, negation, squaring, modulus,
|
|||||||
rounding, exponentiation, equality, comparison, printing
|
rounding, exponentiation, equality, comparison, printing
|
||||||
and so on.
|
and so on.
|
||||||
.PP
|
.PP
|
||||||
For more information use the following calc commands:
|
For more information use the following
|
||||||
|
.B calc
|
||||||
|
commands:
|
||||||
.PP
|
.PP
|
||||||
.in 1.0i
|
.in 1.0i
|
||||||
help types
|
help types
|
||||||
@@ -220,7 +428,9 @@ procedure.
|
|||||||
Values may be grouped together in a matrix, or into a
|
Values may be grouped together in a matrix, or into a
|
||||||
a list that permits stack and queue style operations.
|
a list that permits stack and queue style operations.
|
||||||
.PP
|
.PP
|
||||||
For more information use the following calc commands:
|
For more information use the following
|
||||||
|
.B calc
|
||||||
|
commands:
|
||||||
.PP
|
.PP
|
||||||
.in 1.0i
|
.in 1.0i
|
||||||
help variable
|
help variable
|
||||||
@@ -256,7 +466,9 @@ For example:
|
|||||||
~chongo/lib/fft_multiply.cal
|
~chongo/lib/fft_multiply.cal
|
||||||
.in -1.0i
|
.in -1.0i
|
||||||
.PP
|
.PP
|
||||||
For more information use the following calc command:
|
For more information use the following
|
||||||
|
.B calc
|
||||||
|
command:
|
||||||
.PP
|
.PP
|
||||||
.in 1.0i
|
.in 1.0i
|
||||||
help file
|
help file
|
||||||
@@ -275,7 +487,9 @@ These include commands such as function definition, help,
|
|||||||
reading in library scripts, dump files to a file, error notification,
|
reading in library scripts, dump files to a file, error notification,
|
||||||
configuration control and status.
|
configuration control and status.
|
||||||
.PP
|
.PP
|
||||||
For more information use the following calc command:
|
For more information use the following
|
||||||
|
.B calc
|
||||||
|
command:
|
||||||
.PP
|
.PP
|
||||||
.in 1.0i
|
.in 1.0i
|
||||||
help command
|
help command
|
||||||
@@ -295,7 +509,8 @@ help config
|
|||||||
.PD 0
|
.PD 0
|
||||||
.TP 20
|
.TP 20
|
||||||
${LIBDIR}/*.cal
|
${LIBDIR}/*.cal
|
||||||
library scripts shipped with calc
|
library scripts shipped with
|
||||||
|
.B calc
|
||||||
.br
|
.br
|
||||||
.sp
|
.sp
|
||||||
.TP 20
|
.TP 20
|
||||||
@@ -323,7 +538,9 @@ Default value: ${CALCPATH}
|
|||||||
.TP 5
|
.TP 5
|
||||||
CALCRC
|
CALCRC
|
||||||
On startup (unless \-h or \-q was given on the command
|
On startup (unless \-h or \-q was given on the command
|
||||||
line), calc searches for files along this :-separated
|
line),
|
||||||
|
.B calc
|
||||||
|
searches for files along this :-separated
|
||||||
environment variable.
|
environment variable.
|
||||||
.br
|
.br
|
||||||
.sp
|
.sp
|
||||||
@@ -333,19 +550,31 @@ Default value: ${CALCRC}
|
|||||||
.TP 5
|
.TP 5
|
||||||
CALCBINDINGS
|
CALCBINDINGS
|
||||||
On startup (unless \fI\-h\fP or \fI\-q\fP was given on the command
|
On startup (unless \fI\-h\fP or \fI\-q\fP was given on the command
|
||||||
line, or \fI\-m\fP disallows opening files for reading), calc reads
|
line, or \fI\-m\fP disallows opening files for reading),
|
||||||
|
.B calc
|
||||||
|
reads
|
||||||
key bindings from the filename specified
|
key bindings from the filename specified
|
||||||
by this environment variable.
|
by this environment variable.
|
||||||
.br
|
.br
|
||||||
.sp
|
.sp
|
||||||
Default value: ${CALCBINDINGS}
|
Default value: ${CALCBINDINGS}
|
||||||
.sp
|
.sp
|
||||||
|
This variable is not used if calc was compiled with GNU-readline support.
|
||||||
|
In that case, the standard readline mechanisms (see readline(3)) are used.
|
||||||
|
.sp
|
||||||
.SH CREDIT
|
.SH CREDIT
|
||||||
\&
|
\&
|
||||||
.br
|
.br
|
||||||
The majority of calc was written by David I. Bell.
|
The majority of
|
||||||
|
.B calc
|
||||||
|
was written by David I. Bell.
|
||||||
.sp
|
.sp
|
||||||
Calc archives and calc-tester mailing list maintained by Landon Curt Noll.
|
.B Calc
|
||||||
|
The Calc primary mirror, calc mailing list and calc bug report
|
||||||
|
processing is performed by Landon Curt Noll.
|
||||||
|
.sp
|
||||||
|
Landon Curt Noll maintains the master reference source, performs
|
||||||
|
release control functions as well as other calc maintenance functions.
|
||||||
.sp
|
.sp
|
||||||
Thanks for suggestions and encouragement from Peter Miller,
|
Thanks for suggestions and encouragement from Peter Miller,
|
||||||
Neil Justusson, and Landon Noll.
|
Neil Justusson, and Landon Noll.
|
||||||
@@ -360,7 +589,7 @@ Ernest also supplied the original text for many of the help files.
|
|||||||
.sp
|
.sp
|
||||||
Portions of this program are derived from an earlier set of
|
Portions of this program are derived from an earlier set of
|
||||||
public domain arbitrarily precision routines which was posted
|
public domain arbitrarily precision routines which was posted
|
||||||
to the net around 1984. By now, there is almost no recognizable
|
to the net around 1984. By now, there is almost no recognizable
|
||||||
code left from that original source.
|
code left from that original source.
|
||||||
.sp
|
.sp
|
||||||
Most of this source and binary has one of the following copyrights:
|
Most of this source and binary has one of the following copyrights:
|
||||||
@@ -378,46 +607,74 @@ Copyright (c) 19xx Ernest Bowen and Landon Curt Noll
|
|||||||
Permission is granted to use, distribute, or modify this source,
|
Permission is granted to use, distribute, or modify this source,
|
||||||
provided that this copyright notice remains intact.
|
provided that this copyright notice remains intact.
|
||||||
.sp
|
.sp
|
||||||
Send calc comments, suggestions, bug fixes, enhancements
|
Send comments, suggestions, bug fixes, enhancements
|
||||||
and interesting calc scripts that you would like you see included
|
and interesting
|
||||||
|
.B calc
|
||||||
|
scripts that you would like you see included
|
||||||
in future distributions to:
|
in future distributions to:
|
||||||
.sp
|
.sp
|
||||||
.in +0.5i
|
.in +0.5i
|
||||||
dbell@auug.org.au
|
.nf
|
||||||
.br
|
calc-tester at postofc dot corp dot sgi dot com
|
||||||
chongo@toad.com
|
|
||||||
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
.fi
|
||||||
.in -0.5i
|
.in -0.5i
|
||||||
.sp
|
.sp
|
||||||
Landon Noll maintains the official calc ftp archive at:
|
Bug reports are sent to:
|
||||||
.sp
|
|
||||||
.in +0.5i
|
.in +0.5i
|
||||||
ftp://ftp.uu.net/pub/calc
|
.nf
|
||||||
|
calc-bugs at postofc dot corp dot sgi dot com
|
||||||
|
|
||||||
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
.fi
|
||||||
.in -0.5i
|
.in -0.5i
|
||||||
.sp
|
.sp
|
||||||
Alpha test versions, complete with bugs, untested code and
|
See the
|
||||||
experimental features may be fetched (if you are brave) under:
|
.I BUGS
|
||||||
|
source file or use the
|
||||||
|
.I calc
|
||||||
|
command:
|
||||||
.sp
|
.sp
|
||||||
.in +0.5i
|
.in +0.5i
|
||||||
http://reality.sgi.com/chongo/calc/
|
.nf
|
||||||
|
help bugs
|
||||||
|
.fi
|
||||||
.in -0.5i
|
.in -0.5i
|
||||||
.sp
|
.sp
|
||||||
One may join the calc testing group by sending a request to:
|
for more information about bug reporting.
|
||||||
|
.sp
|
||||||
|
Landon Noll maintains the the
|
||||||
|
.B calc
|
||||||
|
web site is located at:
|
||||||
.sp
|
.sp
|
||||||
.in +0.5i
|
.in +0.5i
|
||||||
calc-tester-request@postofc.corp.sgi.com
|
http://reality.sgi.com/chongo/tech/comp/calc/
|
||||||
|
.in -0.5i
|
||||||
|
.sp
|
||||||
|
One may join the
|
||||||
|
.B calc
|
||||||
|
testing group by sending a request to:
|
||||||
|
.sp
|
||||||
|
.in +0.5i
|
||||||
|
.nf
|
||||||
|
calc-tester-request at postofc dot corp dot sgi dot com
|
||||||
|
|
||||||
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
.fi
|
||||||
.in -0.5i
|
.in -0.5i
|
||||||
.sp
|
.sp
|
||||||
Your message body (not the subject) should consist of:
|
Your message body (not the subject) should consist of:
|
||||||
.sp
|
.sp
|
||||||
.in +0.5i
|
.in +0.5i
|
||||||
|
.nf
|
||||||
subscribe calc-tester address
|
subscribe calc-tester address
|
||||||
.br
|
|
||||||
end
|
end
|
||||||
.br
|
|
||||||
name your_full_name
|
name your_full_name
|
||||||
|
.fi
|
||||||
|
.in -0.5i
|
||||||
.sp
|
.sp
|
||||||
where "address" is your EMail address and "your_full_name"
|
where "address" is your EMail address and "your_full_name"
|
||||||
is your full name.
|
is your full name.
|
||||||
.in -0.5i
|
|
||||||
.sp
|
.sp
|
||||||
Enjoy!
|
Share and Enjoy! :\-)
|
||||||
|
123
calc_errno.c
123
calc_errno.c
@@ -1,123 +0,0 @@
|
|||||||
/*
|
|
||||||
* errno - Determine how to declare errno, sys_errlist and sys_nerr
|
|
||||||
*
|
|
||||||
* On most machines: errno sys_errlist and sys_nerr are declared
|
|
||||||
* by either <stdio.h> and/or <errno.h>. But some systems declare
|
|
||||||
* them somewhere else or do not declare them at all!
|
|
||||||
*
|
|
||||||
* If the system were doing a proper job in headers, this should declare them:
|
|
||||||
*
|
|
||||||
* #include <stdio.h>
|
|
||||||
* #include <errno.h>
|
|
||||||
*
|
|
||||||
* But one some systems one must explicitly declare them as:
|
|
||||||
*
|
|
||||||
* extern int errno;
|
|
||||||
* extern const char *const sys_errlist[];
|
|
||||||
* extern int sys_nerr;
|
|
||||||
*
|
|
||||||
* and on some old systems they must be explicitly and incorrectly declared as:
|
|
||||||
*
|
|
||||||
* extern int errno;
|
|
||||||
* extern char *sys_errlist[];
|
|
||||||
* extern int sys_nerr;
|
|
||||||
*
|
|
||||||
* The purpose of this utility is try and find the right way to declare
|
|
||||||
* them and to output the middle of a header file called calc_errno.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software and
|
|
||||||
* its documentation for any purpose and without fee is hereby granted,
|
|
||||||
* provided that the above copyright, this permission notice and text
|
|
||||||
* this comment, and the disclaimer below appear in all of the following:
|
|
||||||
*
|
|
||||||
* supporting documentation
|
|
||||||
* source copies
|
|
||||||
* source works derived from this source
|
|
||||||
* binaries derived from this source or from derived source
|
|
||||||
*
|
|
||||||
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
||||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
|
||||||
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
||||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
|
||||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
||||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#if defined(TRY_ERRNO_NO_DECL)
|
|
||||||
# include <errno.h>
|
|
||||||
#endif /* TRY_ERRNO_NO_DECL */
|
|
||||||
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
#if defined(TRY_ERRNO_NO_DECL)
|
|
||||||
printf("/*\n");
|
|
||||||
printf(" * The following comments were produced by calc_errno\n");
|
|
||||||
printf(" * in an effort to see if these values were correctly\n");
|
|
||||||
printf(" * declared when calc_errno.c was compiled.\n");
|
|
||||||
printf(" */\n\n");
|
|
||||||
printf("/* Initially errno is %d */\n", errno);
|
|
||||||
printf("/* There are %d entries in sys_errlist[] */\n", sys_nerr);
|
|
||||||
printf("/* The 2nd sys_errlist entry is \"%s\" */\n\n", sys_errlist[1]);
|
|
||||||
printf("/*\n");
|
|
||||||
printf(" * Based on the above, calc_errno now knows\n");
|
|
||||||
printf(" * how to declare errno and friends.\n");
|
|
||||||
printf(" */\n\n");
|
|
||||||
printf("#include <stdio.h>\n");
|
|
||||||
printf("#include <errno.h>\n");
|
|
||||||
#elif defined(TRY_ERRNO_OLD_DECL)
|
|
||||||
extern int errno; /* last system error */
|
|
||||||
extern char *sys_errlist[]; /* system error messages */
|
|
||||||
extern int sys_nerr; /* number of system errors*/
|
|
||||||
|
|
||||||
printf("/*\n");
|
|
||||||
printf(" * The following comments were produced by calc_errno\n");
|
|
||||||
printf(" * in an effort to see if these values were correctly\n");
|
|
||||||
printf(" * declared when calc_errno.c was compiled.\n");
|
|
||||||
printf(" */\n\n");
|
|
||||||
printf("/* Initially errno is %d */\n", errno);
|
|
||||||
printf("/* There are %d entries in sys_errlist[] */\n", sys_nerr);
|
|
||||||
printf("/* The 2nd sys_errlist entry is \"%s\" */\n\n", sys_errlist[1]);
|
|
||||||
printf("/*\n");
|
|
||||||
printf(" * Based on the above, calc_errno now knows\n");
|
|
||||||
printf(" * how to declare errno and friends.\n");
|
|
||||||
printf(" */\n\n");
|
|
||||||
printf("extern int errno;\t\t/* last system error */\n");
|
|
||||||
printf("extern char *sys_errlist[];\t"
|
|
||||||
"/* system error messages */\n");
|
|
||||||
printf("extern int sys_nerr;\t\t/* number of system errors*/\n");
|
|
||||||
#else /* assume defined(TRY_ERRNO_STD_DECL) */
|
|
||||||
extern int errno; /* last system error */
|
|
||||||
extern const char *const sys_errlist[]; /* system error messages */
|
|
||||||
extern int sys_nerr; /* number of system errors*/
|
|
||||||
|
|
||||||
printf("/*\n");
|
|
||||||
printf(" * The following comments were produced by calc_errno\n");
|
|
||||||
printf(" * in an effort to see if these values were correctly\n");
|
|
||||||
printf(" * declared when calc_errno.c was compiled.\n");
|
|
||||||
printf(" */\n\n");
|
|
||||||
printf("/* Initially errno is %d */\n", errno);
|
|
||||||
printf("/* There are %d entries in sys_errlist[] */\n", sys_nerr);
|
|
||||||
printf("/* The 2nd sys_errlist entry is \"%s\" */\n\n", sys_errlist[1]);
|
|
||||||
printf("/*\n");
|
|
||||||
printf(" * Based on the above, calc_errno now knows\n");
|
|
||||||
printf(" * how to declare errno and friends.\n");
|
|
||||||
printf(" */\n\n");
|
|
||||||
printf("extern int errno;\t\t\t/* last system error */\n");
|
|
||||||
printf("extern const char *const sys_errlist[];\t"
|
|
||||||
"/* system error messages */\n");
|
|
||||||
printf("extern int sys_nerr;\t\t\t/* number of system errors*/\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* exit(0); */
|
|
||||||
return 0;
|
|
||||||
}
|
|
@@ -6,12 +6,12 @@ BEGIN {
|
|||||||
printf(" * names of calc error values\n");
|
printf(" * names of calc error values\n");
|
||||||
printf(" */\n");
|
printf(" */\n");
|
||||||
printf("CONST char *error_table[E__COUNT+2] = {\n");
|
printf("CONST char *error_table[E__COUNT+2] = {\n");
|
||||||
printf(" \"No error\",\n");
|
printf(" \"No error\",\n");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
print $0;
|
print $0;
|
||||||
}
|
}
|
||||||
END {
|
END {
|
||||||
printf(" NULL\n");
|
printf(" NULL\n");
|
||||||
printf("};\n");
|
printf("};\n");
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
# This awk script will print 3 lines before and after any non-blank line that
|
# This awk script will print 3 lines before and after any non-blank line that
|
||||||
# does not begin with a number. This allows the 'make debug' rule to remove
|
# does not begin with a number. This allows the 'make debug' rule to remove
|
||||||
# all non-interest lines the the 'make check' regression output while providing
|
# all non-interest lines the the 'make check' regression output while providing
|
||||||
# 3 lines of context around unexpected output.
|
# 3 lines of context around unexpected output.
|
||||||
#
|
#
|
||||||
@@ -11,6 +11,7 @@ BEGIN {
|
|||||||
havebuf2=0;
|
havebuf2=0;
|
||||||
buf2=0;
|
buf2=0;
|
||||||
error = 0;
|
error = 0;
|
||||||
|
end_seen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
NF == 0 {
|
NF == 0 {
|
||||||
@@ -29,6 +30,10 @@ NF == 0 {
|
|||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/: Ending regression tests$/ {
|
||||||
|
end_seen = 1;
|
||||||
|
}
|
||||||
|
|
||||||
$1 ~ /^[0-9]+:/ {
|
$1 ~ /^[0-9]+:/ {
|
||||||
if (error > 0) {
|
if (error > 0) {
|
||||||
if (havebuf2) {
|
if (havebuf2) {
|
||||||
@@ -71,7 +76,7 @@ END {
|
|||||||
if (error > 0 && havebuf0) {
|
if (error > 0 && havebuf0) {
|
||||||
print buf0;
|
print buf0;
|
||||||
}
|
}
|
||||||
if (error > 0) {
|
if (error > 0 || !end_seen) {
|
||||||
exit(1);
|
exit(1);
|
||||||
} else {
|
} else {
|
||||||
exit(0);
|
exit(0);
|
||||||
|
4
cmath.h
4
cmath.h
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#if !defined(__CMATH_H__)
|
#if !defined(__CMATH_H__)
|
||||||
#define __CMATH_H__
|
#define __CMATH_H__
|
||||||
|
|
||||||
|
|
||||||
#include "qmath.h"
|
#include "qmath.h"
|
||||||
@@ -114,7 +114,7 @@ extern COMPLEX *swap_HALF_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all);
|
|||||||
#define cisnegone(c) (cisreal(c) && qisnegone((c)->real))
|
#define cisnegone(c) (cisreal(c) && qisnegone((c)->real))
|
||||||
#define cisrunit(c) (cisreal(c) && qisunit((c)->real))
|
#define cisrunit(c) (cisreal(c) && qisunit((c)->real))
|
||||||
#define cisiunit(c) (qiszero((c)->real) && qisunit((c)->imag))
|
#define cisiunit(c) (qiszero((c)->real) && qisunit((c)->imag))
|
||||||
#define cisunit(c) (cisrunit(c) || cisiunit(c))
|
#define cisunit(c) (cisrunit(c) || cisiunit(c))
|
||||||
#define cistwo(c) (cisreal(c) && qistwo((c)->real))
|
#define cistwo(c) (cisreal(c) && qistwo((c)->real))
|
||||||
#define cisint(c) (qisint((c)->real) && qisint((c)->imag))
|
#define cisint(c) (qisint((c)->real) && qisint((c)->imag))
|
||||||
#define ciseven(c) (qiseven((c)->real) && qiseven((c)->imag))
|
#define ciseven(c) (qiseven((c)->real) && qiseven((c)->imag))
|
||||||
|
269
codegen.c
269
codegen.c
@@ -31,9 +31,9 @@ static void getshowstatement(void);
|
|||||||
static void getfunction(void);
|
static void getfunction(void);
|
||||||
static void ungetfunction(void);
|
static void ungetfunction(void);
|
||||||
static void getbody(LABEL *contlabel, LABEL *breaklabel,
|
static void getbody(LABEL *contlabel, LABEL *breaklabel,
|
||||||
LABEL *nextcaselabel, LABEL *defaultlabel, BOOL toplevel);
|
LABEL *nextcaselabel, LABEL *defaultlabel);
|
||||||
static void getdeclarations(int symtype);
|
static int getdeclarations(int symtype);
|
||||||
static void getsimpledeclaration (int symtype);
|
static int getsimpledeclaration (int symtype);
|
||||||
static int getonevariable (int symtype);
|
static int getonevariable (int symtype);
|
||||||
static void getstatement(LABEL *contlabel, LABEL *breaklabel,
|
static void getstatement(LABEL *contlabel, LABEL *breaklabel,
|
||||||
LABEL *nextcaselabel, LABEL *defaultlabel);
|
LABEL *nextcaselabel, LABEL *defaultlabel);
|
||||||
@@ -86,6 +86,7 @@ getcommands(BOOL toplevel)
|
|||||||
/* firewall */
|
/* firewall */
|
||||||
name[0] = '\0';
|
name[0] = '\0';
|
||||||
name[MAXCMD+1] = '\0';
|
name[MAXCMD+1] = '\0';
|
||||||
|
abort_now = FALSE;
|
||||||
|
|
||||||
/* getcommands */
|
/* getcommands */
|
||||||
if (!toplevel)
|
if (!toplevel)
|
||||||
@@ -125,6 +126,7 @@ getcommands(BOOL toplevel)
|
|||||||
switch (opensearchfile(name,calcpath,CALCEXT,rdonce)) {
|
switch (opensearchfile(name,calcpath,CALCEXT,rdonce)) {
|
||||||
case 0:
|
case 0:
|
||||||
getcommands(FALSE);
|
getcommands(FALSE);
|
||||||
|
closeinput();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
/* previously read and -once was given */
|
/* previously read and -once was given */
|
||||||
@@ -163,6 +165,13 @@ getcommands(BOOL toplevel)
|
|||||||
if (evaluate(FALSE))
|
if (evaluate(FALSE))
|
||||||
updateoldvalue(curfunc);
|
updateoldvalue(curfunc);
|
||||||
freefunc(curfunc);
|
freefunc(curfunc);
|
||||||
|
if (abort_now) {
|
||||||
|
if (!stdin_tty)
|
||||||
|
run_state = RUN_EXIT;
|
||||||
|
else if (run_state < RUN_PRE_TOP_LEVEL)
|
||||||
|
run_state = RUN_PRE_TOP_LEVEL;
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -171,8 +180,8 @@ getcommands(BOOL toplevel)
|
|||||||
/*
|
/*
|
||||||
* Evaluate a line of statements.
|
* Evaluate a line of statements.
|
||||||
* This is done by treating the current line as a function body,
|
* This is done by treating the current line as a function body,
|
||||||
* compiling it, and then executing it. Returns TRUE if the line
|
* compiling it, and then executing it. Returns TRUE if the line
|
||||||
* successfully compiled and executed. The last expression result
|
* successfully compiled and executed. The last expression result
|
||||||
* is saved in the f_savedvalue element of the current function.
|
* is saved in the f_savedvalue element of the current function.
|
||||||
* The nestflag variable should be FALSE for the outermost evaluation
|
* The nestflag variable should be FALSE for the outermost evaluation
|
||||||
* level, and TRUE for all other calls (such as the 'eval' function).
|
* level, and TRUE for all other calls (such as the 'eval' function).
|
||||||
@@ -189,22 +198,26 @@ evaluate(BOOL nestflag)
|
|||||||
|
|
||||||
funcname = (nestflag ? "**" : "*");
|
funcname = (nestflag ? "**" : "*");
|
||||||
beginfunc(funcname, nestflag);
|
beginfunc(funcname, nestflag);
|
||||||
if (nestflag)
|
if (gettoken() == T_LEFTBRACE) {
|
||||||
(void) tokenmode(TM_DEFAULT);
|
getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL, NULL_LABEL);
|
||||||
while (loop) {
|
} else {
|
||||||
switch (gettoken()) {
|
if (nestflag)
|
||||||
case T_SEMICOLON:
|
(void) tokenmode(TM_DEFAULT);
|
||||||
break;
|
rescantoken();
|
||||||
|
while (loop) {
|
||||||
|
switch (gettoken()) {
|
||||||
|
case T_SEMICOLON:
|
||||||
|
break;
|
||||||
|
case T_NEWLINE:
|
||||||
|
case T_EOF:
|
||||||
|
loop = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
case T_NEWLINE:
|
default:
|
||||||
case T_EOF:
|
rescantoken();
|
||||||
loop = 0;
|
getstatement(NULL_LABEL, NULL_LABEL,
|
||||||
break;
|
NULL_LABEL, NULL_LABEL);
|
||||||
|
}
|
||||||
default:
|
|
||||||
rescantoken();
|
|
||||||
getstatement(NULL_LABEL, NULL_LABEL,
|
|
||||||
NULL_LABEL, NULL_LABEL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
addop(OP_UNDEF);
|
addop(OP_UNDEF);
|
||||||
@@ -243,9 +256,15 @@ ungetfunction(void)
|
|||||||
case T_MULT:
|
case T_MULT:
|
||||||
rmalluserfunc();
|
rmalluserfunc();
|
||||||
continue;
|
continue;
|
||||||
default:
|
case T_NEWLINE:
|
||||||
|
case T_SEMICOLON:
|
||||||
|
case T_EOF:
|
||||||
rescantoken();
|
rescantoken();
|
||||||
return;
|
return;
|
||||||
|
default:
|
||||||
|
scanerror(T_SEMICOLON,
|
||||||
|
"Non-name arg for undefine");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -261,6 +280,8 @@ getfunction(void)
|
|||||||
{
|
{
|
||||||
char *name; /* parameter name */
|
char *name; /* parameter name */
|
||||||
int type; /* type of token read */
|
int type; /* type of token read */
|
||||||
|
LABEL label;
|
||||||
|
long index;
|
||||||
|
|
||||||
(void) tokenmode(TM_DEFAULT);
|
(void) tokenmode(TM_DEFAULT);
|
||||||
if (gettoken() != T_SYMBOL) {
|
if (gettoken() != T_SYMBOL) {
|
||||||
@@ -276,9 +297,11 @@ getfunction(void)
|
|||||||
beginfunc(name, FALSE);
|
beginfunc(name, FALSE);
|
||||||
enterfuncscope();
|
enterfuncscope();
|
||||||
if (gettoken() != T_LEFTPAREN) {
|
if (gettoken() != T_LEFTPAREN) {
|
||||||
scanerror(T_SEMICOLON, "Left parenthesis expected for function");
|
scanerror(T_SEMICOLON,
|
||||||
|
"Left parenthesis expected for function");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
index = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
type = gettoken();
|
type = gettoken();
|
||||||
if (type == T_RIGHTPAREN)
|
if (type == T_RIGHTPAREN)
|
||||||
@@ -292,12 +315,22 @@ getfunction(void)
|
|||||||
case SYM_UNDEFINED:
|
case SYM_UNDEFINED:
|
||||||
case SYM_GLOBAL:
|
case SYM_GLOBAL:
|
||||||
case SYM_STATIC:
|
case SYM_STATIC:
|
||||||
(void) addparam(name);
|
index = addparam(name);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
scanerror(T_NULL, "Parameter \"%s\" is already defined", name);
|
scanerror(T_NULL, "Parameter \"%s\" is already defined", name);
|
||||||
}
|
}
|
||||||
type = gettoken();
|
type = gettoken();
|
||||||
|
if (type == T_ASSIGN) {
|
||||||
|
clearlabel(&label);
|
||||||
|
addopone(OP_PARAMADDR, index);
|
||||||
|
addoplabel(OP_JUMPNN, &label);
|
||||||
|
getopassignment();
|
||||||
|
addop(OP_ASSIGNPOP);
|
||||||
|
setlabel(&label);
|
||||||
|
type = gettoken();
|
||||||
|
}
|
||||||
|
|
||||||
if (type == T_RIGHTPAREN)
|
if (type == T_RIGHTPAREN)
|
||||||
break;
|
break;
|
||||||
if (type != T_COMMA) {
|
if (type != T_COMMA) {
|
||||||
@@ -307,13 +340,11 @@ getfunction(void)
|
|||||||
}
|
}
|
||||||
switch (gettoken()) {
|
switch (gettoken()) {
|
||||||
case T_ASSIGN:
|
case T_ASSIGN:
|
||||||
rescantoken();
|
|
||||||
getsimplebody();
|
getsimplebody();
|
||||||
break;
|
break;
|
||||||
case T_LEFTBRACE:
|
case T_LEFTBRACE:
|
||||||
rescantoken();
|
|
||||||
getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL,
|
getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL,
|
||||||
NULL_LABEL, TRUE);
|
NULL_LABEL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
scanerror(T_NULL,
|
scanerror(T_NULL,
|
||||||
@@ -332,18 +363,9 @@ getfunction(void)
|
|||||||
static void
|
static void
|
||||||
getsimplebody(void)
|
getsimplebody(void)
|
||||||
{
|
{
|
||||||
if (gettoken() != T_ASSIGN) {
|
|
||||||
scanerror(T_SEMICOLON,
|
|
||||||
"Missing equals for simple function body");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
(void) tokenmode(TM_NEWLINES);
|
(void) tokenmode(TM_NEWLINES);
|
||||||
(void) getexprlist();
|
(void) getexprlist();
|
||||||
addop(OP_RETURN);
|
addop(OP_RETURN);
|
||||||
if (gettoken() != T_SEMICOLON)
|
|
||||||
rescantoken();
|
|
||||||
if (gettoken() != T_NEWLINE)
|
|
||||||
scanerror(T_NULL, "Illegal function definition");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -354,14 +376,10 @@ getsimplebody(void)
|
|||||||
*/
|
*/
|
||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
static void
|
static void
|
||||||
getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel, BOOL toplevel)
|
getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel)
|
||||||
{
|
{
|
||||||
int oldmode;
|
int oldmode;
|
||||||
|
|
||||||
if (gettoken() != T_LEFTBRACE) {
|
|
||||||
scanerror(T_SEMICOLON, "Missing left brace for function body");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
oldmode = tokenmode(TM_DEFAULT);
|
oldmode = tokenmode(TM_DEFAULT);
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
switch (gettoken()) {
|
switch (gettoken()) {
|
||||||
@@ -369,6 +387,10 @@ getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaul
|
|||||||
(void) tokenmode(oldmode);
|
(void) tokenmode(oldmode);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case T_EOF:
|
||||||
|
scanerror(T_NULL, "End-of-file in function body");
|
||||||
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
rescantoken();
|
rescantoken();
|
||||||
getstatement(contlabel, breaklabel, nextcaselabel, defaultlabel);
|
getstatement(contlabel, breaklabel, nextcaselabel, defaultlabel);
|
||||||
@@ -382,9 +404,11 @@ getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaul
|
|||||||
* declarations = { LOCAL | GLOBAL | STATIC } onedeclaration
|
* declarations = { LOCAL | GLOBAL | STATIC } onedeclaration
|
||||||
* [ ',' onedeclaration ] ... ';'.
|
* [ ',' onedeclaration ] ... ';'.
|
||||||
*/
|
*/
|
||||||
static void
|
static int
|
||||||
getdeclarations(int symtype)
|
getdeclarations(int symtype)
|
||||||
{
|
{
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
switch (gettoken()) {
|
switch (gettoken()) {
|
||||||
case T_COMMA:
|
case T_COMMA:
|
||||||
@@ -393,29 +417,33 @@ getdeclarations(int symtype)
|
|||||||
case T_NEWLINE:
|
case T_NEWLINE:
|
||||||
case T_SEMICOLON:
|
case T_SEMICOLON:
|
||||||
case T_RIGHTBRACE:
|
case T_RIGHTBRACE:
|
||||||
|
case T_EOF:
|
||||||
rescantoken();
|
rescantoken();
|
||||||
return;
|
return res;
|
||||||
|
|
||||||
case T_SYMBOL:
|
case T_SYMBOL:
|
||||||
addopone(OP_DEBUG, linenumber());
|
addopone(OP_DEBUG, linenumber());
|
||||||
rescantoken();
|
rescantoken();
|
||||||
getsimpledeclaration(symtype);
|
if (getsimpledeclaration(symtype))
|
||||||
|
res = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_MAT:
|
case T_MAT:
|
||||||
addopone(OP_DEBUG, linenumber());
|
addopone(OP_DEBUG, linenumber());
|
||||||
getmatdeclaration(symtype);
|
getmatdeclaration(symtype);
|
||||||
|
res = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_OBJ:
|
case T_OBJ:
|
||||||
addopone(OP_DEBUG, linenumber());
|
addopone(OP_DEBUG, linenumber());
|
||||||
getobjdeclaration(symtype);
|
getobjdeclaration(symtype);
|
||||||
addop(OP_POP);
|
addop(OP_POP);
|
||||||
|
res = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
scanerror(T_SEMICOLON, "Bad syntax in declaration statement");
|
scanerror(T_SEMICOLON, "Bad syntax in declaration statement");
|
||||||
return;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -427,22 +455,24 @@ getdeclarations(int symtype)
|
|||||||
* Subsequences end with "," or at end of line; spaces indicate
|
* Subsequences end with "," or at end of line; spaces indicate
|
||||||
* repeated assignment, e.g. "c d = 2" has the effect of "c = 2, d = 2".
|
* repeated assignment, e.g. "c d = 2" has the effect of "c = 2, d = 2".
|
||||||
*/
|
*/
|
||||||
static void
|
static int
|
||||||
getsimpledeclaration(int symtype)
|
getsimpledeclaration(int symtype)
|
||||||
{
|
{
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
switch (gettoken()) {
|
switch (gettoken()) {
|
||||||
case T_SYMBOL:
|
case T_SYMBOL:
|
||||||
rescantoken();
|
rescantoken();
|
||||||
if (getonevariable(symtype))
|
res = getonevariable(symtype);
|
||||||
|
if (res)
|
||||||
addop(OP_POP);
|
addop(OP_POP);
|
||||||
continue;
|
continue;
|
||||||
case T_COMMA:
|
case T_COMMA:
|
||||||
continue;
|
continue;
|
||||||
default:
|
default:
|
||||||
rescantoken();
|
rescantoken();
|
||||||
return;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -491,11 +521,9 @@ getonevariable(int symtype)
|
|||||||
* | BREAK ';'
|
* | BREAK ';'
|
||||||
* | RETURN assignment ';'
|
* | RETURN assignment ';'
|
||||||
* | GOTO label ';'
|
* | GOTO label ';'
|
||||||
* | MAT name '[' value [ ':' value ] [',' value [ ':' value ] ] ']' ';'
|
|
||||||
* | OBJ type '{' arg [ ',' arg ] ... '}' ] ';'
|
|
||||||
* | OBJ type name [ ',' name ] ';'
|
|
||||||
* | PRINT assignment [, assignment ] ... ';'
|
* | PRINT assignment [, assignment ] ... ';'
|
||||||
* | QUIT [ string ] ';'
|
* | QUIT [ string ] ';'
|
||||||
|
* | ABORT [ string ] ';'
|
||||||
* | SHOW item ';'
|
* | SHOW item ';'
|
||||||
* | body
|
* | body
|
||||||
* | assignment ';'
|
* | assignment ';'
|
||||||
@@ -524,18 +552,20 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
case T_GLOBAL:
|
case T_GLOBAL:
|
||||||
getdeclarations(SYM_GLOBAL);
|
(void) getdeclarations(SYM_GLOBAL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_STATIC:
|
case T_STATIC:
|
||||||
clearlabel(&label);
|
clearlabel(&label);
|
||||||
addoplabel(OP_INITSTATIC, &label);
|
addoplabel(OP_INITSTATIC, &label);
|
||||||
getdeclarations(SYM_STATIC);
|
if (getdeclarations(SYM_STATIC))
|
||||||
setlabel(&label);
|
setlabel(&label);
|
||||||
|
else
|
||||||
|
curfunc->f_opcodecount -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_LOCAL:
|
case T_LOCAL:
|
||||||
getdeclarations(SYM_LOCAL);
|
(void) getdeclarations(SYM_LOCAL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_RIGHTBRACE:
|
case T_RIGHTBRACE:
|
||||||
@@ -584,8 +614,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case T_LEFTBRACE:
|
case T_LEFTBRACE:
|
||||||
rescantoken();
|
getbody(contlabel, breaklabel, nextcaselabel, defaultlabel);
|
||||||
getbody(contlabel, breaklabel, nextcaselabel, defaultlabel, FALSE);
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case T_IF:
|
case T_IF:
|
||||||
@@ -598,25 +627,25 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
scanerror(T_SEMICOLON, "CONTINUE not within FOR, WHILE, or DO");
|
scanerror(T_SEMICOLON, "CONTINUE not within FOR, WHILE, or DO");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addoplabel(OP_JUMPNE, contlabel);
|
addoplabel(OP_JUMPNZ, contlabel);
|
||||||
break;
|
break;
|
||||||
case T_BREAK:
|
case T_BREAK:
|
||||||
if (breaklabel == NULL_LABEL) {
|
if (breaklabel == NULL_LABEL) {
|
||||||
scanerror(T_SEMICOLON, "BREAK not within FOR, WHILE, or DO");
|
scanerror(T_SEMICOLON, "BREAK not within FOR, WHILE, or DO");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addoplabel(OP_JUMPNE, breaklabel);
|
addoplabel(OP_JUMPNZ, breaklabel);
|
||||||
break;
|
break;
|
||||||
case T_GOTO:
|
case T_GOTO:
|
||||||
if (gettoken() != T_SYMBOL) {
|
if (gettoken() != T_SYMBOL) {
|
||||||
scanerror(T_SEMICOLON, "Missing label in goto");
|
scanerror(T_SEMICOLON, "Missing label in goto");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addop(OP_JUMPNE);
|
addop(OP_JUMPNZ);
|
||||||
addlabel(tokensymbol());
|
addlabel(tokensymbol());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
addoplabel(OP_JUMPEQ, &label1);
|
addoplabel(OP_JUMPZ, &label1);
|
||||||
rescantoken();
|
rescantoken();
|
||||||
getstatement(contlabel, breaklabel, NULL_LABEL, NULL_LABEL);
|
getstatement(contlabel, breaklabel, NULL_LABEL, NULL_LABEL);
|
||||||
if (gettoken() != T_ELSE) {
|
if (gettoken() != T_ELSE) {
|
||||||
@@ -667,7 +696,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
contlabel = &label1;
|
contlabel = &label1;
|
||||||
rescantoken();
|
rescantoken();
|
||||||
(void) getexprlist();
|
(void) getexprlist();
|
||||||
addoplabel(OP_JUMPNE, &label3);
|
addoplabel(OP_JUMPNZ, &label3);
|
||||||
addoplabel(OP_JUMP, breaklabel);
|
addoplabel(OP_JUMP, breaklabel);
|
||||||
if (gettoken() != T_SEMICOLON) {
|
if (gettoken() != T_SEMICOLON) {
|
||||||
(void) tokenmode(oldmode);
|
(void) tokenmode(oldmode);
|
||||||
@@ -676,14 +705,14 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (gettoken() != T_RIGHTPAREN) { /* have 'c' part */
|
if (gettoken() != T_RIGHTPAREN) { /* have 'c' part */
|
||||||
if (label1.l_offset <= 0)
|
if (label1.l_offset < 0)
|
||||||
addoplabel(OP_JUMP, &label3);
|
addoplabel(OP_JUMP, &label3);
|
||||||
setlabel(&label2);
|
setlabel(&label2);
|
||||||
contlabel = &label2;
|
contlabel = &label2;
|
||||||
rescantoken();
|
rescantoken();
|
||||||
(void) getexprlist();
|
(void) getexprlist();
|
||||||
addop(OP_POP);
|
addop(OP_POP);
|
||||||
if (label1.l_offset > 0)
|
if (label1.l_offset >= 0)
|
||||||
addoplabel(OP_JUMP, &label1);
|
addoplabel(OP_JUMP, &label1);
|
||||||
if (gettoken() != T_RIGHTPAREN) {
|
if (gettoken() != T_RIGHTPAREN) {
|
||||||
(void) tokenmode(oldmode);
|
(void) tokenmode(oldmode);
|
||||||
@@ -703,15 +732,21 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
case T_WHILE:
|
case T_WHILE:
|
||||||
oldmode = tokenmode(TM_DEFAULT);
|
oldmode = tokenmode(TM_DEFAULT);
|
||||||
contlabel = &label1;
|
contlabel = &label1;
|
||||||
breaklabel = &label2;
|
|
||||||
clearlabel(contlabel);
|
clearlabel(contlabel);
|
||||||
clearlabel(breaklabel);
|
|
||||||
setlabel(contlabel);
|
setlabel(contlabel);
|
||||||
getcondition();
|
getcondition();
|
||||||
addoplabel(OP_JUMPEQ, breaklabel);
|
if (gettoken() != T_SEMICOLON) {
|
||||||
getstatement(contlabel, breaklabel, NULL_LABEL, NULL_LABEL);
|
breaklabel = &label2;
|
||||||
addoplabel(OP_JUMP, contlabel);
|
clearlabel(breaklabel);
|
||||||
setlabel(breaklabel);
|
addoplabel(OP_JUMPZ, breaklabel);
|
||||||
|
rescantoken();
|
||||||
|
getstatement(contlabel, breaklabel,
|
||||||
|
NULL_LABEL, NULL_LABEL);
|
||||||
|
addoplabel(OP_JUMP, contlabel);
|
||||||
|
setlabel(breaklabel);
|
||||||
|
} else {
|
||||||
|
addoplabel(OP_JUMPNZ, contlabel);
|
||||||
|
}
|
||||||
(void) tokenmode(oldmode);
|
(void) tokenmode(oldmode);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -731,7 +766,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
}
|
}
|
||||||
setlabel(contlabel);
|
setlabel(contlabel);
|
||||||
getcondition();
|
getcondition();
|
||||||
addoplabel(OP_JUMPNE, &label3);
|
addoplabel(OP_JUMPNZ, &label3);
|
||||||
setlabel(breaklabel);
|
setlabel(breaklabel);
|
||||||
(void) tokenmode(oldmode);
|
(void) tokenmode(oldmode);
|
||||||
return;
|
return;
|
||||||
@@ -815,6 +850,8 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
printeol = TRUE;
|
printeol = TRUE;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
switch (gettoken()) {
|
switch (gettoken()) {
|
||||||
|
case T_RIGHTPAREN:
|
||||||
|
case T_RIGHTBRACKET:
|
||||||
case T_RIGHTBRACE:
|
case T_RIGHTBRACE:
|
||||||
case T_NEWLINE:
|
case T_NEWLINE:
|
||||||
case T_EOF:
|
case T_EOF:
|
||||||
@@ -853,8 +890,19 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case T_ABORT:
|
||||||
|
switch (gettoken()) {
|
||||||
|
case T_STRING:
|
||||||
|
addopone(OP_ABORT, tokenstring());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
addopone(OP_ABORT, -1);
|
||||||
|
rescantoken();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case T_SYMBOL:
|
case T_SYMBOL:
|
||||||
if (nextchar() == ':') { /****HACK HACK ****/
|
if (nextchar() == ':') { /****HACK HACK****/
|
||||||
definelabel(tokensymbol());
|
definelabel(tokensymbol());
|
||||||
if (gettoken() == T_RIGHTBRACE) {
|
if (gettoken() == T_RIGHTBRACE) {
|
||||||
rescantoken();
|
rescantoken();
|
||||||
@@ -908,7 +956,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
|||||||
/*
|
/*
|
||||||
* Read in an object declaration.
|
* Read in an object declaration.
|
||||||
* This is of the following form:
|
* This is of the following form:
|
||||||
* OBJ type [ '{' id [ ',' id ] ... '}' ] [ objlist ].
|
* OBJ type [ '{' id [ ',' id ] ... '}' ] [ objlist ].
|
||||||
* The OBJ keyword has already been read. Symtype is SYM_UNDEFINED if this
|
* The OBJ keyword has already been read. Symtype is SYM_UNDEFINED if this
|
||||||
* is an OBJ statement, otherwise this is part of a declaration which will
|
* is an OBJ statement, otherwise this is part of a declaration which will
|
||||||
* define new symbols with the specified type.
|
* define new symbols with the specified type.
|
||||||
@@ -966,7 +1014,11 @@ getobjdeclaration(int symtype)
|
|||||||
/*FALLTHRU*/
|
/*FALLTHRU*/
|
||||||
case T_RIGHTBRACE:
|
case T_RIGHTBRACE:
|
||||||
(void) tokenmode(oldmode);
|
(void) tokenmode(oldmode);
|
||||||
(void) defineobject(name, indices, count);
|
if (defineobject(name, indices, count)) {
|
||||||
|
scanerror(T_NULL,
|
||||||
|
"Object type \"%s\" is already defined", name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
getobjvars(name, symtype);
|
getobjvars(name, symtype);
|
||||||
return;
|
return;
|
||||||
case T_NEWLINE:
|
case T_NEWLINE:
|
||||||
@@ -988,8 +1040,7 @@ getoneobj(long index, int symtype)
|
|||||||
if (symtype == SYM_UNDEFINED) {
|
if (symtype == SYM_UNDEFINED) {
|
||||||
rescantoken();
|
rescantoken();
|
||||||
(void) getidexpr(TRUE, TRUE);
|
(void) getidexpr(TRUE, TRUE);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
symname = tokensymbol();
|
symname = tokensymbol();
|
||||||
definesymbol(symname, symtype);
|
definesymbol(symname, symtype);
|
||||||
usesymbol(symname, FALSE);
|
usesymbol(symname, FALSE);
|
||||||
@@ -1006,18 +1057,14 @@ getoneobj(long index, int symtype)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routine to collect a set of variables for the specified object type
|
* Routine to assign a specified object-type value to each of a set of
|
||||||
* and initialize them as being that type of object.
|
* variables in a "global", "local" or "static" declaration, or, if
|
||||||
* Here
|
* symtype is SYM_UNDEFINED, to create one object value of the specified
|
||||||
* objlist = name initlist [ ',' name initlist ] ... ';'.
|
* type.
|
||||||
* If symtype is SYM_UNDEFINED, then this is an OBJ statement where the
|
|
||||||
* values can be any variable expression, and no symbols are to be defined.
|
|
||||||
* Otherwise this is part of a declaration, and the variables must be raw
|
|
||||||
* symbol names which are defined with the specified symbol type.
|
|
||||||
*
|
*
|
||||||
* given:
|
* given:
|
||||||
* name object name
|
* name object name
|
||||||
* symtype type of symbol to collect for
|
* symtype declaration type
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
getobjvars(char *name, int symtype)
|
getobjvars(char *name, int symtype)
|
||||||
@@ -1031,6 +1078,8 @@ getobjvars(char *name, int symtype)
|
|||||||
}
|
}
|
||||||
for (;;) {
|
for (;;) {
|
||||||
getoneobj(index, symtype);
|
getoneobj(index, symtype);
|
||||||
|
if (symtype == SYM_UNDEFINED)
|
||||||
|
return;
|
||||||
if (gettoken() != T_COMMA) {
|
if (gettoken() != T_COMMA) {
|
||||||
rescantoken();
|
rescantoken();
|
||||||
return;
|
return;
|
||||||
@@ -1073,8 +1122,7 @@ getonematrix(int symtype)
|
|||||||
if (symtype == SYM_UNDEFINED) {
|
if (symtype == SYM_UNDEFINED) {
|
||||||
rescantoken();
|
rescantoken();
|
||||||
(void) getidexpr(FALSE, TRUE);
|
(void) getidexpr(FALSE, TRUE);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
name = tokensymbol();
|
name = tokensymbol();
|
||||||
definesymbol(name, symtype);
|
definesymbol(name, symtype);
|
||||||
usesymbol(name, FALSE);
|
usesymbol(name, FALSE);
|
||||||
@@ -1159,9 +1207,9 @@ creatematrix(void)
|
|||||||
switch (gettoken()) {
|
switch (gettoken()) {
|
||||||
case T_RIGHTBRACKET:
|
case T_RIGHTBRACKET:
|
||||||
addopone(OP_MATCREATE, dim);
|
addopone(OP_MATCREATE, dim);
|
||||||
if (gettoken() == T_LEFTBRACKET)
|
if (gettoken() == T_LEFTBRACKET) {
|
||||||
creatematrix();
|
creatematrix();
|
||||||
else {
|
} else {
|
||||||
rescantoken();
|
rescantoken();
|
||||||
addop(OP_ZERO);
|
addop(OP_ZERO);
|
||||||
}
|
}
|
||||||
@@ -1257,7 +1305,7 @@ getcondition(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Get an expression list consisting of one or more expressions,
|
* Get an expression list consisting of one or more expressions,
|
||||||
* separated by commas. The value of the list is that of the final expression.
|
* separated by commas. The value of the list is that of the final expression.
|
||||||
* This is the top level routine for parsing expressions.
|
* This is the top level routine for parsing expressions.
|
||||||
* Returns flags describing the type of the last assignment or expression found.
|
* Returns flags describing the type of the last assignment or expression found.
|
||||||
* exprlist = assignment [ ',' assignment ] ...
|
* exprlist = assignment [ ',' assignment ] ...
|
||||||
@@ -1311,8 +1359,8 @@ getopassignment(void)
|
|||||||
case T_MODEQUALS: op = OP_MOD; break;
|
case T_MODEQUALS: op = OP_MOD; break;
|
||||||
case T_ANDEQUALS: op = OP_AND; break;
|
case T_ANDEQUALS: op = OP_AND; break;
|
||||||
case T_OREQUALS: op = OP_OR; break;
|
case T_OREQUALS: op = OP_OR; break;
|
||||||
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
|
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
|
||||||
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
|
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
|
||||||
case T_POWEREQUALS: op = OP_POWER; break;
|
case T_POWEREQUALS: op = OP_POWER; break;
|
||||||
case T_HASHEQUALS: op = OP_HASHOP; break;
|
case T_HASHEQUALS: op = OP_HASHOP; break;
|
||||||
case T_TILDEEQUALS: op = OP_XOR; break;
|
case T_TILDEEQUALS: op = OP_XOR; break;
|
||||||
@@ -1323,7 +1371,7 @@ getopassignment(void)
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
if (isrvalue(type)) {
|
if (isrvalue(type)) {
|
||||||
scanerror(T_NULL, "Illegal assignment in getopassignment");
|
scanerror(T_NULL, "Illegal assignment");
|
||||||
(void) getopassignment();
|
(void) getopassignment();
|
||||||
return (EXPR_RVALUE | EXPR_ASSIGN);
|
return (EXPR_RVALUE | EXPR_ASSIGN);
|
||||||
}
|
}
|
||||||
@@ -1337,8 +1385,7 @@ getopassignment(void)
|
|||||||
while (gettoken() == T_ASSIGN)
|
while (gettoken() == T_ASSIGN)
|
||||||
getinitlist();
|
getinitlist();
|
||||||
rescantoken();
|
rescantoken();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
rescantoken();
|
rescantoken();
|
||||||
(void) getassignment();
|
(void) getassignment();
|
||||||
}
|
}
|
||||||
@@ -1353,8 +1400,8 @@ getopassignment(void)
|
|||||||
case T_MODEQUALS: op = OP_MOD; break;
|
case T_MODEQUALS: op = OP_MOD; break;
|
||||||
case T_ANDEQUALS: op = OP_AND; break;
|
case T_ANDEQUALS: op = OP_AND; break;
|
||||||
case T_OREQUALS: op = OP_OR; break;
|
case T_OREQUALS: op = OP_OR; break;
|
||||||
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
|
case T_LSHIFTEQUALS: op = OP_LEFTSHIFT; break;
|
||||||
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
|
case T_RSHIFTEQUALS: op = OP_RIGHTSHIFT; break;
|
||||||
case T_POWEREQUALS: op = OP_POWER; break;
|
case T_POWEREQUALS: op = OP_POWER; break;
|
||||||
case T_HASHEQUALS: op = OP_HASHOP; break;
|
case T_HASHEQUALS: op = OP_HASHOP; break;
|
||||||
case T_TILDEEQUALS: op = OP_XOR; break;
|
case T_TILDEEQUALS: op = OP_XOR; break;
|
||||||
@@ -1377,6 +1424,21 @@ getassignment (void)
|
|||||||
{
|
{
|
||||||
int type; /* type of expression */
|
int type; /* type of expression */
|
||||||
|
|
||||||
|
switch(gettoken()) {
|
||||||
|
case T_COMMA:
|
||||||
|
case T_SEMICOLON:
|
||||||
|
case T_NEWLINE:
|
||||||
|
case T_RIGHTPAREN:
|
||||||
|
case T_RIGHTBRACKET:
|
||||||
|
case T_RIGHTBRACE:
|
||||||
|
case T_EOF:
|
||||||
|
addop(OP_UNDEF);
|
||||||
|
rescantoken();
|
||||||
|
return EXPR_RVALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rescantoken();
|
||||||
|
|
||||||
type = getaltcond();
|
type = getaltcond();
|
||||||
|
|
||||||
switch (gettoken()) {
|
switch (gettoken()) {
|
||||||
@@ -1402,7 +1464,7 @@ getassignment (void)
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
if (isrvalue(type)) {
|
if (isrvalue(type)) {
|
||||||
scanerror(T_SEMICOLON, "Illegal assignment in getassignment");
|
scanerror(T_SEMICOLON, "Illegal assignment");
|
||||||
(void) getassignment();
|
(void) getassignment();
|
||||||
return (EXPR_RVALUE | EXPR_ASSIGN);
|
return (EXPR_RVALUE | EXPR_ASSIGN);
|
||||||
}
|
}
|
||||||
@@ -1441,7 +1503,7 @@ getaltcond(void)
|
|||||||
}
|
}
|
||||||
clearlabel(&donelab);
|
clearlabel(&donelab);
|
||||||
clearlabel(&altlab);
|
clearlabel(&altlab);
|
||||||
addoplabel(OP_JUMPEQ, &altlab);
|
addoplabel(OP_JUMPZ, &altlab);
|
||||||
type = getaltcond();
|
type = getaltcond();
|
||||||
if (gettoken() != T_COLON) {
|
if (gettoken() != T_COLON) {
|
||||||
scanerror(T_SEMICOLON, "Missing colon for conditional expression");
|
scanerror(T_SEMICOLON, "Missing colon for conditional expression");
|
||||||
@@ -1684,7 +1746,7 @@ getshiftexpr(void)
|
|||||||
case T_NOT: op = OP_NOT; break;
|
case T_NOT: op = OP_NOT; break;
|
||||||
case T_DIV: op = OP_INVERT; break;
|
case T_DIV: op = OP_INVERT; break;
|
||||||
case T_BACKSLASH: op = OP_BACKSLASH; break;
|
case T_BACKSLASH: op = OP_BACKSLASH; break;
|
||||||
case T_TILDE: op = OP_COMP; break;
|
case T_TILDE: op = OP_COMP; break;
|
||||||
case T_HASH: op = OP_CONTENT; break;
|
case T_HASH: op = OP_CONTENT; break;
|
||||||
}
|
}
|
||||||
if (op) {
|
if (op) {
|
||||||
@@ -1697,7 +1759,7 @@ getshiftexpr(void)
|
|||||||
switch (gettoken()) {
|
switch (gettoken()) {
|
||||||
case T_POWER: op = OP_POWER; break;
|
case T_POWER: op = OP_POWER; break;
|
||||||
case T_LEFTSHIFT: op = OP_LEFTSHIFT; break;
|
case T_LEFTSHIFT: op = OP_LEFTSHIFT; break;
|
||||||
case T_RIGHTSHIFT: op = OP_RIGHTSHIFT; break;
|
case T_RIGHTSHIFT: op = OP_RIGHTSHIFT; break;
|
||||||
default:
|
default:
|
||||||
rescantoken();
|
rescantoken();
|
||||||
return type;
|
return type;
|
||||||
@@ -1861,11 +1923,6 @@ getterm(void)
|
|||||||
|
|
||||||
case T_MAT:
|
case T_MAT:
|
||||||
getonematrix(SYM_UNDEFINED);
|
getonematrix(SYM_UNDEFINED);
|
||||||
while (gettoken() == T_COMMA) {
|
|
||||||
addop(OP_POP);
|
|
||||||
getonematrix(SYM_UNDEFINED);
|
|
||||||
}
|
|
||||||
rescantoken();
|
|
||||||
type = EXPR_ASSIGN;
|
type = EXPR_ASSIGN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2130,7 +2187,7 @@ getmatargs(void)
|
|||||||
/*
|
/*
|
||||||
* Normal indexing with the indexes separated by commas.
|
* Normal indexing with the indexes separated by commas.
|
||||||
* Initialize the flag in the opcode to assume that the array
|
* Initialize the flag in the opcode to assume that the array
|
||||||
* element will only be referenced for reading. If the parser
|
* element will only be referenced for reading. If the parser
|
||||||
* finds that the element will be referenced for writing, then
|
* finds that the element will be referenced for writing, then
|
||||||
* it will call writeindexop to change the flag in the opcode.
|
* it will call writeindexop to change the flag in the opcode.
|
||||||
*/
|
*/
|
||||||
|
51
comfunc.c
51
comfunc.c
@@ -138,38 +138,6 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
|||||||
|
|
||||||
up1 = up2 = 0;
|
up1 = up2 = 0;
|
||||||
sign = (R & 64) != 0;
|
sign = (R & 64) != 0;
|
||||||
#if 0
|
|
||||||
if (qiszero(epsilon)) {
|
|
||||||
aes = qsquare(c->real);
|
|
||||||
bes = qsquare(c->imag);
|
|
||||||
v = qqadd(aes, bes);
|
|
||||||
qfree(aes);
|
|
||||||
qfree(bes);
|
|
||||||
u = qsqrt(v, epsilon, 0);
|
|
||||||
qfree(v);
|
|
||||||
if (qiszero(u)) {
|
|
||||||
qfree(u);
|
|
||||||
return clink(&_czero_);
|
|
||||||
}
|
|
||||||
aes = qqadd(u, c->real);
|
|
||||||
qfree(u);
|
|
||||||
bes = qscale(aes, -1);
|
|
||||||
qfree(aes);
|
|
||||||
u = qsqrt(bes, epsilon, R);
|
|
||||||
qfree(bes);
|
|
||||||
if (qiszero(u)) {
|
|
||||||
qfree(u);
|
|
||||||
return clink(&_czero_);
|
|
||||||
}
|
|
||||||
aes = qscale(c->imag, -1);
|
|
||||||
v = qqdiv(aes, u);
|
|
||||||
qfree(aes);
|
|
||||||
r = comalloc();
|
|
||||||
r->real = u;
|
|
||||||
r->imag = v;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
imsign = c->imag->num.sign;
|
imsign = c->imag->num.sign;
|
||||||
es = qsquare(epsilon);
|
es = qsquare(epsilon);
|
||||||
aes = qqdiv(c->real, es);
|
aes = qqdiv(c->real, es);
|
||||||
@@ -231,8 +199,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
s3 = zquo(tmp3, d, &tmp1, s2 < 0);
|
s3 = zquo(tmp3, d, &tmp1, s2 < 0);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
s2 = zquo(tmp1, d, &tmp3, s1 ? (s1 < 0) : 16);
|
s2 = zquo(tmp1, d, &tmp3, s1 ? (s1 < 0) : 16);
|
||||||
zfree(tmp1);
|
zfree(tmp1);
|
||||||
s3 = zsqrt(tmp3,&tmp1,(s1||s2) ? (s1<0 || s2<0) : 16);
|
s3 = zsqrt(tmp3,&tmp1,(s1||s2) ? (s1<0 || s2<0) : 16);
|
||||||
@@ -256,8 +223,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
|||||||
up2 = -1;
|
up2 = -1;
|
||||||
zfree(tmp1);
|
zfree(tmp1);
|
||||||
zfree(aa);
|
zfree(aa);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
s1 = zsqrt(tmp3, &cc, 0);
|
s1 = zsqrt(tmp3, &cc, 0);
|
||||||
zfree(tmp3);
|
zfree(tmp3);
|
||||||
zadd(cc, a, &tmp1);
|
zadd(cc, a, &tmp1);
|
||||||
@@ -288,8 +254,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
s3 = zquo(tmp3, d, &mul1, 0);
|
s3 = zquo(tmp3, d, &mul1, 0);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
s2 = zquo(tmp1, d, &tmp3, 0);
|
s2 = zquo(tmp1, d, &tmp3, 0);
|
||||||
zfree(tmp1);
|
zfree(tmp1);
|
||||||
s3 = zsqrt(tmp3, &mul1, 0);
|
s3 = zsqrt(tmp3, &mul1, 0);
|
||||||
@@ -335,9 +300,9 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
|||||||
zfree(mul2);
|
zfree(mul2);
|
||||||
mul2 = tmp2;
|
mul2 = tmp2;
|
||||||
}
|
}
|
||||||
if (ziszero(mul1))
|
if (ziszero(mul1)) {
|
||||||
u = qlink(&_qzero_);
|
u = qlink(&_qzero_);
|
||||||
else {
|
} else {
|
||||||
mul1.sign = sign ^ epsilon->num.sign;
|
mul1.sign = sign ^ epsilon->num.sign;
|
||||||
u = qalloc();
|
u = qalloc();
|
||||||
zreduce(mul1, epsilon->den, &tmp2, &u->den);
|
zreduce(mul1, epsilon->den, &tmp2, &u->den);
|
||||||
@@ -345,9 +310,9 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
|||||||
zfree(tmp2);
|
zfree(tmp2);
|
||||||
}
|
}
|
||||||
zfree(mul1);
|
zfree(mul1);
|
||||||
if (ziszero(mul2))
|
if (ziszero(mul2)) {
|
||||||
v = qlink(&_qzero_);
|
v = qlink(&_qzero_);
|
||||||
else {
|
} else {
|
||||||
mul2.sign = imsign ^ sign ^ epsilon->num.sign;
|
mul2.sign = imsign ^ sign ^ epsilon->num.sign;
|
||||||
v = qalloc();
|
v = qalloc();
|
||||||
zreduce(mul2, epsilon->den, &tmp2, &v->den);
|
zreduce(mul2, epsilon->den, &tmp2, &v->den);
|
||||||
@@ -1149,5 +1114,3 @@ cprintfr(COMPLEX *c)
|
|||||||
zprintval(i->den, 0L, 0L);
|
zprintval(i->den, 0L, 0L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* END CODE */
|
|
||||||
|
@@ -69,7 +69,7 @@ csub(COMPLEX *c1, COMPLEX *c2)
|
|||||||
/*
|
/*
|
||||||
* Multiply two complex numbers.
|
* Multiply two complex numbers.
|
||||||
* This saves one multiplication over the obvious algorithm by
|
* This saves one multiplication over the obvious algorithm by
|
||||||
* trading it for several extra additions, as follows. Let
|
* trading it for several extra additions, as follows. Let
|
||||||
* q1 = (a + b) * (c + d)
|
* q1 = (a + b) * (c + d)
|
||||||
* q2 = a * c
|
* q2 = a * c
|
||||||
* q3 = b * d
|
* q3 = b * d
|
||||||
|
80
config.c
80
config.c
@@ -48,13 +48,14 @@ NAMETYPE configs[] = {
|
|||||||
{"maxerr", CONFIG_MAXSCAN}, /* old name for maxscan */
|
{"maxerr", CONFIG_MAXSCAN}, /* old name for maxscan */
|
||||||
{"prompt", CONFIG_PROMPT},
|
{"prompt", CONFIG_PROMPT},
|
||||||
{"more", CONFIG_MORE},
|
{"more", CONFIG_MORE},
|
||||||
{"blkmaxprint", CONFIG_BLKMAXPRINT},
|
{"blkmaxprint", CONFIG_BLKMAXPRINT},
|
||||||
{"blkverbose", CONFIG_BLKVERBOSE},
|
{"blkverbose", CONFIG_BLKVERBOSE},
|
||||||
{"blkbase", CONFIG_BLKBASE},
|
{"blkbase", CONFIG_BLKBASE},
|
||||||
{"blkfmt", CONFIG_BLKFMT},
|
{"blkfmt", CONFIG_BLKFMT},
|
||||||
{"lib_debug", CONFIG_LIB_DEBUG},
|
{"lib_debug", CONFIG_LIB_DEBUG},
|
||||||
{"calc_debug", CONFIG_CALC_DEBUG},
|
{"calc_debug", CONFIG_CALC_DEBUG},
|
||||||
{"user_debug", CONFIG_USER_DEBUG},
|
{"user_debug", CONFIG_USER_DEBUG},
|
||||||
|
{"verbose_quit",CONFIG_VERBOSE_QUIT},
|
||||||
{NULL, 0}
|
{NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -93,9 +94,10 @@ CONFIG oldstd = { /* backward compatible standard configuration */
|
|||||||
FALSE, /* skip duplicate block output lines */
|
FALSE, /* skip duplicate block output lines */
|
||||||
BLK_BASE_HEX, /* block octet print base */
|
BLK_BASE_HEX, /* block octet print base */
|
||||||
BLK_FMT_HD_STYLE, /* block output format */
|
BLK_FMT_HD_STYLE, /* block output format */
|
||||||
3, /* calc library debug level */
|
|
||||||
0, /* internal calc debug level */
|
0, /* internal calc debug level */
|
||||||
0 /* user defined debug level */
|
3, /* calc library debug level */
|
||||||
|
0, /* user defined debug level */
|
||||||
|
TRUE /* print Quit or abort executed messages */
|
||||||
};
|
};
|
||||||
CONFIG newstd = { /* new non-backward compatible configuration */
|
CONFIG newstd = { /* new non-backward compatible configuration */
|
||||||
MODE_INITIAL, /* current output mode */
|
MODE_INITIAL, /* current output mode */
|
||||||
@@ -128,9 +130,10 @@ CONFIG newstd = { /* new non-backward compatible configuration */
|
|||||||
FALSE, /* skip duplicate block output lines */
|
FALSE, /* skip duplicate block output lines */
|
||||||
BLK_BASE_HEX, /* block octet print base */
|
BLK_BASE_HEX, /* block octet print base */
|
||||||
BLK_FMT_HD_STYLE, /* block output format */
|
BLK_FMT_HD_STYLE, /* block output format */
|
||||||
3, /* calc library debug level */
|
|
||||||
0, /* internal calc debug level */
|
0, /* internal calc debug level */
|
||||||
0 /* user defined debug level */
|
3, /* calc library debug level */
|
||||||
|
0, /* user defined debug level */
|
||||||
|
TRUE /* print Quit or abort executed messages */
|
||||||
};
|
};
|
||||||
CONFIG *conf = NULL; /* loaded in at startup - current configuration */
|
CONFIG *conf = NULL; /* loaded in at startup - current configuration */
|
||||||
|
|
||||||
@@ -145,7 +148,7 @@ static NAMETYPE modes[] = {
|
|||||||
{"int", MODE_INT},
|
{"int", MODE_INT},
|
||||||
{"real", MODE_REAL},
|
{"real", MODE_REAL},
|
||||||
{"exp", MODE_EXP},
|
{"exp", MODE_EXP},
|
||||||
{"hexadecimal", MODE_HEX},
|
{"hexadecimal", MODE_HEX},
|
||||||
{"hex", MODE_HEX},
|
{"hex", MODE_HEX},
|
||||||
{"octal", MODE_OCTAL},
|
{"octal", MODE_OCTAL},
|
||||||
{"oct", MODE_OCTAL},
|
{"oct", MODE_OCTAL},
|
||||||
@@ -181,7 +184,7 @@ static NAMETYPE truth[] = {
|
|||||||
* Possible block base output modes
|
* Possible block base output modes
|
||||||
*/
|
*/
|
||||||
static NAMETYPE blk_base[] = {
|
static NAMETYPE blk_base[] = {
|
||||||
{"hexadecimal", BLK_BASE_HEX},
|
{"hexadecimal", BLK_BASE_HEX},
|
||||||
{"hex", BLK_BASE_HEX},
|
{"hex", BLK_BASE_HEX},
|
||||||
{"octal", BLK_BASE_OCT},
|
{"octal", BLK_BASE_OCT},
|
||||||
{"oct", BLK_BASE_OCT},
|
{"oct", BLK_BASE_OCT},
|
||||||
@@ -358,7 +361,7 @@ setconfig(int type, VALUE *vp)
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case CONFIG_ALL:
|
case CONFIG_ALL:
|
||||||
newconf = NULL; /* firewall */
|
newconf = NULL; /* firewall */
|
||||||
if (vp->v_type == V_STR) {
|
if (vp->v_type == V_STR) {
|
||||||
if (strcmp(vp->v_str->s_str, "oldstd") == 0) {
|
if (strcmp(vp->v_str->s_str, "oldstd") == 0) {
|
||||||
newconf = &oldstd;
|
newconf = &oldstd;
|
||||||
@@ -806,20 +809,6 @@ setconfig(int type, VALUE *vp)
|
|||||||
conf->blkfmt = temp;
|
conf->blkfmt = temp;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONFIG_LIB_DEBUG:
|
|
||||||
if (vp->v_type != V_NUM) {
|
|
||||||
math_error("Non numeric for lib_debug");
|
|
||||||
/*NOTREACHED*/
|
|
||||||
}
|
|
||||||
q = vp->v_num;
|
|
||||||
temp = qtoi(q);
|
|
||||||
if (qisfrac(q) || !zistiny(q->num)) {
|
|
||||||
math_error("Illegal lib_debug parameter value");
|
|
||||||
/*NOTREACHED*/
|
|
||||||
}
|
|
||||||
conf->lib_debug = temp;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CONFIG_CALC_DEBUG:
|
case CONFIG_CALC_DEBUG:
|
||||||
if (vp->v_type != V_NUM) {
|
if (vp->v_type != V_NUM) {
|
||||||
math_error("Non numeric for calc_debug");
|
math_error("Non numeric for calc_debug");
|
||||||
@@ -834,6 +823,20 @@ setconfig(int type, VALUE *vp)
|
|||||||
conf->calc_debug = temp;
|
conf->calc_debug = temp;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CONFIG_LIB_DEBUG:
|
||||||
|
if (vp->v_type != V_NUM) {
|
||||||
|
math_error("Non numeric for lib_debug");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
q = vp->v_num;
|
||||||
|
temp = qtoi(q);
|
||||||
|
if (qisfrac(q) || !zistiny(q->num)) {
|
||||||
|
math_error("Illegal lib_debug parameter value");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
conf->lib_debug = temp;
|
||||||
|
break;
|
||||||
|
|
||||||
case CONFIG_USER_DEBUG:
|
case CONFIG_USER_DEBUG:
|
||||||
if (vp->v_type != V_NUM) {
|
if (vp->v_type != V_NUM) {
|
||||||
math_error("Non numeric for user_debug");
|
math_error("Non numeric for user_debug");
|
||||||
@@ -848,6 +851,21 @@ setconfig(int type, VALUE *vp)
|
|||||||
conf->user_debug = temp;
|
conf->user_debug = temp;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CONFIG_VERBOSE_QUIT:
|
||||||
|
if (vp->v_type == V_NUM) {
|
||||||
|
q = vp->v_num;
|
||||||
|
conf->verbose_quit = !qiszero(q);
|
||||||
|
} else if (vp->v_type == V_STR) {
|
||||||
|
temp = truthtype(vp->v_str->s_str);
|
||||||
|
if (temp < 0) {
|
||||||
|
math_error("Illegal truth value"
|
||||||
|
"for verbose_quit");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
conf->verbose_quit = (int)temp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
math_error("Setting illegal config parameter");
|
math_error("Setting illegal config parameter");
|
||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
@@ -982,6 +1000,7 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
|
|||||||
* convert element to value
|
* convert element to value
|
||||||
*/
|
*/
|
||||||
vp->v_type = V_NUM;
|
vp->v_type = V_NUM;
|
||||||
|
vp->v_subtype = V_NOSUBTYPE;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case CONFIG_ALL:
|
case CONFIG_ALL:
|
||||||
vp->v_type = V_CONFIG;
|
vp->v_type = V_CONFIG;
|
||||||
@@ -1107,18 +1126,22 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
|
|||||||
i = cfg->blkfmt;
|
i = cfg->blkfmt;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONFIG_LIB_DEBUG:
|
|
||||||
i = cfg->lib_debug;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CONFIG_CALC_DEBUG:
|
case CONFIG_CALC_DEBUG:
|
||||||
i = cfg->calc_debug;
|
i = cfg->calc_debug;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CONFIG_LIB_DEBUG:
|
||||||
|
i = cfg->lib_debug;
|
||||||
|
break;
|
||||||
|
|
||||||
case CONFIG_USER_DEBUG:
|
case CONFIG_USER_DEBUG:
|
||||||
i = cfg->user_debug;
|
i = cfg->user_debug;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CONFIG_VERBOSE_QUIT:
|
||||||
|
i = cfg->verbose_quit;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
math_error("Getting illegal CONFIG element");
|
math_error("Getting illegal CONFIG element");
|
||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
@@ -1192,7 +1215,8 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
|
|||||||
cfg1->blkverbose != cfg2->blkverbose ||
|
cfg1->blkverbose != cfg2->blkverbose ||
|
||||||
cfg1->blkbase != cfg2->blkbase ||
|
cfg1->blkbase != cfg2->blkbase ||
|
||||||
cfg1->blkfmt != cfg2->blkfmt ||
|
cfg1->blkfmt != cfg2->blkfmt ||
|
||||||
cfg1->lib_debug != cfg2->lib_debug ||
|
|
||||||
cfg1->calc_debug != cfg2->calc_debug ||
|
cfg1->calc_debug != cfg2->calc_debug ||
|
||||||
cfg1->user_debug != cfg2->user_debug;
|
cfg1->lib_debug != cfg2->lib_debug ||
|
||||||
|
cfg1->user_debug != cfg2->user_debug ||
|
||||||
|
cfg1->verbose_quit != cfg2->verbose_quit;
|
||||||
}
|
}
|
||||||
|
77
config.h
77
config.h
@@ -20,20 +20,18 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Prior to calc 2.9.3t9, these routines existed as a calc library called
|
* Prior to calc 2.9.3t9, these routines existed as a calc library called
|
||||||
* cryrand.cal. They have been rewritten in C for performance as well
|
* cryrand.cal. They have been rewritten in C for performance as well
|
||||||
* as to make them available directly from libcalc.a.
|
* as to make them available directly from libcalc.a.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -54,11 +52,11 @@
|
|||||||
#define CONFIG_EPSILON 3
|
#define CONFIG_EPSILON 3
|
||||||
#define CONFIG_EPSILONPREC 3 /* not a real type -- tied to CONFIG_EPSILON */
|
#define CONFIG_EPSILONPREC 3 /* not a real type -- tied to CONFIG_EPSILON */
|
||||||
#define CONFIG_TRACE 4
|
#define CONFIG_TRACE 4
|
||||||
#define CONFIG_MAXPRINT 5
|
#define CONFIG_MAXPRINT 5
|
||||||
#define CONFIG_MUL2 6
|
#define CONFIG_MUL2 6
|
||||||
#define CONFIG_SQ2 7
|
#define CONFIG_SQ2 7
|
||||||
#define CONFIG_POW2 8
|
#define CONFIG_POW2 8
|
||||||
#define CONFIG_REDC2 9
|
#define CONFIG_REDC2 9
|
||||||
#define CONFIG_TILDE 10
|
#define CONFIG_TILDE 10
|
||||||
#define CONFIG_TAB 11
|
#define CONFIG_TAB 11
|
||||||
#define CONFIG_QUOMOD 12
|
#define CONFIG_QUOMOD 12
|
||||||
@@ -68,10 +66,10 @@
|
|||||||
#define CONFIG_APPR 16
|
#define CONFIG_APPR 16
|
||||||
#define CONFIG_CFAPPR 17
|
#define CONFIG_CFAPPR 17
|
||||||
#define CONFIG_CFSIM 18
|
#define CONFIG_CFSIM 18
|
||||||
#define CONFIG_OUTROUND 19
|
#define CONFIG_OUTROUND 19
|
||||||
#define CONFIG_ROUND 20
|
#define CONFIG_ROUND 20
|
||||||
#define CONFIG_LEADZERO 21
|
#define CONFIG_LEADZERO 21
|
||||||
#define CONFIG_FULLZERO 22
|
#define CONFIG_FULLZERO 22
|
||||||
#define CONFIG_MAXSCAN 23
|
#define CONFIG_MAXSCAN 23
|
||||||
#define CONFIG_PROMPT 24
|
#define CONFIG_PROMPT 24
|
||||||
#define CONFIG_MORE 25
|
#define CONFIG_MORE 25
|
||||||
@@ -82,21 +80,20 @@
|
|||||||
#define CONFIG_LIB_DEBUG 30
|
#define CONFIG_LIB_DEBUG 30
|
||||||
#define CONFIG_CALC_DEBUG 31
|
#define CONFIG_CALC_DEBUG 31
|
||||||
#define CONFIG_USER_DEBUG 32
|
#define CONFIG_USER_DEBUG 32
|
||||||
|
#define CONFIG_VERBOSE_QUIT 33
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* config defult symbols
|
* config default symbols
|
||||||
*/
|
*/
|
||||||
#define DISPLAY_DEFAULT 20 /* default digits for float display */
|
#define DISPLAY_DEFAULT 20 /* default digits for float display */
|
||||||
#define EPSILON_DEFAULT "1e-20" /* allowed error for float calculations */
|
#define EPSILON_DEFAULT "1e-20" /* allowed error for float calculations */
|
||||||
#define EPSILONPREC_DEFAULT 67 /* 67 ==> 2^-67 <= EPSILON_DEFAULT < 2^-66 */
|
#define EPSILONPREC_DEFAULT 67 /* 67 ==> 2^-67 <= EPSILON_DEFAULT < 2^-66 */
|
||||||
#define NEW_EPSILON_DEFAULT "1e-10" /* newstd EPSILON_DEFAULT */
|
#define NEW_EPSILON_DEFAULT "1e-10" /* newstd EPSILON_DEFAULT */
|
||||||
#define NEW_EPSILONPREC_DEFAULT 34 /* 34 ==> 2^-34 <= 1e-10 < 2^-33 */
|
#define NEW_EPSILONPREC_DEFAULT 34 /* 34 ==> 2^-34 <= 1e-10 < 2^-33 */
|
||||||
#define MAXPRINT_DEFAULT 16 /* default number of elements printed */
|
#define MAXPRINT_DEFAULT 16 /* default number of elements printed */
|
||||||
#define MAXSCANCOUNT 20 /* default max scan errors before an abort */
|
#define MAXSCANCOUNT 20 /* default max scan errors before an abort */
|
||||||
|
|
||||||
#define ERRMAX 20 /* default errmax value */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* configuration object
|
* configuration object
|
||||||
@@ -118,8 +115,8 @@ struct config {
|
|||||||
LEN sq2; /* size of number to use square algorithm 2 */
|
LEN sq2; /* size of number to use square algorithm 2 */
|
||||||
LEN pow2; /* size of modulus to use REDC for powers */
|
LEN pow2; /* size of modulus to use REDC for powers */
|
||||||
LEN redc2; /* size of modulus to use REDC algorithm 2 */
|
LEN redc2; /* size of modulus to use REDC algorithm 2 */
|
||||||
int tilde_ok; /* ok to print a tilde on aproximations */
|
BOOL tilde_ok; /* ok to print a tilde on aproximations */
|
||||||
int tab_ok; /* ok to print tab before numeric values */
|
BOOL tab_ok; /* ok to print tab before numeric values */
|
||||||
long quomod; /* quomod() default rounding mode */
|
long quomod; /* quomod() default rounding mode */
|
||||||
long quo; /* quotent // default rounding mode */
|
long quo; /* quotent // default rounding mode */
|
||||||
long mod; /* mod % default rounding mode */
|
long mod; /* mod % default rounding mode */
|
||||||
@@ -129,20 +126,41 @@ struct config {
|
|||||||
long cfsim; /* cfsim() default rounding mode */
|
long cfsim; /* cfsim() default rounding mode */
|
||||||
long outround; /* output default rounding mode */
|
long outround; /* output default rounding mode */
|
||||||
long round; /* round()/bround() default rounding mode */
|
long round; /* round()/bround() default rounding mode */
|
||||||
int leadzero; /* ok to print leading 0 before decimal pt */
|
BOOL leadzero; /* ok to print leading 0 before decimal pt */
|
||||||
int fullzero; /* ok to print trailing 0's */
|
BOOL fullzero; /* ok to print trailing 0's */
|
||||||
long maxscancount; /* max scan errors before abort */
|
long maxscancount; /* max scan errors before abort */
|
||||||
char *prompt1; /* normal prompt */
|
char *prompt1; /* normal prompt */
|
||||||
char *prompt2; /* prompt when inside multi-line input */
|
char *prompt2; /* prompt when inside multi-line input */
|
||||||
int blkmaxprint; /* octets of a block to print, 0 => all */
|
int blkmaxprint; /* octets of a block to print, 0 => all */
|
||||||
int blkverbose; /* TRUE => print all lines if a block */
|
BOOL blkverbose; /* TRUE => print all lines if a block */
|
||||||
int blkbase; /* block output base */
|
int blkbase; /* block output base */
|
||||||
int blkfmt; /* block output style */
|
int blkfmt; /* block output style */
|
||||||
int lib_debug; /* library debug: <0 none, 0 default, >0 more */
|
long calc_debug; /* internal debug, see CALC_DEBUG_XXX below */
|
||||||
int calc_debug; /* internal debug: <0 none, 0 default,>0 more */
|
long lib_debug; /* library debug, see LIB_DEBUG_XXX below */
|
||||||
int user_debug; /* user defined debug value: 0 default */
|
long user_debug; /* user defined debug value: 0 default */
|
||||||
|
BOOL verbose_quit; /* TRUE => print Quit or abort executed msg */
|
||||||
};
|
};
|
||||||
typedef struct config CONFIG;
|
typedef struct config CONFIG;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* lib_debug bit masks
|
||||||
|
*/
|
||||||
|
#define LIBDBG_STDIN_FUNC (0x00000001) /* interactive func define debug */
|
||||||
|
#define LIBDBG_FILE_FUNC (0x00000002) /* file read func define debug */
|
||||||
|
#define LIBDBG_MASK (0x00000003)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* calc_debug bit masks
|
||||||
|
*/
|
||||||
|
#define CALCDBG_SYSTEM (0x00000001) /* print system cmd prior to exec */
|
||||||
|
#define CALCDBG_FUNC_QUIT (0x00000002) /* active functions when quit */
|
||||||
|
#define CALCDBG_HASH_STATE (0x00000004) /* hash state details */
|
||||||
|
#define CALCDBG_BLOCK (0x00000008) /* block debug */
|
||||||
|
#define CALCDBG_TTY (0x00000010) /* report TTY state changes */
|
||||||
|
#define CALCDBG_RUNSTATE (0x00000020) /* report run_state changes */
|
||||||
|
#define CALCDBG_MASK (0x0000003f)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -151,6 +169,9 @@ typedef struct config CONFIG;
|
|||||||
extern CONFIG *conf; /* current configuration */
|
extern CONFIG *conf; /* current configuration */
|
||||||
extern CONFIG oldstd; /* backward compatible standard configuration */
|
extern CONFIG oldstd; /* backward compatible standard configuration */
|
||||||
extern CONFIG newstd; /* new non-backward compatible configuration */
|
extern CONFIG newstd; /* new non-backward compatible configuration */
|
||||||
|
extern char *calc_debug; /* !=NULL => value of config("calc_debug") */
|
||||||
|
extern char *lib_debug; /* !=NULL => value of config("lib_debug") */
|
||||||
|
extern char *user_debug; /* !=NULL => value of config("user_debug") */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
12
custom.c
12
custom.c
@@ -20,16 +20,14 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* these include files are needed regardless of CUSTOM */
|
/* these include files are needed regardless of CUSTOM */
|
||||||
@@ -119,7 +117,7 @@ showcustom(void)
|
|||||||
{
|
{
|
||||||
#if defined(CUSTOM)
|
#if defined(CUSTOM)
|
||||||
|
|
||||||
CONST struct custom *p; /* current function */
|
CONST struct custom *p; /* current function */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* disable custom functions unless -C was given
|
* disable custom functions unless -C was given
|
||||||
|
13
custom.h
13
custom.h
@@ -20,23 +20,20 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Prior to calc 2.9.3t9, these routines existed as a calc library called
|
* Prior to calc 2.9.3t9, these routines existed as a calc library called
|
||||||
* cryrand.cal. They have been rewritten in C for performance as well
|
* cryrand.cal. They have been rewritten in C for performance as well
|
||||||
* as to make them available directly from libcalc.a.
|
* as to make them available directly from libcalc.a.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Be careful what you put in this file, upper .c files include
|
* Be careful what you put in this file, upper .c files include
|
||||||
* this file even when CUSTOM is not defined (ALLOW_CUSTOM is empty).
|
* this file even when CUSTOM is not defined (ALLOW_CUSTOM is empty).
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1997 Landon Curt Noll
|
# Copyright (c) 1999 Landon Curt Noll
|
||||||
#
|
#
|
||||||
# Permission to use, copy, modify, and distribute this software and
|
# Permission to use, copy, modify, and distribute this software and
|
||||||
# its documentation for any purpose and without fee is hereby granted,
|
# its documentation for any purpose and without fee is hereby granted,
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
# PERFORMANCE OF THIS SOFTWARE.
|
# PERFORMANCE OF THIS SOFTWARE.
|
||||||
#
|
#
|
||||||
# chongo was here /\../\ chongo@toad.com
|
# chongo was here /\../\ http://reality.sgi.com/chongo/
|
||||||
|
|
||||||
The following custom calc library files are provided because they serve
|
The following custom calc library files are provided because they serve
|
||||||
as examples of how use the custom interface. The custom interface
|
as examples of how use the custom interface. The custom interface
|
||||||
@@ -44,8 +44,19 @@ calc library standards and guidelines.
|
|||||||
|
|
||||||
=-=
|
=-=
|
||||||
|
|
||||||
|
argv.cal
|
||||||
|
|
||||||
|
argv(var, ...)
|
||||||
|
|
||||||
|
print information about various args
|
||||||
|
|
||||||
halflen.cal
|
halflen.cal
|
||||||
|
|
||||||
halflen(num)
|
halflen(num)
|
||||||
|
|
||||||
Calculate the length of a numeric value in HALF's.
|
Calculate the length of a numeric value in HALF's.
|
||||||
|
|
||||||
|
pzasusb8.cal
|
||||||
|
|
||||||
|
Run custom("pzasusb8") on a standard set of data, print Endian
|
||||||
|
related information and print value size information.
|
||||||
|
@@ -6,7 +6,7 @@ Step 0: Determine if is should it be done?
|
|||||||
multi-precision calculations in a C-like environment. You should
|
multi-precision calculations in a C-like environment. You should
|
||||||
consider implementing algorithms in the calc language as a first
|
consider implementing algorithms in the calc language as a first
|
||||||
choice. Sometimes an algorithm requires use of special hardware, a
|
choice. Sometimes an algorithm requires use of special hardware, a
|
||||||
non-portable OS or pre-compiled C library. In these cases a custom
|
non-portable OS or pre-compiled C library. In these cases a custom
|
||||||
interface may be needed.
|
interface may be needed.
|
||||||
|
|
||||||
The custom function interface is intended to make is easy for
|
The custom function interface is intended to make is easy for
|
||||||
@@ -38,17 +38,17 @@ Step 1: Do some background work
|
|||||||
you look at some examples of custom functions. Check out
|
you look at some examples of custom functions. Check out
|
||||||
the following source files:
|
the following source files:
|
||||||
|
|
||||||
../custom.c
|
custom.c
|
||||||
custom.h
|
custom/custom.h
|
||||||
custtbl.c
|
custom/custtbl.c
|
||||||
c_*.[ch]
|
custom/c_*.[ch]
|
||||||
../help/custom
|
help/custom (or run: calc help custom)
|
||||||
|
|
||||||
You would be well advised to look at a more recent calc source
|
You would be well advised to look at a more recent calc source
|
||||||
such as one available in from the calc alpha test archive.
|
such as one available in from the calc version archive.
|
||||||
See the following for more details:
|
See the following for more details:
|
||||||
|
|
||||||
../help/archive
|
help/archive (or run: calc help archive)
|
||||||
|
|
||||||
|
|
||||||
Step 2: Name your custom function
|
Step 2: Name your custom function
|
||||||
@@ -184,7 +184,7 @@ Step 5: Write your custom function
|
|||||||
The 3 args are passed in by the custom interface
|
The 3 args are passed in by the custom interface
|
||||||
and have the following meaning:
|
and have the following meaning:
|
||||||
|
|
||||||
name The name of the custom function that
|
name The name of the custom function that
|
||||||
was called. In particular, this is the first
|
was called. In particular, this is the first
|
||||||
string arg that was given to the custom()
|
string arg that was given to the custom()
|
||||||
builtin. This is the equivalent of argv[0] for
|
builtin. This is the equivalent of argv[0] for
|
||||||
@@ -215,11 +215,11 @@ Step 5: Write your custom function
|
|||||||
|
|
||||||
custom("curds", a, b, c)
|
custom("curds", a, b, c)
|
||||||
|
|
||||||
would cause vals to point to the following array:
|
would cause vals to point to the following array:
|
||||||
|
|
||||||
vals[0] points to a
|
vals[0] points to a
|
||||||
vals[1] points to b
|
vals[1] points to b
|
||||||
vals[2] points to c
|
vals[2] points to c
|
||||||
|
|
||||||
c) The return value is the function must be a VALUE.
|
c) The return value is the function must be a VALUE.
|
||||||
|
|
||||||
@@ -247,7 +247,7 @@ Step 5: Write your custom function
|
|||||||
|
|
||||||
The VALUE is a union of major value types found inside calc.
|
The VALUE is a union of major value types found inside calc.
|
||||||
The v_type VALUE element determines which union element is
|
The v_type VALUE element determines which union element is
|
||||||
being used. Assume that we have:
|
being used. Assume that we have:
|
||||||
|
|
||||||
VALUE *vp;
|
VALUE *vp;
|
||||||
|
|
||||||
@@ -427,12 +427,12 @@ Step 6: Register the function in the custom interface table
|
|||||||
level Makefile, one does not have unsatisfied symbols.
|
level Makefile, one does not have unsatisfied symbols.
|
||||||
|
|
||||||
The brief description should be brief so that 'show custom' looks well
|
The brief description should be brief so that 'show custom' looks well
|
||||||
formatted. If the brief description cannot fit on the same line as
|
formatted. If the brief description cannot fit on the same line as
|
||||||
the name without wrapping on a 80 col window, the description is
|
the name without wrapping on a 80 col window, the description is
|
||||||
probably too long and will not look nice in the show custom output.
|
probably too long and will not look nice in the show custom output.
|
||||||
|
|
||||||
The minargs places a lower bound on the number of args that
|
The minargs places a lower bound on the number of args that
|
||||||
must be supplied to the interface. This does NOT count
|
must be supplied to the interface. This does NOT count
|
||||||
the name argument given to custom(). So if minargs is 2:
|
the name argument given to custom(). So if minargs is 2:
|
||||||
|
|
||||||
custom("curds") /* call blocked at high level interface */
|
custom("curds") /* call blocked at high level interface */
|
||||||
@@ -604,3 +604,16 @@ Step 11: Install
|
|||||||
|
|
||||||
Although calc does not run setuid, you may need to be root to install
|
Although calc does not run setuid, you may need to be root to install
|
||||||
the directories into which calc installs may be write protected.
|
the directories into which calc installs may be write protected.
|
||||||
|
|
||||||
|
|
||||||
|
Step 12: Contribute
|
||||||
|
|
||||||
|
Your custom function may be of interest to some people and/or
|
||||||
|
serve as an example of what one can do with custom functions.
|
||||||
|
|
||||||
|
Read the file:
|
||||||
|
|
||||||
|
help/contrib (or run: calc help contrib)
|
||||||
|
|
||||||
|
and consider submitting your custom function for possible
|
||||||
|
inclusion in later versions of calc.
|
||||||
|
@@ -22,16 +22,14 @@
|
|||||||
# PERFORMANCE OF THIS SOFTWARE.
|
# PERFORMANCE OF THIS SOFTWARE.
|
||||||
#
|
#
|
||||||
# Comments, suggestions, bug fixes and questions about these routines
|
# Comments, suggestions, bug fixes and questions about these routines
|
||||||
# are welcome. Send EMail to the address given below.
|
# are welcome. Send EMail to the address given below.
|
||||||
#
|
#
|
||||||
# Happy bit twiddling,
|
# Happy bit twiddling,
|
||||||
#
|
#
|
||||||
# Landon Curt Noll
|
# Landon Curt Noll
|
||||||
|
# http://reality.sgi.com/chongo/
|
||||||
#
|
#
|
||||||
# chongo@toad.com
|
# chongo <was here> /\../\
|
||||||
# ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
#
|
|
||||||
# chongo was here /\../\
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-#
|
#-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-#
|
||||||
@@ -148,7 +146,7 @@ DEBUG= -O
|
|||||||
# BSD NO_SHARED=
|
# BSD NO_SHARED=
|
||||||
# SYSV NO_SHARED= -dn
|
# SYSV NO_SHARED= -dn
|
||||||
# IRIX NO_SHARED= -non_shared
|
# IRIX NO_SHARED= -non_shared
|
||||||
# disable NO_SHARED=
|
# disable NO_SHARED=
|
||||||
#
|
#
|
||||||
# If in doubt, use NO_SHARED=
|
# If in doubt, use NO_SHARED=
|
||||||
#
|
#
|
||||||
@@ -170,7 +168,7 @@ RANLIB=:
|
|||||||
# a default here just in case you want to build from this directory.
|
# a default here just in case you want to build from this directory.
|
||||||
#
|
#
|
||||||
# Normally certain files depend on the Makefile. If the Makefile is
|
# Normally certain files depend on the Makefile. If the Makefile is
|
||||||
# changed, then certain steps should be redone. If MAKE_FILE is
|
# changed, then certain steps should be redone. If MAKE_FILE is
|
||||||
# set to Makefile, then these files will depend on Makefile. If
|
# set to Makefile, then these files will depend on Makefile. If
|
||||||
# MAKE_FILE is empty, they they wont.
|
# MAKE_FILE is empty, they they wont.
|
||||||
#
|
#
|
||||||
@@ -194,7 +192,7 @@ MAKE_FILE= Makefile
|
|||||||
#
|
#
|
||||||
# By default, custom builtin functions may only be executed if calc
|
# By default, custom builtin functions may only be executed if calc
|
||||||
# is given the -C option. This is because custom builtin functions
|
# is given the -C option. This is because custom builtin functions
|
||||||
# may invoke non-standard or non-portable code. One may completely
|
# may invoke non-standard or non-portable code. One may completely
|
||||||
# disable custom builtin functions by not compiling any of code
|
# disable custom builtin functions by not compiling any of code
|
||||||
#
|
#
|
||||||
# ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given
|
# ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given
|
||||||
@@ -312,6 +310,15 @@ libcustcalc.a: ${CUSTCALC_OBJ} ${MAKE_FILE} ../Makefile
|
|||||||
ar qc libcustcalc.a ${CUSTCALC_OBJ}
|
ar qc libcustcalc.a ${CUSTCALC_OBJ}
|
||||||
${RANLIB} libcustcalc.a
|
${RANLIB} libcustcalc.a
|
||||||
|
|
||||||
|
##
|
||||||
|
#
|
||||||
|
# Special .o files
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
c_sysinfo.o: c_sysinfo.c ${MAKE_FILE}
|
||||||
|
${CC} ${CFLAGS} c_sysinfo.c -c
|
||||||
|
|
||||||
##
|
##
|
||||||
#
|
#
|
||||||
# used by the upper level Makefile
|
# used by the upper level Makefile
|
||||||
@@ -326,28 +333,24 @@ libcustcalc.a: ${CUSTCALC_OBJ} ${MAKE_FILE} ../Makefile
|
|||||||
|
|
||||||
##
|
##
|
||||||
#
|
#
|
||||||
# File list generation. You can ignore this section.
|
# File list generation. You can ignore this section.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# We will form the names of source files as if they were in a
|
# We will form the names of source files as if they were in a
|
||||||
# sub-directory called calc/lib.
|
# sub-directory called calc/lib.
|
||||||
#
|
#
|
||||||
# NOTE: Due to bogus shells found on one common system we must have
|
# NOTE: Due to bogus shells found on one common system we must have
|
||||||
# an non-emoty else clause for every if condition. *sigh*
|
# an non-emoty else clause for every if condition. *sigh*
|
||||||
#
|
#
|
||||||
##
|
##
|
||||||
|
|
||||||
distlist: ${DISTLIST}
|
distlist: ${DISTLIST}
|
||||||
${Q}for i in ${DISTLIST}; do \
|
${Q}for i in ${DISTLIST}; do \
|
||||||
echo calc/custom/$$i; \
|
echo custom/$$i; \
|
||||||
done
|
done
|
||||||
|
|
||||||
# The bsdi distribution has generated files as well as distributed files.
|
distdir:
|
||||||
#
|
${Q}echo custom
|
||||||
bsdilist: ${DISTLIST}
|
|
||||||
${Q}for i in ${DISTLIST}; do \
|
|
||||||
echo calc/custom/$$i; \
|
|
||||||
done
|
|
||||||
|
|
||||||
##
|
##
|
||||||
#
|
#
|
||||||
@@ -373,7 +376,7 @@ depend:
|
|||||||
${Q}mkdir skel
|
${Q}mkdir skel
|
||||||
${Q}mkdir skel/custom
|
${Q}mkdir skel/custom
|
||||||
-${Q}for i in ${C_SRC}; do \
|
-${Q}for i in ${C_SRC}; do \
|
||||||
${SED} -n '/^#[ ]*include[ ]*"/p' \
|
${SED} -n '/^#[ ]*include[ ]*"/p' \
|
||||||
"$$i" > "skel/custom/$$i"; \
|
"$$i" > "skel/custom/$$i"; \
|
||||||
done
|
done
|
||||||
-${Q}for i in /dev/null ${H_SRC}; do \
|
-${Q}for i in /dev/null ${H_SRC}; do \
|
||||||
@@ -421,9 +424,13 @@ depend:
|
|||||||
else \
|
else \
|
||||||
rm -f Makefile.tmp; \
|
rm -f Makefile.tmp; \
|
||||||
mv Makefile Makefile.tmp; \
|
mv Makefile Makefile.tmp; \
|
||||||
sccs edit Makefile; \
|
if [ -d RCS ]; then \
|
||||||
|
co -l Makefile; \
|
||||||
|
fi ;\
|
||||||
mv Makefile.tmp Makefile; \
|
mv Makefile.tmp Makefile; \
|
||||||
echo new 'custom Makefile formed -- you need to check it in'; \
|
if [ -d RCS ]; then \
|
||||||
|
echo 'new custom Makefile formed -- you need to check it in'; \
|
||||||
|
fi; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
##
|
##
|
||||||
@@ -590,8 +597,28 @@ c_help.o: ../string.h
|
|||||||
c_help.o: ../value.h
|
c_help.o: ../value.h
|
||||||
c_help.o: ../zmath.h
|
c_help.o: ../zmath.h
|
||||||
c_help.o: c_help.c
|
c_help.o: c_help.c
|
||||||
|
c_pzasusb8.o: ../alloc.h
|
||||||
|
c_pzasusb8.o: ../block.h
|
||||||
|
c_pzasusb8.o: ../byteswap.h
|
||||||
|
c_pzasusb8.o: ../calcerr.h
|
||||||
|
c_pzasusb8.o: ../cmath.h
|
||||||
|
c_pzasusb8.o: ../config.h
|
||||||
c_pzasusb8.o: ../custom.h
|
c_pzasusb8.o: ../custom.h
|
||||||
|
c_pzasusb8.o: ../endian_calc.h
|
||||||
|
c_pzasusb8.o: ../hash.h
|
||||||
c_pzasusb8.o: ../have_const.h
|
c_pzasusb8.o: ../have_const.h
|
||||||
|
c_pzasusb8.o: ../have_malloc.h
|
||||||
|
c_pzasusb8.o: ../have_memmv.h
|
||||||
|
c_pzasusb8.o: ../have_newstr.h
|
||||||
|
c_pzasusb8.o: ../have_stdlib.h
|
||||||
|
c_pzasusb8.o: ../have_string.h
|
||||||
|
c_pzasusb8.o: ../longbits.h
|
||||||
|
c_pzasusb8.o: ../md5.h
|
||||||
|
c_pzasusb8.o: ../nametype.h
|
||||||
|
c_pzasusb8.o: ../qmath.h
|
||||||
|
c_pzasusb8.o: ../shs.h
|
||||||
|
c_pzasusb8.o: ../shs1.h
|
||||||
|
c_pzasusb8.o: ../string.h
|
||||||
c_pzasusb8.o: ../value.h
|
c_pzasusb8.o: ../value.h
|
||||||
c_pzasusb8.o: ../zmath.h
|
c_pzasusb8.o: ../zmath.h
|
||||||
c_pzasusb8.o: c_pzasusb8.c
|
c_pzasusb8.o: c_pzasusb8.c
|
||||||
|
10
custom/argv
10
custom/argv
@@ -23,11 +23,11 @@ DESCRIPTION
|
|||||||
EXAMPLE
|
EXAMPLE
|
||||||
> foo=5^713; bar=17; baz=list(2,3,4);
|
> foo=5^713; bar=17; baz=list(2,3,4);
|
||||||
> custom("argv", foo, bar, baz, 3+4.5i, pi())
|
> custom("argv", foo, bar, baz, 3+4.5i, pi())
|
||||||
arg[0] rational_value size=1 sizeof=272
|
arg[0] rational_value size=1 sizeof=272
|
||||||
arg[1] rational_value size=1 sizeof=68
|
arg[1] rational_value size=1 sizeof=68
|
||||||
arg[2] list size=3 sizeof=256
|
arg[2] list size=3 sizeof=256
|
||||||
arg[3] complex_value size=1 sizeof=140
|
arg[3] complex_value size=1 sizeof=140
|
||||||
arg[4] rational_value size=1 sizeof=84
|
arg[4] rational_value size=1 sizeof=84
|
||||||
5
|
5
|
||||||
|
|
||||||
LIMITS
|
LIMITS
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* chongo was here /\../\ chongo@toad.com
|
* chongo was here /\../\ http://reality.sgi.com/chongo/
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* argv - print information about various args
|
* argv - print information about various args
|
||||||
|
@@ -11,16 +11,14 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(CUSTOM)
|
#if defined(CUSTOM)
|
||||||
@@ -100,13 +98,13 @@ c_argv(char *name, int count, VALUE **vals)
|
|||||||
case V_FILE: /* opened file id */
|
case V_FILE: /* opened file id */
|
||||||
type = "file";
|
type = "file";
|
||||||
break;
|
break;
|
||||||
case V_RAND: /* address of additive 55 random state */
|
case V_RAND: /* address of additive 55 random state */
|
||||||
type = "rand_state";
|
type = "rand_state";
|
||||||
break;
|
break;
|
||||||
case V_RANDOM: /* address of Blum random state */
|
case V_RANDOM: /* address of Blum random state */
|
||||||
type = "random_state";
|
type = "random_state";
|
||||||
break;
|
break;
|
||||||
case V_CONFIG: /* configuration state */
|
case V_CONFIG: /* configuration state */
|
||||||
type = "config_state";
|
type = "config_state";
|
||||||
break;
|
break;
|
||||||
case V_HASH: /* hash state */
|
case V_HASH: /* hash state */
|
||||||
@@ -117,7 +115,7 @@ c_argv(char *name, int count, VALUE **vals)
|
|||||||
break;
|
break;
|
||||||
#if 0
|
#if 0
|
||||||
/* XXX - V_OCTET is subject to change */
|
/* XXX - V_OCTET is subject to change */
|
||||||
case V_OCTET: /* octet (unsigned char) */
|
case V_OCTET: /* octet (unsigned char) */
|
||||||
type = "octet";
|
type = "octet";
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -11,16 +11,14 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(CUSTOM)
|
#if defined(CUSTOM)
|
||||||
|
@@ -11,16 +11,14 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(CUSTOM)
|
#if defined(CUSTOM)
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
* Permission to use, copy, modify, and distribute this software and
|
* Permission to use, copy, modify, and distribute this software and
|
||||||
* its documentation for any purpose and without fee is hereby granted.
|
* its documentation for any purpose and without fee is hereby granted.
|
||||||
*
|
*
|
||||||
* Ernest Bowen, following Landon Curt Noll
|
* Ernest Bowen, following Landon Curt Noll
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(CUSTOM)
|
#if defined(CUSTOM)
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
*
|
*
|
||||||
* given:
|
* given:
|
||||||
* count = 1;
|
* count = 1;
|
||||||
* vals[0] real number;
|
* vals[0] real number;
|
||||||
*
|
*
|
||||||
* returns:
|
* returns:
|
||||||
* null
|
* null
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
VALUE
|
VALUE
|
||||||
c_pzasusb8(char *name, int count, VALUE **vals)
|
c_pzasusb8(char *name, int count, VALUE **vals)
|
||||||
{
|
{
|
||||||
VALUE result; /* what we will return */
|
VALUE result; /* what we will return */
|
||||||
ZVALUE z; /* numerator of the value */
|
ZVALUE z; /* numerator of the value */
|
||||||
long half_cnt; /* number of HALFs in the numerator */
|
long half_cnt; /* number of HALFs in the numerator */
|
||||||
USB8 *h; /* octet pointer */
|
USB8 *h; /* octet pointer */
|
||||||
|
@@ -11,16 +11,14 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(CUSTOM)
|
#if defined(CUSTOM)
|
||||||
@@ -35,6 +33,7 @@
|
|||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
#include "../calc.h"
|
#include "../calc.h"
|
||||||
#include "../longbits.h"
|
#include "../longbits.h"
|
||||||
|
#define CHECK_L_FORMAT
|
||||||
#include "../longlong.h"
|
#include "../longlong.h"
|
||||||
#include "../block.h"
|
#include "../block.h"
|
||||||
#include "../calcerr.h"
|
#include "../calcerr.h"
|
||||||
@@ -110,7 +109,6 @@ static struct infoname sys_info[] = {
|
|||||||
{"MAXLABELS", "max number of user labels in function", NULL, (FULL)MAXLABELS},
|
{"MAXLABELS", "max number of user labels in function", NULL, (FULL)MAXLABELS},
|
||||||
{"MAXLEN", "longest storage size allowed", NULL, (FULL)MAXLEN},
|
{"MAXLEN", "longest storage size allowed", NULL, (FULL)MAXLEN},
|
||||||
{"MAXLONG", "largest long val", NULL, (FULL)MAXLONG},
|
{"MAXLONG", "largest long val", NULL, (FULL)MAXLONG},
|
||||||
{"MAXOBJECTS", "max number of object types", NULL, (FULL)MAXOBJECTS},
|
|
||||||
{"MAXPRINT_DEFAULT", "default number of elements printed", NULL, (FULL)MAXPRINT_DEFAULT},
|
{"MAXPRINT_DEFAULT", "default number of elements printed", NULL, (FULL)MAXPRINT_DEFAULT},
|
||||||
{"MAXREDC", "number of entries in REDC cache", NULL, (FULL)MAXREDC},
|
{"MAXREDC", "number of entries in REDC cache", NULL, (FULL)MAXREDC},
|
||||||
{"MAXSCANCOUNT", "default max scan errors before an abort", NULL, (FULL)MAXSCANCOUNT},
|
{"MAXSCANCOUNT", "default max scan errors before an abort", NULL, (FULL)MAXSCANCOUNT},
|
||||||
@@ -309,17 +307,33 @@ static void
|
|||||||
dump_name_value(void)
|
dump_name_value(void)
|
||||||
{
|
{
|
||||||
struct infoname *p; /* current infoname */
|
struct infoname *p; /* current infoname */
|
||||||
|
char *fmt; /* printf value format */
|
||||||
|
|
||||||
/* dump the entire table */
|
/* dump the entire table */
|
||||||
for (p = sys_info; p->name != NULL; ++p) {
|
for (p = sys_info; p->name != NULL; ++p) {
|
||||||
if (p->str == NULL) {
|
if (p->str == NULL) {
|
||||||
#if LONG_BITS == FULL_BITS || FULL_BITS == 32 || !defined(HAVE_LONGLONG)
|
#if LONG_BITS == FULL_BITS || FULL_BITS == 32 || !defined(HAVE_LONGLONG)
|
||||||
printf("%s%-23s\t%-8lu\t(0x%lx)\n",
|
fmt = "%s%-23s\t%-8lu\t(0x%lx)\n";
|
||||||
|
printf(fmt,
|
||||||
(conf->tab_ok ? "\t" : ""), p->name,
|
(conf->tab_ok ? "\t" : ""), p->name,
|
||||||
(unsigned long)p->nmbr,
|
(unsigned long)p->nmbr,
|
||||||
(unsigned long)p->nmbr);
|
(unsigned long)p->nmbr);
|
||||||
#else
|
#else
|
||||||
printf("%s%-23s\t%-8llu\t(0x%llx)\n",
|
/*
|
||||||
|
* Determine of %ld can print a 64 bit long long.
|
||||||
|
*
|
||||||
|
* Some systems that can make use of %ld to print a
|
||||||
|
* a 64 bit value do not support the %lld type.
|
||||||
|
* So we will only try %lld if %ld does not work.
|
||||||
|
*/
|
||||||
|
if (l_format < 0) {
|
||||||
|
/* %ld prints lower 32 bits only, use %lld */
|
||||||
|
fmt = "%s%-23s\t%-8llu\t(0x%llx)\n";
|
||||||
|
} else {
|
||||||
|
/* %ld prints all 64 bits, use %ld */
|
||||||
|
fmt = "%s%-23s\t%-8lu\t(0x%lx)\n";
|
||||||
|
}
|
||||||
|
printf(fmt,
|
||||||
(conf->tab_ok ? "\t" : ""), p->name,
|
(conf->tab_ok ? "\t" : ""), p->name,
|
||||||
(unsigned long long)p->nmbr,
|
(unsigned long long)p->nmbr,
|
||||||
(unsigned long long)p->nmbr);
|
(unsigned long long)p->nmbr);
|
||||||
@@ -340,17 +354,33 @@ static void
|
|||||||
dump_mening_value(void)
|
dump_mening_value(void)
|
||||||
{
|
{
|
||||||
struct infoname *p; /* current infoname */
|
struct infoname *p; /* current infoname */
|
||||||
|
char *fmt; /* printf value format */
|
||||||
|
|
||||||
/* dump the entire table */
|
/* dump the entire table */
|
||||||
for (p = sys_info; p->name != NULL; ++p) {
|
for (p = sys_info; p->name != NULL; ++p) {
|
||||||
if (p->str == NULL) {
|
if (p->str == NULL) {
|
||||||
#if LONG_BITS == FULL_BITS || FULL_BITS == 32 || !defined(HAVE_LONGLONG)
|
#if LONG_BITS == FULL_BITS || FULL_BITS == 32 || !defined(HAVE_LONGLONG)
|
||||||
printf("%s%-36.36s\t%-8lu\t(0x%lx)\n",
|
fmt = "%s%-36.36s\t%-8lu\t(0x%lx)\n";
|
||||||
|
printf(fmt,
|
||||||
(conf->tab_ok ? "\t" : ""), p->meaning,
|
(conf->tab_ok ? "\t" : ""), p->meaning,
|
||||||
(unsigned long)p->nmbr,
|
(unsigned long)p->nmbr,
|
||||||
(unsigned long)p->nmbr);
|
(unsigned long)p->nmbr);
|
||||||
#else
|
#else
|
||||||
printf("%s%-36.36s\t%-8llu\t(0x%llx)\n",
|
/*
|
||||||
|
* Determine of %ld can print a 64 bit long long.
|
||||||
|
*
|
||||||
|
* Some systems that can make use of %ld to print a
|
||||||
|
* a 64 bit value do not support the %lld type.
|
||||||
|
* So we will only try %lld if %ld does not work.
|
||||||
|
*/
|
||||||
|
if (l_format < 0) {
|
||||||
|
/* %ld prints lower 32 bits only, use %lld */
|
||||||
|
fmt = "%s%-36.36s\t%-8llu\t(0x%llx)\n";
|
||||||
|
} else {
|
||||||
|
/* %ld prints all 64 bits, use %ld */
|
||||||
|
fmt = "%s%-36.36s\t%-8lu\t(0x%lx)\n";
|
||||||
|
}
|
||||||
|
printf(fmt,
|
||||||
(conf->tab_ok ? "\t" : ""), p->meaning,
|
(conf->tab_ok ? "\t" : ""), p->meaning,
|
||||||
(unsigned long long)p->nmbr,
|
(unsigned long long)p->nmbr,
|
||||||
(unsigned long long)p->nmbr);
|
(unsigned long long)p->nmbr);
|
||||||
|
@@ -20,16 +20,14 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* Comments, suggestions, bug fixes and questions about these routines
|
* Comments, suggestions, bug fixes and questions about these routines
|
||||||
* are welcome. Send EMail to the address given below.
|
* are welcome. Send EMail to the address given below.
|
||||||
*
|
*
|
||||||
* Happy bit twiddling,
|
* Happy bit twiddling,
|
||||||
*
|
*
|
||||||
* Landon Curt Noll
|
* Landon Curt Noll
|
||||||
|
* http://reality.sgi.com/chongo/
|
||||||
*
|
*
|
||||||
* chongo@toad.com
|
* chongo <was here> /\../\
|
||||||
* ...!{pyramid,sun,uunet}!hoptoad!chongo
|
|
||||||
*
|
|
||||||
* chongo was here /\../\
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -39,7 +37,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: See the file CUSTOM for instructions on how to add
|
* NOTE: See the file CUSTOM for instructions on how to add
|
||||||
* custom functions.
|
* custom functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@@ -10,7 +10,7 @@ TYPES
|
|||||||
return null
|
return null
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
This custom function does nothing. It is intented for testing
|
This custom function does nothing. It is intented for testing
|
||||||
of the general custom interface.
|
of the general custom interface.
|
||||||
|
|
||||||
EXAMPLE
|
EXAMPLE
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*
|
*
|
||||||
* chongo was here /\../\ chongo@toad.com
|
* chongo was here /\../\ http://reality.sgi.com/chongo/
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* halflen - determine the length of numeric value in HALFs
|
* halflen - determine the length of numeric value in HALFs
|
||||||
|
@@ -11,7 +11,7 @@ TYPES
|
|||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
This custom function prints out the numerator of a real value
|
This custom function prints out the numerator of a real value
|
||||||
in octets. Each HALF value is printed in a separate line.
|
in octets. Each HALF value is printed in a separate line.
|
||||||
|
|
||||||
NOTE: The output will vary depending on the size of a HALF
|
NOTE: The output will vary depending on the size of a HALF
|
||||||
and the byte order of the system. See:
|
and the byte order of the system. See:
|
||||||
@@ -26,15 +26,15 @@ DESCRIPTION
|
|||||||
|
|
||||||
EXAMPLE
|
EXAMPLE
|
||||||
> custom("pzasusb8", 0x01020304050607080910111213141516);
|
> custom("pzasusb8", 0x01020304050607080910111213141516);
|
||||||
0: 13141516
|
0: 13141516
|
||||||
1: 09101112
|
1: 09101112
|
||||||
2: 05060708
|
2: 05060708
|
||||||
3: 01020304
|
3: 01020304
|
||||||
|
|
||||||
> custom("pzasusb8", 10^25)
|
> custom("pzasusb8", 10^25)
|
||||||
0: 4a000000
|
0: 4a000000
|
||||||
1: 16140148
|
1: 16140148
|
||||||
2: 00084595
|
2: 00084595
|
||||||
|
|
||||||
> printf("%x\n", 10^25);
|
> printf("%x\n", 10^25);
|
||||||
0x84595161401484a000000
|
0x84595161401484a000000
|
||||||
|
@@ -27,3 +27,5 @@ print "BIG_ENDIAN: ", custom("sysinfo", "BIG_ENDIAN");
|
|||||||
print "LITTLE_ENDIAN: ", custom("sysinfo", "LITTLE_ENDIAN");
|
print "LITTLE_ENDIAN: ", custom("sysinfo", "LITTLE_ENDIAN");
|
||||||
print "LONG_BITS: ", custom("sysinfo", "LONG_BITS");
|
print "LONG_BITS: ", custom("sysinfo", "LONG_BITS");
|
||||||
print "LONGLONG_BITS: ", custom("sysinfo", "LONGLONG_BITS");
|
print "LONGLONG_BITS: ", custom("sysinfo", "LONGLONG_BITS");
|
||||||
|
print "Calc sizes:";
|
||||||
|
show sizes;
|
||||||
|
56
file.c
56
file.c
@@ -19,7 +19,7 @@
|
|||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "calcerr.h"
|
#include "calcerr.h"
|
||||||
|
|
||||||
#define READSIZE 1024 /* buffer size for reading */
|
#define READSIZE 1024 /* buffer size for reading */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* external STDIO functions
|
* external STDIO functions
|
||||||
@@ -34,7 +34,7 @@ extern FILE *f_open(char *name, char *mode);
|
|||||||
* and cannot be closed. Their file ids are always 0, 1, and 2.
|
* and cannot be closed. Their file ids are always 0, 1, and 2.
|
||||||
*/
|
*/
|
||||||
static FILEIO files[MAXFILES] = {
|
static FILEIO files[MAXFILES] = {
|
||||||
{FILEID_STDIN, NULL, (dev_t)0, (ino_t)0,
|
{FILEID_STDIN, NULL, (dev_t)0, (ino_t)0,
|
||||||
"(stdin)", TRUE, FALSE, 'r', "r"},
|
"(stdin)", TRUE, FALSE, 'r', "r"},
|
||||||
{FILEID_STDOUT, NULL, (dev_t)0, (ino_t)0,
|
{FILEID_STDOUT, NULL, (dev_t)0, (ino_t)0,
|
||||||
"(stdout)", FALSE, TRUE, 'w', "w"},
|
"(stdout)", FALSE, TRUE, 'w', "w"},
|
||||||
@@ -43,7 +43,7 @@ static FILEIO files[MAXFILES] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int ioindex[MAXFILES] = {0,1,2}; /* Indices for FILEIO table */
|
static int ioindex[MAXFILES] = {0,1,2}; /* Indices for FILEIO table */
|
||||||
static FILEID lastid = FILEID_STDERR; /* Last allocated file id */
|
static FILEID lastid = FILEID_STDERR; /* Last allocated file id */
|
||||||
static int idnum = 3; /* Number of allocated file ids */
|
static int idnum = 3; /* Number of allocated file ids */
|
||||||
|
|
||||||
@@ -115,15 +115,14 @@ file_init(void)
|
|||||||
*/
|
*/
|
||||||
if (fstat(i, &sbuf) >= 0) {
|
if (fstat(i, &sbuf) >= 0) {
|
||||||
fp = (FILE *) fdopen(i,"r+"); /*guess mode*/
|
fp = (FILE *) fdopen(i,"r+"); /*guess mode*/
|
||||||
if (fp)
|
if (fp) {
|
||||||
strcpy(files[idnum].mode, "r+");
|
strcpy(files[idnum].mode, "r+");
|
||||||
else {
|
} else {
|
||||||
fp = (FILE *) fdopen(i, "r");
|
fp = (FILE *) fdopen(i, "r");
|
||||||
if (fp) {
|
if (fp) {
|
||||||
strcpy(files[idnum].mode, "r");
|
strcpy(files[idnum].mode, "r");
|
||||||
files[idnum].writing = FALSE;
|
files[idnum].writing = FALSE;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
fp = (FILE *) fdopen(i, "w");
|
fp = (FILE *) fdopen(i, "w");
|
||||||
if (fp) {
|
if (fp) {
|
||||||
strcpy(files[idnum].mode, "w?");
|
strcpy(files[idnum].mode, "w?");
|
||||||
@@ -399,7 +398,7 @@ indexid(long index)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Close the specified file id. Returns TRUE if there was an error.
|
* Close the specified file id. Returns TRUE if there was an error.
|
||||||
* Closing of stdin, stdout, or stderr is illegal, but closing of already
|
* Closing of stdin, stdout, or stderr is illegal, but closing of already
|
||||||
* closed files is allowed.
|
* closed files is allowed.
|
||||||
*/
|
*/
|
||||||
@@ -537,7 +536,7 @@ flushall(void)
|
|||||||
*
|
*
|
||||||
* bit 0: at newline
|
* bit 0: at newline
|
||||||
* bit 1: at null character
|
* bit 1: at null character
|
||||||
* bit 2: at white space (also skips leading white space)
|
* bit 2: at white space (also skips leading white space)
|
||||||
*
|
*
|
||||||
* If neither '\n' nor '\0' is encountered reading continues until EOF.
|
* If neither '\n' nor '\0' is encountered reading continues until EOF.
|
||||||
* If bit 3 is set the stop character is removed.
|
* If bit 3 is set the stop character is removed.
|
||||||
@@ -726,7 +725,7 @@ printid(FILEID id, int flags)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Print a formatted string similar to printf. Various formats of output
|
* Print a formatted string similar to printf. Various formats of output
|
||||||
* are possible, depending on the format string AND the actual types of the
|
* are possible, depending on the format string AND the actual types of the
|
||||||
* values. Mismatches do not cause errors, instead something reasonable is
|
* values. Mismatches do not cause errors, instead something reasonable is
|
||||||
* printed instead. The output goes to the file with the specified id.
|
* printed instead. The output goes to the file with the specified id.
|
||||||
@@ -885,13 +884,14 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
|
|||||||
math_str((char *)
|
math_str((char *)
|
||||||
vp->v_nblock
|
vp->v_nblock
|
||||||
->blk->data);
|
->blk->data);
|
||||||
} else if (printchar) {
|
} else if (printchar) {
|
||||||
if (vp->v_nblock->blk->data !=
|
if (vp->v_nblock->blk->data !=
|
||||||
NULL)
|
NULL)
|
||||||
math_chr(*vp->v_nblock->
|
math_chr(*vp->v_nblock->
|
||||||
blk->data);
|
blk->data);
|
||||||
} else
|
} else {
|
||||||
printvalue(vp, PRINT_NORMAL);
|
printvalue(vp, PRINT_NORMAL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printvalue(vp, PRINT_NORMAL);
|
printvalue(vp, PRINT_NORMAL);
|
||||||
@@ -1294,7 +1294,7 @@ getloc(FILEID id, ZVALUE *res)
|
|||||||
*/
|
*/
|
||||||
fiop = findid(id, 0);
|
fiop = findid(id, 0);
|
||||||
if (fiop == NULL) {
|
if (fiop == NULL) {
|
||||||
/* file not open */
|
/* file not open */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fp = fiop->fp;
|
fp = fiop->fp;
|
||||||
@@ -1467,7 +1467,7 @@ setloc(FILEID id, ZVALUE zpos)
|
|||||||
*/
|
*/
|
||||||
fiop = findid(id, 0);
|
fiop = findid(id, 0);
|
||||||
if (fiop == NULL) {
|
if (fiop == NULL) {
|
||||||
/* file not open */
|
/* file not open */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fp = fiop->fp;
|
fp = fiop->fp;
|
||||||
@@ -1635,7 +1635,7 @@ getsize(FILEID id, ZVALUE *res)
|
|||||||
*/
|
*/
|
||||||
fiop = findid(id, 0);
|
fiop = findid(id, 0);
|
||||||
if (fiop == NULL) {
|
if (fiop == NULL) {
|
||||||
/* file not open */
|
/* file not open */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fp = fiop->fp;
|
fp = fiop->fp;
|
||||||
@@ -1671,7 +1671,7 @@ get_device(FILEID id, ZVALUE *dev)
|
|||||||
*/
|
*/
|
||||||
fiop = findid(id, 0);
|
fiop = findid(id, 0);
|
||||||
if (fiop == NULL) {
|
if (fiop == NULL) {
|
||||||
/* file not open */
|
/* file not open */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1704,7 +1704,7 @@ get_inode(FILEID id, ZVALUE *inode)
|
|||||||
*/
|
*/
|
||||||
fiop = findid(id, 0);
|
fiop = findid(id, 0);
|
||||||
if (fiop == NULL) {
|
if (fiop == NULL) {
|
||||||
/* file not open */
|
/* file not open */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1770,8 +1770,7 @@ showfiles(void)
|
|||||||
if (fstat(fileno(fp), &sbuf) < 0) {
|
if (fstat(fileno(fp), &sbuf) < 0) {
|
||||||
printf("Bad fstat for file %d\n", (int) fiop->id);
|
printf("Bad fstat for file %d\n", (int) fiop->id);
|
||||||
sizes[i] = -1;
|
sizes[i] = -1;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
inodes[i] = sbuf.st_ino;
|
inodes[i] = sbuf.st_ino;
|
||||||
sizes[i] = (long) sbuf.st_size;
|
sizes[i] = (long) sbuf.st_size;
|
||||||
}
|
}
|
||||||
@@ -2145,7 +2144,7 @@ scanfstr(char *str, char *fmt, int count, VALUE **vals)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read a number in floating-point format from a file. The first dot,
|
* Read a number in floating-point format from a file. The first dot,
|
||||||
* if any, is considered as the decimal point; later dots are ignored.
|
* if any, is considered as the decimal point; later dots are ignored.
|
||||||
* For example, -23.45..67. is interpreted as -23.4567
|
* For example, -23.45..67. is interpreted as -23.4567
|
||||||
* An optional 'e' or 'E' indicates multiplication by a power or 10,
|
* An optional 'e' or 'E' indicates multiplication by a power or 10,
|
||||||
@@ -2229,15 +2228,16 @@ freadnum(FILE *fp, VALUE *valptr)
|
|||||||
ch = fgetc(fp);
|
ch = fgetc(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ch == 'i' || ch == 'I')
|
if (ch == 'i' || ch == 'I') {
|
||||||
imag = TRUE;
|
imag = TRUE;
|
||||||
else {
|
} else {
|
||||||
ungetc(ch, fp);
|
ungetc(ch, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ziszero(num)) {
|
if (ziszero(num)) {
|
||||||
zfree(num);
|
zfree(num);
|
||||||
val.v_type = V_NUM;
|
val.v_type = V_NUM;
|
||||||
|
val.v_subtype = V_NOSUBTYPE;
|
||||||
val.v_num = qlink(&_qzero_);
|
val.v_num = qlink(&_qzero_);
|
||||||
*valptr = val;
|
*valptr = val;
|
||||||
return;
|
return;
|
||||||
@@ -2282,11 +2282,11 @@ freadnum(FILE *fp, VALUE *valptr)
|
|||||||
c->imag = q;
|
c->imag = q;
|
||||||
val.v_type = V_COM;
|
val.v_type = V_COM;
|
||||||
val.v_com = c;
|
val.v_com = c;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
val.v_type = V_NUM;
|
val.v_type = V_NUM;
|
||||||
val.v_num = q;
|
val.v_num = q;
|
||||||
}
|
}
|
||||||
|
val.v_subtype = V_NOSUBTYPE;
|
||||||
*valptr = val;
|
*valptr = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2394,7 +2394,7 @@ isattyid(FILEID id)
|
|||||||
* zero if string found, position stored at res
|
* zero if string found, position stored at res
|
||||||
*
|
*
|
||||||
* XXX - This search is a translation of the original search that did not
|
* XXX - This search is a translation of the original search that did not
|
||||||
* work with large files. The search algorithm used is slow and
|
* work with large files. The search algorithm used is slow and
|
||||||
* should be spead up much more.
|
* should be spead up much more.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@@ -2471,9 +2471,9 @@ fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res)
|
|||||||
}
|
}
|
||||||
(void) f_seek_set(fiop->fp, &cur);
|
(void) f_seek_set(fiop->fp, &cur);
|
||||||
}
|
}
|
||||||
if (*tmp.v)
|
if (*tmp.v) {
|
||||||
(*tmp.v)--;
|
(*tmp.v)--;
|
||||||
else {
|
} else {
|
||||||
if (tmp.len == 1)
|
if (tmp.len == 1)
|
||||||
break;
|
break;
|
||||||
k = 0;
|
k = 0;
|
||||||
@@ -2513,7 +2513,7 @@ fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res)
|
|||||||
* zero if string found, position stored at res
|
* zero if string found, position stored at res
|
||||||
*
|
*
|
||||||
* XXX - This search is a translation of the original search that did not
|
* XXX - This search is a translation of the original search that did not
|
||||||
* work with large files. The search algorithm used is so slow
|
* work with large files. The search algorithm used is so slow
|
||||||
* as to be painful to the user and needs to be sped up much more.
|
* as to be painful to the user and needs to be sped up much more.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
|
4
file.h
4
file.h
@@ -42,7 +42,7 @@ typedef struct {
|
|||||||
* We assume that if your system does not have fgetpos/fsetpos,
|
* We assume that if your system does not have fgetpos/fsetpos,
|
||||||
* then it will have a FILEPOS that is a scalar type (e.g., long).
|
* then it will have a FILEPOS that is a scalar type (e.g., long).
|
||||||
* Some obscure systems without fgetpos/fsetpos may not have a simple
|
* Some obscure systems without fgetpos/fsetpos may not have a simple
|
||||||
* scalar type. In these cases the f_tell macro below will fail.
|
* scalar type. In these cases the f_tell macro below will fail.
|
||||||
*/
|
*/
|
||||||
#if defined(HAVE_FPOS)
|
#if defined(HAVE_FPOS)
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ typedef struct {
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define f_seek_set(stream, loc) \
|
#define f_seek_set(stream, loc) \
|
||||||
fseek((FILE*)(stream), *(FILEPOS*)(loc), SEEK_SET)
|
fseek((FILE*)(stream), *(FILEPOS*)(loc), SEEK_SET)
|
||||||
#define f_tell(stream, loc) (*((FILEPOS*)(loc)) = ftell((FILE*)(stream)))
|
#define f_tell(stream, loc) (*((FILEPOS*)(loc)) = ftell((FILE*)(stream)))
|
||||||
|
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
*
|
*
|
||||||
* We will #define of 8 symbols:
|
* We will #define of 8 symbols:
|
||||||
*
|
*
|
||||||
* FILEPOS_BITS length in bits of the type FILEPOS
|
* FILEPOS_BITS length in bits of the type FILEPOS
|
||||||
* SWAP_HALF_IN_FILEPOS will copy/swap FILEPOS into an HALF array
|
* SWAP_HALF_IN_FILEPOS will copy/swap FILEPOS into an HALF array
|
||||||
* OFF_T_BITS length in bits of the st_size stat element
|
* OFF_T_BITS length in bits of the st_size stat element
|
||||||
* SWAP_HALF_IN_OFF_T will copy/swap st_size into an HALF array
|
* SWAP_HALF_IN_OFF_T will copy/swap st_size into an HALF array
|
||||||
|
2
func.h
2
func.h
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#if !defined(__FUNC_H__)
|
#if !defined(__FUNC_H__)
|
||||||
#define __FUNC_H__
|
#define __FUNC_H__
|
||||||
|
|
||||||
|
|
||||||
#include "calc.h"
|
#include "calc.h"
|
||||||
|
6
hash.c
6
hash.c
@@ -248,14 +248,14 @@ hash_final(HASH *state)
|
|||||||
*
|
*
|
||||||
* given:
|
* given:
|
||||||
* type - hash type (see hash.h)
|
* type - hash type (see hash.h)
|
||||||
* longval - a long value
|
* longval - a long value
|
||||||
* state - the state to hash
|
* state - the state to hash
|
||||||
*
|
*
|
||||||
* returns:
|
* returns:
|
||||||
* the new state
|
* the new state
|
||||||
*
|
*
|
||||||
* This function will hash a long value as if it were a 64 bit value.
|
* This function will hash a long value as if it were a 64 bit value.
|
||||||
* The input is a long. If a long is smaller than 64 bits, we will
|
* The input is a long. If a long is smaller than 64 bits, we will
|
||||||
* hash a final 32 bits of zeros.
|
* hash a final 32 bits of zeros.
|
||||||
*/
|
*/
|
||||||
HASH *
|
HASH *
|
||||||
|
4
hash.h
4
hash.h
@@ -52,8 +52,8 @@
|
|||||||
*/
|
*/
|
||||||
typedef struct hashstate HASH;
|
typedef struct hashstate HASH;
|
||||||
struct hashstate {
|
struct hashstate {
|
||||||
int hashtype; /* XYZ_HASH_TYPE debug value */
|
int hashtype; /* XYZ_HASH_TYPE debug value */
|
||||||
BOOL bytes; /* TRUE => reading bytes rather than words */
|
BOOL bytes; /* TRUE => reading bytes rather than words */
|
||||||
void (*update)(HASH*, USB8*, USB32); /* update arbitrary length */
|
void (*update)(HASH*, USB8*, USB32); /* update arbitrary length */
|
||||||
void (*chkpt)(HASH*); /* checkpoint a state */
|
void (*chkpt)(HASH*); /* checkpoint a state */
|
||||||
void (*note)(int, HASH*); /* note a special value */
|
void (*note)(int, HASH*); /* note a special value */
|
||||||
|
@@ -46,16 +46,21 @@ int
|
|||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_NO_CONST)
|
#if defined(HAVE_NO_CONST)
|
||||||
|
|
||||||
printf("#undef HAVE_CONST /* no */\n");
|
printf("#undef HAVE_CONST /* no */\n");
|
||||||
printf("#undef CONST\n");
|
printf("#undef CONST\n");
|
||||||
printf("#define CONST /* no */\n");
|
printf("#define CONST /* no */\n");
|
||||||
|
|
||||||
#else /* HAVE_NO_CONST */
|
#else /* HAVE_NO_CONST */
|
||||||
|
|
||||||
const char * const str = "const";
|
const char * const str = "const";
|
||||||
|
|
||||||
printf("#define HAVE_CONST /* yes */\n");
|
printf("#define HAVE_CONST /* yes */\n");
|
||||||
printf("#undef CONST\n");
|
printf("#undef CONST\n");
|
||||||
printf("#define CONST %s /* yes */\n", str);
|
printf("#define CONST %s /* yes */\n", str);
|
||||||
|
|
||||||
#endif /* HAVE_NO_CONST */
|
#endif /* HAVE_NO_CONST */
|
||||||
|
|
||||||
/* exit(0); */
|
/* exit(0); */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
60
have_getpgid.c
Normal file
60
have_getpgid.c
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* have_getpgid - Determine if we getpgid()
|
||||||
|
*
|
||||||
|
* usage:
|
||||||
|
* have_getpgid
|
||||||
|
*
|
||||||
|
* Not all systems have the getpgid() function, so this may not
|
||||||
|
* compile on your system.
|
||||||
|
*
|
||||||
|
* This prog outputs several defines:
|
||||||
|
*
|
||||||
|
* HAVE_GETPGID
|
||||||
|
* defined ==> use getpgid()
|
||||||
|
* undefined ==> do not or cannot call getpgid()
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software and
|
||||||
|
* its documentation for any purpose and without fee is hereby granted,
|
||||||
|
* provided that the above copyright, this permission notice and text
|
||||||
|
* this comment, and the disclaimer below appear in all of the following:
|
||||||
|
*
|
||||||
|
* supporting documentation
|
||||||
|
* source copies
|
||||||
|
* source works derived from this source
|
||||||
|
* binaries derived from this source or from derived source
|
||||||
|
*
|
||||||
|
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||||
|
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* chongo was here /\../\
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_NO_GETPGID)
|
||||||
|
|
||||||
|
printf("#undef HAVE_GETPGID /* no */\n");
|
||||||
|
|
||||||
|
#else /* HAVE_NO_GETPGID */
|
||||||
|
|
||||||
|
(void) getpgid((pid_t)0);
|
||||||
|
|
||||||
|
printf("#define HAVE_GETPGID /* yes */\n");
|
||||||
|
|
||||||
|
#endif /* HAVE_NO_GETPGID */
|
||||||
|
|
||||||
|
/* exit(0); */
|
||||||
|
return 0;
|
||||||
|
}
|
59
have_getprid.c
Normal file
59
have_getprid.c
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* have_getprid - Determine if we getprid()
|
||||||
|
*
|
||||||
|
* usage:
|
||||||
|
* have_getprid
|
||||||
|
*
|
||||||
|
* Not all systems have the getprid() function, so this may not
|
||||||
|
* compile on your system.
|
||||||
|
*
|
||||||
|
* This prog outputs several defines:
|
||||||
|
*
|
||||||
|
* HAVE_GETPRID
|
||||||
|
* defined ==> use getprid()
|
||||||
|
* undefined ==> do not or cannot call getprid()
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software and
|
||||||
|
* its documentation for any purpose and without fee is hereby granted,
|
||||||
|
* provided that the above copyright, this permission notice and text
|
||||||
|
* this comment, and the disclaimer below appear in all of the following:
|
||||||
|
*
|
||||||
|
* supporting documentation
|
||||||
|
* source copies
|
||||||
|
* source works derived from this source
|
||||||
|
* binaries derived from this source or from derived source
|
||||||
|
*
|
||||||
|
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||||
|
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* chongo was here /\../\
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_NO_GETPRID)
|
||||||
|
|
||||||
|
printf("#undef HAVE_GETPRID /* no */\n");
|
||||||
|
|
||||||
|
#else /* HAVE_NO_GETPRID */
|
||||||
|
|
||||||
|
(void) getprid();
|
||||||
|
printf("#define HAVE_GETPRID /* yes */\n");
|
||||||
|
|
||||||
|
#endif /* HAVE_NO_GETPRID */
|
||||||
|
|
||||||
|
/* exit(0); */
|
||||||
|
return 0;
|
||||||
|
}
|
59
have_getsid.c
Normal file
59
have_getsid.c
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* have_getsid - Determine if we getsid()
|
||||||
|
*
|
||||||
|
* usage:
|
||||||
|
* have_getsid
|
||||||
|
*
|
||||||
|
* Not all systems have the getsid() function, so this may not
|
||||||
|
* compile on your system.
|
||||||
|
*
|
||||||
|
* This prog outputs several defines:
|
||||||
|
*
|
||||||
|
* HAVE_GETSID
|
||||||
|
* defined ==> use getsid()
|
||||||
|
* undefined ==> do not call or cannot call getsid()
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software and
|
||||||
|
* its documentation for any purpose and without fee is hereby granted,
|
||||||
|
* provided that the above copyright, this permission notice and text
|
||||||
|
* this comment, and the disclaimer below appear in all of the following:
|
||||||
|
*
|
||||||
|
* supporting documentation
|
||||||
|
* source copies
|
||||||
|
* source works derived from this source
|
||||||
|
* binaries derived from this source or from derived source
|
||||||
|
*
|
||||||
|
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||||
|
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* chongo was here /\../\
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_NO_GETSID)
|
||||||
|
|
||||||
|
printf("#undef HAVE_GETSID /* no */\n");
|
||||||
|
|
||||||
|
#else /* HAVE_NO_GETSID */
|
||||||
|
|
||||||
|
(void) getsid((pid_t)0);
|
||||||
|
|
||||||
|
printf("#define HAVE_GETSID /* yes */\n");
|
||||||
|
|
||||||
|
#endif /* HAVE_NO_GETSID */
|
||||||
|
|
||||||
|
/* exit(0); */
|
||||||
|
return 0;
|
||||||
|
}
|
74
have_gettime.c
Normal file
74
have_gettime.c
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* have_gettime - Determine if we clock_gettime()
|
||||||
|
*
|
||||||
|
* usage:
|
||||||
|
* have_gettime
|
||||||
|
*
|
||||||
|
* Not all systems have the clock_gettime() function, so this may not
|
||||||
|
* compile on your system.
|
||||||
|
*
|
||||||
|
* This prog outputs several defines:
|
||||||
|
*
|
||||||
|
* HAVE_GETTIME
|
||||||
|
* defined ==> use clock_gettime() for either CLOCK_SGI_CYCLE
|
||||||
|
* and/or CLOCK_REALTIME
|
||||||
|
* undefined ==> clock_gettime() is not available for both
|
||||||
|
* CLOCK_SGI_CYCLE and CLOCK_REALTIME
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software and
|
||||||
|
* its documentation for any purpose and without fee is hereby granted,
|
||||||
|
* provided that the above copyright, this permission notice and text
|
||||||
|
* this comment, and the disclaimer below appear in all of the following:
|
||||||
|
*
|
||||||
|
* supporting documentation
|
||||||
|
* source copies
|
||||||
|
* source works derived from this source
|
||||||
|
* binaries derived from this source or from derived source
|
||||||
|
*
|
||||||
|
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||||
|
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* chongo was here /\../\
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_NO_GETTIME)
|
||||||
|
|
||||||
|
printf("#undef HAVE_GETTIME /* no */\n");
|
||||||
|
|
||||||
|
#else /* HAVE_NO_GETTIME */
|
||||||
|
|
||||||
|
# if defined(CLOCK_SGI_CYCLE)
|
||||||
|
|
||||||
|
struct timespec sgi_cycle; /* SGI hardware clock */
|
||||||
|
(void) clock_gettime(CLOCK_SGI_CYCLE, &sgi_cycle);
|
||||||
|
printf("#define HAVE_GETTIME /* yes - w/CLOCK_SGI_CYCLE */\n");
|
||||||
|
|
||||||
|
# elif defined(CLOCK_REALTIME)
|
||||||
|
|
||||||
|
struct timespec realtime; /* POSIX realtime clock */
|
||||||
|
(void) clock_gettime(CLOCK_REALTIME, &realtime);
|
||||||
|
printf("#define HAVE_GETTIME /* yes - CLOCK_REALTIME only */\n");
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
printf("#undef HAVE_GETTIME /* no - no SGI_CYCLE and no REALTIME */\n");
|
||||||
|
|
||||||
|
# endif /* CLOCK_REALTIME */
|
||||||
|
|
||||||
|
#endif /* HAVE_NO_GETTIME */
|
||||||
|
/* exit(0); */
|
||||||
|
return 0;
|
||||||
|
}
|
@@ -2,7 +2,7 @@
|
|||||||
* have_memmv - Determine if we memmove()
|
* have_memmv - Determine if we memmove()
|
||||||
*
|
*
|
||||||
* usage:
|
* usage:
|
||||||
* have_newstr
|
* have_memmv
|
||||||
*
|
*
|
||||||
* Not all systems with memcpy() have memmove() functions, so this may not
|
* Not all systems with memcpy() have memmove() functions, so this may not
|
||||||
* compile on your system.
|
* compile on your system.
|
||||||
@@ -48,12 +48,17 @@ int
|
|||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_NO_MEMMOVE)
|
#if defined(HAVE_NO_MEMMOVE)
|
||||||
|
|
||||||
printf("#undef HAVE_MEMMOVE /* no */\n");
|
printf("#undef HAVE_MEMMOVE /* no */\n");
|
||||||
|
|
||||||
#else /* HAVE_NO_MEMMOVE */
|
#else /* HAVE_NO_MEMMOVE */
|
||||||
|
|
||||||
(void) memmove(dest, src, MOVELEN);
|
(void) memmove(dest, src, MOVELEN);
|
||||||
|
|
||||||
printf("#define HAVE_MEMMOVE /* yes */\n");
|
printf("#define HAVE_MEMMOVE /* yes */\n");
|
||||||
|
|
||||||
#endif /* HAVE_NO_MEMMOVE */
|
#endif /* HAVE_NO_MEMMOVE */
|
||||||
|
|
||||||
/* exit(0); */
|
/* exit(0); */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -50,14 +50,19 @@ int
|
|||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_NO_NEWSTR)
|
#if defined(HAVE_NO_NEWSTR)
|
||||||
|
|
||||||
printf("#undef HAVE_NEWSTR /* no */\n");
|
printf("#undef HAVE_NEWSTR /* no */\n");
|
||||||
|
|
||||||
#else /* HAVE_NO_NEWSTR */
|
#else /* HAVE_NO_NEWSTR */
|
||||||
|
|
||||||
(void) memcpy(dest, src, MOVELEN);
|
(void) memcpy(dest, src, MOVELEN);
|
||||||
(void) memset(dest, 0, MOVELEN);
|
(void) memset(dest, 0, MOVELEN);
|
||||||
(void) strchr(src, 'e');
|
(void) strchr(src, 'e');
|
||||||
|
|
||||||
printf("#define HAVE_NEWSTR /* yes */\n");
|
printf("#define HAVE_NEWSTR /* yes */\n");
|
||||||
|
|
||||||
#endif /* HAVE_NO_NEWSTR */
|
#endif /* HAVE_NO_NEWSTR */
|
||||||
|
|
||||||
/* exit(0); */
|
/* exit(0); */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* have_offscl
|
* have_offscl
|
||||||
*
|
*
|
||||||
* On some systems, off_t is a scalar value on which one can perform
|
* On some systems, off_t is a scalar value on which one can perform
|
||||||
* arithmetic operations, assignments and comparisons. On some systems
|
* arithmetic operations, assignments and comparisons. On some systems
|
||||||
* off_t is some sort of union or struct which must be converted into
|
* off_t is some sort of union or struct which must be converted into
|
||||||
* a ZVALUE in order to perform arithmetic operations, assignments and
|
* a ZVALUE in order to perform arithmetic operations, assignments and
|
||||||
* comparisons.
|
* comparisons.
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* have_posscl
|
* have_posscl
|
||||||
*
|
*
|
||||||
* On some systems, FILEPOS is a scalar value on which one can perform
|
* On some systems, FILEPOS is a scalar value on which one can perform
|
||||||
* arithmetic operations, assignments and comparisons. On some systems
|
* arithmetic operations, assignments and comparisons. On some systems
|
||||||
* FILEPOS is some sort of union or struct which must be converted into
|
* FILEPOS is some sort of union or struct which must be converted into
|
||||||
* a ZVALUE in order to perform arithmetic operations, assignments and
|
* a ZVALUE in order to perform arithmetic operations, assignments and
|
||||||
* comparisons.
|
* comparisons.
|
||||||
@@ -51,7 +51,7 @@ main(void)
|
|||||||
{
|
{
|
||||||
#if !defined(FILEPOS_NON_SCALAR)
|
#if !defined(FILEPOS_NON_SCALAR)
|
||||||
FILEPOS value; /* an FILEPOS to perform arithmatic on */
|
FILEPOS value; /* an FILEPOS to perform arithmatic on */
|
||||||
FILEPOS value2; /* an FILEPOS to perform arithmatic on */
|
FILEPOS value2; /* an FILEPOS to perform arithmatic on */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* do some math opts on an FILEPOS
|
* do some math opts on an FILEPOS
|
||||||
|
62
have_rusage.c
Normal file
62
have_rusage.c
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* have_rusage - Determine if we getrusage()
|
||||||
|
*
|
||||||
|
* usage:
|
||||||
|
* have_rusage
|
||||||
|
*
|
||||||
|
* Not all systems have the getrusage() function, so this may not
|
||||||
|
* compile on your system.
|
||||||
|
*
|
||||||
|
* This prog outputs several defines:
|
||||||
|
*
|
||||||
|
* HAVE_GETRUSAGE
|
||||||
|
* defined ==> use getrusage()
|
||||||
|
* undefined ==> do not call or cannot call getrusage()
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software and
|
||||||
|
* its documentation for any purpose and without fee is hereby granted,
|
||||||
|
* provided that the above copyright, this permission notice and text
|
||||||
|
* this comment, and the disclaimer below appear in all of the following:
|
||||||
|
*
|
||||||
|
* supporting documentation
|
||||||
|
* source copies
|
||||||
|
* source works derived from this source
|
||||||
|
* binaries derived from this source or from derived source
|
||||||
|
*
|
||||||
|
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||||
|
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* chongo was here /\../\
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_NO_GETRUSAGE)
|
||||||
|
|
||||||
|
printf("#undef HAVE_GETRUSAGE /* no */\n");
|
||||||
|
|
||||||
|
#else /* HAVE_NO_GETRUSAGE */
|
||||||
|
|
||||||
|
struct rusage rusage; /* resource utilization */
|
||||||
|
|
||||||
|
(void) getrusage(RUSAGE_SELF, &rusage);
|
||||||
|
|
||||||
|
printf("#define HAVE_GETRUSAGE /* yes */\n");
|
||||||
|
|
||||||
|
#endif /* HAVE_NO_GETRUSAGE */
|
||||||
|
|
||||||
|
/* exit(0); */
|
||||||
|
return 0;
|
||||||
|
}
|
@@ -9,7 +9,7 @@
|
|||||||
* as if it were vsprintf() and hope for the best.
|
* as if it were vsprintf() and hope for the best.
|
||||||
*
|
*
|
||||||
* This program will output #defines and exits 0 if vsprintf() (or sprintf())
|
* This program will output #defines and exits 0 if vsprintf() (or sprintf())
|
||||||
* produces the results that we expect. This program exits 1 if vsprintf()
|
* produces the results that we expect. This program exits 1 if vsprintf()
|
||||||
* (or sprintf()) produces unexpected results while using the <stdarg.h>
|
* (or sprintf()) produces unexpected results while using the <stdarg.h>
|
||||||
* include file.
|
* include file.
|
||||||
*/
|
*/
|
||||||
@@ -109,14 +109,14 @@ main(void)
|
|||||||
puts(" * SIMULATE_STDARG");
|
puts(" * SIMULATE_STDARG");
|
||||||
puts(" *");
|
puts(" *");
|
||||||
puts(" * WARNING: This type of stdarg makes assumptions about the stack");
|
puts(" * WARNING: This type of stdarg makes assumptions about the stack");
|
||||||
puts(" * that may not be true on your system. You may want to");
|
puts(" * that may not be true on your system. You may want to");
|
||||||
puts(" * define STDARG (if using ANSI C) or VARARGS.");
|
puts(" * define STDARG (if using ANSI C) or VARARGS.");
|
||||||
puts(" */");
|
puts(" */");
|
||||||
puts("typedef char *va_list;");
|
puts("typedef char *va_list;");
|
||||||
puts("#define va_start(ap,parmn) (void)((ap) = (char*)(&(parmn) + 1))");
|
puts("#define va_start(ap,parmn) (void)((ap) = (char*)(&(parmn) + 1))");
|
||||||
puts("#define va_end(ap) (void)((ap) = 0)");
|
puts("#define va_end(ap) (void)((ap) = 0)");
|
||||||
puts("#define va_arg(ap, type) \\");
|
puts("#define va_arg(ap, type) \\");
|
||||||
puts(" (((type*)((ap) = ((ap) + sizeof(type))))[-1])");
|
puts(" (((type*)((ap) = ((ap) + sizeof(type))))[-1])");
|
||||||
puts("#define SIMULATE_STDARG /* use std_arg.h to simulate <stdarg.h> */");
|
puts("#define SIMULATE_STDARG /* use std_arg.h to simulate <stdarg.h> */");
|
||||||
#else
|
#else
|
||||||
puts("#define STDARG /* use <stdarg.h> */");
|
puts("#define STDARG /* use <stdarg.h> */");
|
||||||
|
62
have_strdup.c
Normal file
62
have_strdup.c
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* have_strdup - Determine if we strdup()
|
||||||
|
*
|
||||||
|
* usage:
|
||||||
|
* have_strdup
|
||||||
|
*
|
||||||
|
* Not all systems have the strdup() function, so this may not
|
||||||
|
* compile on your system.
|
||||||
|
*
|
||||||
|
* This prog outputs several defines:
|
||||||
|
*
|
||||||
|
* HAVE_STRDUP
|
||||||
|
* defined ==> use strdup()
|
||||||
|
* undefined ==> do not call or cannot call strdup()
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software and
|
||||||
|
* its documentation for any purpose and without fee is hereby granted,
|
||||||
|
* provided that the above copyright, this permission notice and text
|
||||||
|
* this comment, and the disclaimer below appear in all of the following:
|
||||||
|
*
|
||||||
|
* supporting documentation
|
||||||
|
* source copies
|
||||||
|
* source works derived from this source
|
||||||
|
* binaries derived from this source or from derived source
|
||||||
|
*
|
||||||
|
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||||
|
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* chongo was here /\../\
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_NO_STRDUP)
|
||||||
|
|
||||||
|
printf("#undef HAVE_STRDUP /* no */\n");
|
||||||
|
|
||||||
|
#else /* HAVE_NO_STRDUP */
|
||||||
|
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
p = strdup("#define HAVE_STRDUP /* yes */");
|
||||||
|
if (p != NULL) {
|
||||||
|
printf("%s\n", p);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAVE_NO_STRDUP */
|
||||||
|
|
||||||
|
/* exit(0); */
|
||||||
|
return 0;
|
||||||
|
}
|
@@ -51,15 +51,20 @@ int
|
|||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_NO_UID_T)
|
#if defined(HAVE_NO_UID_T)
|
||||||
|
|
||||||
printf("#undef HAVE_UID_T /* no */\n");
|
printf("#undef HAVE_UID_T /* no */\n");
|
||||||
|
|
||||||
#else /* HAVE_NO_UID_T */
|
#else /* HAVE_NO_UID_T */
|
||||||
|
|
||||||
uid_t curds;
|
uid_t curds;
|
||||||
extern uid_t geteuid();
|
extern uid_t geteuid();
|
||||||
|
|
||||||
curds = geteuid();
|
curds = geteuid();
|
||||||
|
|
||||||
printf("#define HAVE_UID_T /* yes */\n");
|
printf("#define HAVE_UID_T /* yes */\n");
|
||||||
|
|
||||||
#endif /* HAVE_NO_UID_T */
|
#endif /* HAVE_NO_UID_T */
|
||||||
|
|
||||||
/* exit(0); */
|
/* exit(0); */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
65
have_ustat.c
Normal file
65
have_ustat.c
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* have_ustat - Determine if we ustat()
|
||||||
|
*
|
||||||
|
* usage:
|
||||||
|
* have_ustat
|
||||||
|
*
|
||||||
|
* Not all systems have the ustat() function, so this may not
|
||||||
|
* compile on your system.
|
||||||
|
*
|
||||||
|
* This prog outputs several defines:
|
||||||
|
*
|
||||||
|
* HAVE_USTAT
|
||||||
|
* defined ==> use ustat()
|
||||||
|
* undefined ==> do not call or cannot call ustat()
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software and
|
||||||
|
* its documentation for any purpose and without fee is hereby granted,
|
||||||
|
* provided that the above copyright, this permission notice and text
|
||||||
|
* this comment, and the disclaimer below appear in all of the following:
|
||||||
|
*
|
||||||
|
* supporting documentation
|
||||||
|
* source copies
|
||||||
|
* source works derived from this source
|
||||||
|
* binaries derived from this source or from derived source
|
||||||
|
*
|
||||||
|
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||||
|
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* chongo was here /\../\
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <ustat.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_NO_USTAT)
|
||||||
|
|
||||||
|
printf("#undef HAVE_USTAT /* no */\n");
|
||||||
|
|
||||||
|
#else /* HAVE_NO_USTAT */
|
||||||
|
|
||||||
|
struct stat stat_dot; /* stat of "." */
|
||||||
|
struct ustat ustat_dot; /* usage stat of "." */
|
||||||
|
|
||||||
|
(void) stat(".", &stat_dot);
|
||||||
|
(void) ustat(stat_dot.st_dev, &ustat_dot);
|
||||||
|
|
||||||
|
printf("#define HAVE_USTAT /* yes */\n");
|
||||||
|
|
||||||
|
#endif /* HAVE_NO_USTAT */
|
||||||
|
|
||||||
|
/* exit(0); */
|
||||||
|
return 0;
|
||||||
|
}
|
@@ -6,7 +6,7 @@
|
|||||||
* and hope for the best.
|
* and hope for the best.
|
||||||
*
|
*
|
||||||
* This program will output #defines and exits 0 if vsprintf() (or sprintf())
|
* This program will output #defines and exits 0 if vsprintf() (or sprintf())
|
||||||
* produces the results that we expect. This program exits 1 if vsprintf()
|
* produces the results that we expect. This program exits 1 if vsprintf()
|
||||||
* (or sprintf()) produces unexpected results while using the <stdarg.h>
|
* (or sprintf()) produces unexpected results while using the <stdarg.h>
|
||||||
* include file.
|
* include file.
|
||||||
*/
|
*/
|
||||||
@@ -57,11 +57,13 @@ try_this(char *fmt, ...)
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap);
|
va_start(ap);
|
||||||
|
|
||||||
#if !defined(DONT_HAVE_VSPRINTF)
|
#if !defined(DONT_HAVE_VSPRINTF)
|
||||||
vsprintf(buf, fmt, ap);
|
vsprintf(buf, fmt, ap);
|
||||||
#else
|
#else
|
||||||
sprintf(buf, fmt, ap);
|
sprintf(buf, fmt, ap);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
3
help.c
3
help.c
@@ -121,9 +121,8 @@ givehelp(char *type)
|
|||||||
"else %s no such help, try: help help;fi",
|
"else %s no such help, try: help help;fi",
|
||||||
HELPDIR, type, pager, HELPDIR, type,
|
HELPDIR, type, pager, HELPDIR, type,
|
||||||
CUSTOMHELPDIR, type, pager, CUSTOMHELPDIR, type, ECHO);
|
CUSTOMHELPDIR, type, pager, CUSTOMHELPDIR, type, ECHO);
|
||||||
if (conf->calc_debug > 0) {
|
if (conf->calc_debug & CALCDBG_SYSTEM) {
|
||||||
printf("%s\n", helpcmd);
|
printf("%s\n", helpcmd);
|
||||||
sleep(3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* execute the help command */
|
/* execute the help command */
|
||||||
|
@@ -35,13 +35,12 @@ Q=@
|
|||||||
|
|
||||||
# standard tools
|
# standard tools
|
||||||
#
|
#
|
||||||
NATIVE_CC= cc
|
LCC= cc
|
||||||
NATIVE_CFLAGS=
|
ICFLAGS=
|
||||||
|
ILDFLAGS=
|
||||||
SED= sed
|
SED= sed
|
||||||
SORT= sort
|
SORT= sort
|
||||||
FMT= fmt
|
FMT= fmt
|
||||||
CMP= cmp
|
|
||||||
CAT= cat
|
|
||||||
|
|
||||||
# Standard and Builtin help files
|
# Standard and Builtin help files
|
||||||
#
|
#
|
||||||
@@ -74,7 +73,7 @@ STD_HELP_FILES_12= archive
|
|||||||
|
|
||||||
BLT_HELP_FILES_13= bugs changes
|
BLT_HELP_FILES_13= bugs changes
|
||||||
|
|
||||||
STD_HELP_FILES_14= contrib credit todo
|
STD_HELP_FILES_14= contrib credit wishlist todo
|
||||||
|
|
||||||
# These files are used in the following order to construct full
|
# These files are used in the following order to construct full
|
||||||
#
|
#
|
||||||
@@ -105,29 +104,30 @@ BLT_HELP_FILES= ${BLT_HELP_FILES_3} ${BLT_HELP_FILES_5} \
|
|||||||
# This list is prodiced by the detaillist rule when no WARNINGS are detected.
|
# This list is prodiced by the detaillist rule when no WARNINGS are detected.
|
||||||
#
|
#
|
||||||
DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \
|
DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \
|
||||||
appr arg arrow asec asech asin asinh assign atan atan2 atanh avg base \
|
appr arg arrow asec asech asin asinh assign atan atan2 atanh avg \
|
||||||
bit blk blkcpy blkfree blocks bround btrunc ceil cfappr cfsim char \
|
base bit blk blkcpy blkfree blocks bround btrunc calclevel ceil \
|
||||||
cmdbuf cmp comb conj cos cosh cot coth count cp csc csch ctime delete \
|
cfappr cfsim char cmdbuf cmp comb conj cos cosh cot coth count cp \
|
||||||
den dereference det digit digits dp epsilon errcount errmax errno \
|
csc csch ctime delete den dereference det digit digits dp epsilon \
|
||||||
error eval exp fact factor fclose fcnt feof ferror fflush fgetc \
|
errcount errmax errno error eval exp fact factor fclose fcnt feof \
|
||||||
fgetfield fgetline fgets fgetstr fib files floor fopen forall fprintf \
|
ferror fflush fgetc fgetfield fgetline fgets fgetstr fib files \
|
||||||
fputc fputs fputstr frac free freeglobals freeredc freestatics frem \
|
floor fopen forall fprintf fputc fputs fputstr frac free freeglobals \
|
||||||
freopen fscan fscanf fseek fsize ftell gcd gcdrem gd getenv hash head \
|
freeredc freestatics frem freopen fscan fscanf fseek fsize ftell gcd \
|
||||||
highbit hmean hnrmod hypot ilog ilog10 ilog2 im insert int inverse \
|
gcdrem gd getenv hash head highbit hmean hnrmod hypot ilog ilog10 \
|
||||||
iroot isassoc isatty isblk isconfig isdefined iserror iseven isfile \
|
ilog2 im inputlevel insert int inverse iroot isassoc isatty isblk \
|
||||||
ishash isident isint islist ismat ismult isnull isnum isobj isobjtype \
|
isconfig isdefined iserror iseven isfile ishash isident isint islist \
|
||||||
isodd isprime isptr isqrt isrand israndom isreal isrel issimple issq \
|
ismat ismult isnull isnum isobj isobjtype isodd isprime isptr isqrt \
|
||||||
isstr istype jacobi join lcm lcmfact lfactor ln lowbit ltol makelist \
|
isrand israndom isreal isrel issimple issq isstr istype jacobi join \
|
||||||
matdim matfill matmax matmin matsum mattrace mattrans max md5 memsize \
|
lcm lcmfact lfactor ln lowbit ltol makelist matdim matfill matmax \
|
||||||
meq min minv mmin mne mod modify name near newerror nextcand \
|
matmin matsum mattrace mattrans max md5 memsize meq min minv mmin \
|
||||||
nextprime norm null num oldvalue ord param perm pfact pi pix places \
|
mne mod modify name near newerror nextcand nextprime norm null \
|
||||||
pmod polar poly pop popcnt power prevcand prevprime printf prompt \
|
num oldvalue ord param perm pfact pi pix places pmod polar poly \
|
||||||
protect ptest push putenv quo quomod rand randbit random randombit \
|
pop popcnt power prevcand prevprime printf prompt protect ptest \
|
||||||
randperm rcin rcmul rcout rcpow rcsq re remove reverse rewind rm root \
|
push putenv quo quomod rand randbit random randombit randperm rcin \
|
||||||
round rsearch runtime saveval scale scan scanf search sec sech seed \
|
rcmul rcout rcpow rcsq re remove reverse rewind rm root round rsearch \
|
||||||
segment select sgn sha sha1 sin sinh size sizeof sort sqrt srand \
|
runtime saveval scale scan scanf search sec sech seed segment select \
|
||||||
srandom ssq str strcat strerror strlen strpos strprintf strscan \
|
sgn sha sha1 sin sinh size sizeof sort sqrt srand srandom ssq str \
|
||||||
strscanf substr sum swap system tail tan tanh test time trunc xor
|
strcat strerror strlen strpos strprintf strscan strscanf substr \
|
||||||
|
sum swap system tail tan tanh test time trunc xor
|
||||||
|
|
||||||
# This list is of files that are clones of DETAIL_HELP files. They are
|
# This list is of files that are clones of DETAIL_HELP files. They are
|
||||||
# built from DETAIL_HELP files.
|
# built from DETAIL_HELP files.
|
||||||
@@ -153,7 +153,7 @@ all: ${FULL_HELP_FILES} full ${DETAIL_HELP} ${DETAIL_CLONE} \
|
|||||||
# used by the upper level Makefile to determine of we have done all
|
# used by the upper level Makefile to determine of we have done all
|
||||||
#
|
#
|
||||||
# NOTE: Due to bogus shells found on one common system we must have
|
# NOTE: Due to bogus shells found on one common system we must have
|
||||||
# an non-emoty else clause for every if condition. *sigh*
|
# an non-emoty else clause for every if condition. *sigh*
|
||||||
#
|
#
|
||||||
.all:
|
.all:
|
||||||
rm -f .all
|
rm -f .all
|
||||||
@@ -233,7 +233,7 @@ bugs: ../BUGS
|
|||||||
|
|
||||||
errorcodes: ../calcerr.h errorcodes.hdr errorcodes.sed
|
errorcodes: ../calcerr.h errorcodes.hdr errorcodes.sed
|
||||||
rm -f $@
|
rm -f $@
|
||||||
${CAT} errorcodes.hdr > $@
|
cat errorcodes.hdr > $@
|
||||||
${SED} -n -f errorcodes.sed < ../calcerr.h >> $@
|
${SED} -n -f errorcodes.sed < ../calcerr.h >> $@
|
||||||
chmod 0444 $@
|
chmod 0444 $@
|
||||||
-@if [ -z "${Q}" ]; then \
|
-@if [ -z "${Q}" ]; then \
|
||||||
@@ -258,7 +258,7 @@ calc: usage
|
|||||||
|
|
||||||
custom_cal: ../custom/CUSTOM_CAL
|
custom_cal: ../custom/CUSTOM_CAL
|
||||||
rm -f $@
|
rm -f $@
|
||||||
cp usage $@
|
cp ../custom/CUSTOM_CAL $@
|
||||||
chmod 0444 $@
|
chmod 0444 $@
|
||||||
-@if [ -z "${Q}" ]; then \
|
-@if [ -z "${Q}" ]; then \
|
||||||
echo ''; \
|
echo ''; \
|
||||||
@@ -270,7 +270,7 @@ custom_cal: ../custom/CUSTOM_CAL
|
|||||||
|
|
||||||
new_custom: ../custom/HOW_TO_ADD
|
new_custom: ../custom/HOW_TO_ADD
|
||||||
rm -f $@
|
rm -f $@
|
||||||
cp usage $@
|
cp ../custom/HOW_TO_ADD $@
|
||||||
chmod 0444 $@
|
chmod 0444 $@
|
||||||
-@if [ -z "${Q}" ]; then \
|
-@if [ -z "${Q}" ]; then \
|
||||||
echo ''; \
|
echo ''; \
|
||||||
@@ -282,7 +282,7 @@ new_custom: ../custom/HOW_TO_ADD
|
|||||||
|
|
||||||
copy: blkcpy
|
copy: blkcpy
|
||||||
rm -f $@
|
rm -f $@
|
||||||
cp usage $@
|
cp blkcpy $@
|
||||||
chmod 0444 $@
|
chmod 0444 $@
|
||||||
-@if [ -z "${Q}" ]; then \
|
-@if [ -z "${Q}" ]; then \
|
||||||
echo ''; \
|
echo ''; \
|
||||||
@@ -341,7 +341,7 @@ ${SINGULAR_FILES}: ${PLURAL_FILES}
|
|||||||
# Form the builtin file
|
# Form the builtin file
|
||||||
#
|
#
|
||||||
# We ave a "chicken-and-egg" problem. We want the builtn help file to
|
# We ave a "chicken-and-egg" problem. We want the builtn help file to
|
||||||
# accurately reflect the function list. It would be nice if we could
|
# accurately reflect the function list. It would be nice if we could
|
||||||
# just execute calc show builtin, but calc may not have been built or
|
# just execute calc show builtin, but calc may not have been built or
|
||||||
# buildable at this point. The hack-a-round used is to convert ../func.c
|
# buildable at this point. The hack-a-round used is to convert ../func.c
|
||||||
# into a standalone program that generates a suitable function list
|
# into a standalone program that generates a suitable function list
|
||||||
@@ -358,17 +358,13 @@ ${SINGULAR_FILES}: ${PLURAL_FILES}
|
|||||||
#
|
#
|
||||||
builtin: builtin.top builtin.end ../func.c funclist.sed
|
builtin: builtin.top builtin.end ../func.c funclist.sed
|
||||||
${Q}echo "forming builtin help file"
|
${Q}echo "forming builtin help file"
|
||||||
-${Q}rm -f builtin
|
|
||||||
${Q}cat builtin.top > builtin
|
|
||||||
-${Q}rm -f funclist.c
|
-${Q}rm -f funclist.c
|
||||||
${Q}${SED} -n -f funclist.sed ../func.c > funclist.c
|
${Q}${SED} -n -f funclist.sed ../func.c > funclist.c
|
||||||
|
-${Q}rm -f funclist.o funclist
|
||||||
-${Q}rm -f ../funclist.c ../funclist.o ../funclist funclist
|
${Q}${LCC} ${ICFLAGS} -DFUNCLIST -I/usr/include -I.. funclist.c -c
|
||||||
${Q}cp funclist.c ..
|
${Q}${LCC} ${ILDFLAGS} funclist.o -o funclist
|
||||||
-${Q}(cd ..; \
|
-${Q}rm -f builtin
|
||||||
${NATIVE_CC} ${NATIVE_CFLAGS} -DFUNCLIST funclist.c -o funclist; \
|
${Q}cat builtin.top > builtin
|
||||||
mv funclist help; \
|
|
||||||
rm -f funclist.c funclist.o funclist)
|
|
||||||
${Q}./funclist | \
|
${Q}./funclist | \
|
||||||
${SED} -e 's/^/ /' -e 's/[ ][ ]*$$//' >> builtin
|
${SED} -e 's/^/ /' -e 's/[ ][ ]*$$//' >> builtin
|
||||||
${Q}cat builtin.end >> builtin
|
${Q}cat builtin.end >> builtin
|
||||||
@@ -383,7 +379,7 @@ builtin: builtin.top builtin.end ../func.c funclist.sed
|
|||||||
|
|
||||||
##
|
##
|
||||||
#
|
#
|
||||||
# File list generation. You can ignore this section.
|
# File list generation. You can ignore this section.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# We will form the names of source files as if they were in a
|
# We will form the names of source files as if they were in a
|
||||||
@@ -393,15 +389,11 @@ builtin: builtin.top builtin.end ../func.c funclist.sed
|
|||||||
|
|
||||||
distlist: ${DISTLIST}
|
distlist: ${DISTLIST}
|
||||||
${Q}for i in ${DISTLIST}; do \
|
${Q}for i in ${DISTLIST}; do \
|
||||||
echo calc/help/$$i; \
|
echo help/$$i; \
|
||||||
done | ${SORT}
|
done | ${SORT}
|
||||||
|
|
||||||
# The bsdi distribution has generated files as well as distributed files.
|
distdir:
|
||||||
#
|
${Q}echo help
|
||||||
bsdilist: ${DISTLIST} ${BLT_HELP_FILES}
|
|
||||||
${Q}for i in ${DISTLIST} ${BLT_HELP_FILES}; do \
|
|
||||||
echo calc/help/$$i; \
|
|
||||||
done | ${SORT}
|
|
||||||
|
|
||||||
# The BSDI cdrom makefile expects all help files to be pre-built. This rule
|
# The BSDI cdrom makefile expects all help files to be pre-built. This rule
|
||||||
# creats these fils so that the release can be shipped off to BSDI. You can
|
# creats these fils so that the release can be shipped off to BSDI. You can
|
||||||
@@ -416,8 +408,8 @@ bsdi: all
|
|||||||
detaillist:
|
detaillist:
|
||||||
${Q}-(echo "xxxxx"; \
|
${Q}-(echo "xxxxx"; \
|
||||||
for i in ${DETAIL_HELP}; do \
|
for i in ${DETAIL_HELP}; do \
|
||||||
if [ ! -f SCCS/s.$$i ]; then \
|
if [ ! -f RCS/$$i,v ]; then \
|
||||||
echo "WARNING: $$i not under SCCS control" 1>&2; \
|
echo "WARNING: $$i not under RCS control" 1>&2; \
|
||||||
else \
|
else \
|
||||||
echo $$i; \
|
echo $$i; \
|
||||||
fi; \
|
fi; \
|
||||||
|
@@ -17,7 +17,7 @@ DESCRIPTION
|
|||||||
acosh(x) is the nonnegative real number v for which cosh(v) = x.
|
acosh(x) is the nonnegative real number v for which cosh(v) = x.
|
||||||
It is given by
|
It is given by
|
||||||
|
|
||||||
acosh(x) = ln(x + sqrt(x^2 - 1))
|
acosh(x) = ln(x + sqrt(x^2 - 1))
|
||||||
|
|
||||||
EXAMPLE
|
EXAMPLE
|
||||||
> print acosh(2, 1e-5), acosh(2, 1e-10), acosh(2, 1e-15), acosh(2, 1e-20)
|
> print acosh(2, 1e-5), acosh(2, 1e-10), acosh(2, 1e-15), acosh(2, 1e-20)
|
||||||
|
@@ -16,7 +16,7 @@ DESCRIPTION
|
|||||||
|
|
||||||
acoth(x) is the real number v for which coth(v) = x.
|
acoth(x) is the real number v for which coth(v) = x.
|
||||||
It is given by
|
It is given by
|
||||||
acoth(x) = ln((x + 1)/(x - 1))/2
|
acoth(x) = ln((x + 1)/(x - 1))/2
|
||||||
|
|
||||||
EXAMPLE
|
EXAMPLE
|
||||||
> print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20)
|
> print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20)
|
||||||
|
@@ -16,7 +16,7 @@ DESCRIPTION
|
|||||||
|
|
||||||
acsch(x) is the real number v for which csch(v) = x. It is given by
|
acsch(x) is the real number v for which csch(v) = x. It is given by
|
||||||
|
|
||||||
acsch(x) = ln((1 + sqrt(1 + x^2))/x)
|
acsch(x) = ln((1 + sqrt(1 + x^2))/x)
|
||||||
|
|
||||||
|
|
||||||
EXAMPLE
|
EXAMPLE
|
||||||
|
@@ -20,7 +20,7 @@ DESCRIPTION
|
|||||||
otherwise accessing, such a vacated address may be catastrophic.
|
otherwise accessing, such a vacated address may be catastrophic.
|
||||||
|
|
||||||
An octet is normally expressed by B[i] where B is a block and
|
An octet is normally expressed by B[i] where B is a block and
|
||||||
0 <= i < sizeof(B). &B[i] then returns the address at which this
|
0 <= i < sizeof(B). &B[i] then returns the address at which this
|
||||||
octet is located until the block is freed or relocated. Freeing
|
octet is located until the block is freed or relocated. Freeing
|
||||||
of an unnamed block B occurs when a new value is assigned to B or
|
of an unnamed block B occurs when a new value is assigned to B or
|
||||||
when B ceases to exist; a named block B is freed by blkfree(B().
|
when B ceases to exist; a named block B is freed by blkfree(B().
|
||||||
@@ -96,7 +96,7 @@ DESCRIPTION
|
|||||||
> define f(a) = 27 + a;
|
> define f(a) = 27 + a;
|
||||||
|
|
||||||
the three occurrences of 27 have the same address which may be displayed
|
the three occurrences of 27 have the same address which may be displayed
|
||||||
by any of &27, &*x, &*y and &f(0). If x and y are assigned
|
by any of &27, &*x, &*y and &f(0). If x and y are assigned
|
||||||
other values and f is redefined or undefined and the 27 has not been
|
other values and f is redefined or undefined and the 27 has not been
|
||||||
stored elsewhere (e.g. as the "old value" or in another function
|
stored elsewhere (e.g. as the "old value" or in another function
|
||||||
definition or as an element in an association), the address assigned at
|
definition or as an element in an association), the address assigned at
|
||||||
@@ -105,7 +105,7 @@ DESCRIPTION
|
|||||||
|
|
||||||
When a function returns a number value, that number value is usually
|
When a function returns a number value, that number value is usually
|
||||||
placed at a newly allocated address, even if an equal number is stored
|
placed at a newly allocated address, even if an equal number is stored
|
||||||
elsewhere. For example calls to f(a), as defined above, with the same
|
elsewhere. For example calls to f(a), as defined above, with the same
|
||||||
non-zero value for a will be assigned to different addresses as can be
|
non-zero value for a will be assigned to different addresses as can be
|
||||||
seen from printing &*A, &*B, &*C after
|
seen from printing &*A, &*B, &*C after
|
||||||
|
|
||||||
|
@@ -84,7 +84,7 @@ DESCRIPTION
|
|||||||
|
|
||||||
Complex x:
|
Complex x:
|
||||||
|
|
||||||
Returns appr(re(x), y, z) + appr(im(x), y, z) * 1i
|
Returns appr(re(x), y, z) + appr(im(x), y, z) * 1i
|
||||||
|
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
If appr(x,y,z) != x, then abs(x - appr(x,y,z)) < abs(y).
|
If appr(x,y,z) != x, then abs(x - appr(x,y,z)) < abs(y).
|
||||||
|
31
help/archive
31
help/archive
@@ -1,31 +1,16 @@
|
|||||||
Where to get the the latest versions of calc
|
Where to get the the latest versions of calc
|
||||||
|
|
||||||
Landon Noll maintains the official calc ftp archive at:
|
Landon Noll maintains the official calc home page at:
|
||||||
|
|
||||||
ftp://ftp.uu.net/pub/calc
|
http://reality.sgi.com/chongo/tech/comp/calc/
|
||||||
|
|
||||||
Alpha test versions, complete with bugs, untested code and
|
|
||||||
experimental features may be fetched (if you are brave) under:
|
|
||||||
|
|
||||||
http://reality.sgi.com/chongo/calc/
|
|
||||||
|
|
||||||
One may join the calc testing group by sending a request to:
|
|
||||||
|
|
||||||
calc-tester-request@postofc.corp.sgi.com
|
|
||||||
|
|
||||||
Your message body (not the subject) should consist of:
|
|
||||||
|
|
||||||
subscribe calc-tester address
|
|
||||||
end
|
|
||||||
name your_full_name
|
|
||||||
|
|
||||||
where "address" is your EMail address and "your_full_name"
|
|
||||||
is your full name.
|
|
||||||
|
|
||||||
See:
|
See:
|
||||||
|
|
||||||
http://prime.corp.sgi.com/csp/ioccc/noll/noll.html#calc
|
http://reality.sgi.com/chongo/tech/comp/calc/calc-download.html
|
||||||
|
|
||||||
for details.
|
for information on how to obtain up a recent version of calc.
|
||||||
|
|
||||||
Landon Curt Noll <chongo@toad.com> /\oo/\
|
Landon Curt Noll
|
||||||
|
http://reality.sgi.com/chongo/
|
||||||
|
|
||||||
|
chongo <was here> /\../\
|
||||||
|
@@ -16,7 +16,7 @@ DESCRIPTION
|
|||||||
|
|
||||||
asech(x) is the real number v for which sech(v) = x. It is given by
|
asech(x) is the real number v for which sech(v) = x. It is given by
|
||||||
|
|
||||||
asech(x) = ln((1 + sqrt(1 - x^2))/x)
|
asech(x) = ln((1 + sqrt(1 - x^2))/x)
|
||||||
|
|
||||||
EXAMPLE
|
EXAMPLE
|
||||||
> print asech(.5,1e-5), asech(.5,1e-10), asech(.5,1e-15), asech(.5,1e-20)
|
> print asech(.5,1e-5), asech(.5,1e-10), asech(.5,1e-15), asech(.5,1e-20)
|
||||||
|
@@ -16,7 +16,7 @@ DESCRIPTION
|
|||||||
|
|
||||||
asinh(x) is the real number v for which sinh(v) = x. It is given by
|
asinh(x) is the real number v for which sinh(v) = x. It is given by
|
||||||
|
|
||||||
asinh(x) = ln(x + sqrt(1 + x^2))
|
asinh(x) = ln(x + sqrt(1 + x^2))
|
||||||
|
|
||||||
EXAMPLE
|
EXAMPLE
|
||||||
> print asinh(2, 1e-5), asinh(2, 1e-10), asinh(2, 1e-15), asinh(2, 1e-20)
|
> print asinh(2, 1e-5), asinh(2, 1e-10), asinh(2, 1e-15), asinh(2, 1e-20)
|
||||||
|
@@ -44,7 +44,7 @@ DESCRIPTION
|
|||||||
In simple assignments, = associates from right to left so that, for
|
In simple assignments, = associates from right to left so that, for
|
||||||
example,
|
example,
|
||||||
|
|
||||||
a = b = c
|
a = b = c
|
||||||
|
|
||||||
has the effect of a = (b = c) and results in assigning the value of c
|
has the effect of a = (b = c) and results in assigning the value of c
|
||||||
to both a and b. The expression (a = b) = c is acceptable, but has the
|
to both a and b. The expression (a = b) = c is acceptable, but has the
|
||||||
@@ -66,7 +66,7 @@ DESCRIPTION
|
|||||||
that of A[0] = A[1].
|
that of A[0] = A[1].
|
||||||
|
|
||||||
If, in execution of a = b, a is changed by the evaluation of b, the
|
If, in execution of a = b, a is changed by the evaluation of b, the
|
||||||
value of b may be stored in an unintended or inaccessible location. For
|
value of b may be stored in an unintended or inaccessible location. For
|
||||||
example,
|
example,
|
||||||
mat A[2]= {1,2};
|
mat A[2]= {1,2};
|
||||||
A[0] = (A = 3);
|
A[0] = (A = 3);
|
||||||
|
@@ -14,7 +14,7 @@ DESCRIPTION
|
|||||||
assignments of the forms
|
assignments of the forms
|
||||||
|
|
||||||
A[a_1] = v_1
|
A[a_1] = v_1
|
||||||
A[a_1, a_2] = v_2
|
A[a_1, a_2] = v_2
|
||||||
A[a_1, a_2, a_3] = v_3
|
A[a_1, a_2, a_3] = v_3
|
||||||
A[a_1, a_2, a_3, a_4] = v_4
|
A[a_1, a_2, a_3, a_4] = v_4
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ DESCRIPTION
|
|||||||
a sequential scan through the elements difficult.
|
a sequential scan through the elements difficult.
|
||||||
|
|
||||||
The search and rsearch functions can search for an element in an
|
The search and rsearch functions can search for an element in an
|
||||||
association which has the specified value. They return the index
|
association which has the specified value. They return the index
|
||||||
of the found element, or a NULL value if the value was not found.
|
of the found element, or a NULL value if the value was not found.
|
||||||
|
|
||||||
Associations can be copied by an assignment, and can be compared
|
Associations can be copied by an assignment, and can be compared
|
||||||
|
@@ -18,8 +18,8 @@ DESCRIPTION
|
|||||||
|
|
||||||
The following convention is used to declare modes:
|
The following convention is used to declare modes:
|
||||||
|
|
||||||
base config
|
base config
|
||||||
value string
|
value string
|
||||||
|
|
||||||
2 "binary" binary fractions
|
2 "binary" binary fractions
|
||||||
8 "octal" octal fractions
|
8 "octal" octal fractions
|
||||||
|
2
help/bit
2
help/bit
@@ -11,7 +11,7 @@ TYPES
|
|||||||
return int
|
return int
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Determine if the binary bit y is set in x. If:
|
Determine if the binary bit y is set in x. If:
|
||||||
|
|
||||||
x
|
x
|
||||||
int(---) mod 2 == 1
|
int(---) mod 2 == 1
|
||||||
|
8
help/blk
8
help/blk
@@ -26,7 +26,7 @@ DESCRIPTION
|
|||||||
... , B[len-1], these all initially having zero value.
|
... , B[len-1], these all initially having zero value.
|
||||||
|
|
||||||
The octets B[i] for i >= len always have zero value. If B[i] with
|
The octets B[i] for i >= len always have zero value. If B[i] with
|
||||||
some i >= len is referenced, len is increased by 1. For example:
|
some i >= len is referenced, len is increased by 1. For example:
|
||||||
|
|
||||||
B[i] = x
|
B[i] = x
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ DESCRIPTION
|
|||||||
If a block value B created by B = blk(len, chunk) is assigned to
|
If a block value B created by B = blk(len, chunk) is assigned to
|
||||||
another variable by C = B, a new block of the same structure as B
|
another variable by C = B, a new block of the same structure as B
|
||||||
is created to become the value of C, and the octets in B are copied
|
is created to become the value of C, and the octets in B are copied
|
||||||
to this new block. A block with possibly different length or
|
to this new block. A block with possibly different length or
|
||||||
chunksize is created by C = blk(B, newlen, newchunk), only the first
|
chunksize is created by C = blk(B, newlen, newchunk), only the first
|
||||||
min(len, newlen) octets being copied from B; later octets are
|
min(len, newlen) octets being copied from B; later octets are
|
||||||
assigned zero value. If omitted, newlen and newchunk default to
|
assigned zero value. If omitted, newlen and newchunk default to
|
||||||
@@ -120,14 +120,14 @@ DESCRIPTION
|
|||||||
last two avoid printing of the new value for A.
|
last two avoid printing of the new value for A.
|
||||||
|
|
||||||
Named blocks are assigned index numbers 0, 1, 2, ..., in the order
|
Named blocks are assigned index numbers 0, 1, 2, ..., in the order
|
||||||
of their creation. The block with index id is returned by blocks(id).
|
of their creation. The block with index id is returned by blocks(id).
|
||||||
With no argument, blocks() returns the number of current unfreed
|
With no argument, blocks() returns the number of current unfreed
|
||||||
named blocks. A named block may be used
|
named blocks. A named block may be used
|
||||||
|
|
||||||
The memory allocated to a named block is freed by the blkfree()
|
The memory allocated to a named block is freed by the blkfree()
|
||||||
function with argument the named block, its name, or its id number.
|
function with argument the named block, its name, or its id number.
|
||||||
The block remains in existence but with a null data pointer,
|
The block remains in existence but with a null data pointer,
|
||||||
its length and size being reduced to zero. A new block of memory
|
its length and size being reduced to zero. A new block of memory
|
||||||
may be allocated to it, with possibly new length and chunksize by:
|
may be allocated to it, with possibly new length and chunksize by:
|
||||||
|
|
||||||
blk(val [, len, chunk])
|
blk(val [, len, chunk])
|
||||||
|
@@ -90,7 +90,7 @@ DESCRIPTION
|
|||||||
so that num can be at most size(B) - ssi.
|
so that num can be at most size(B) - ssi.
|
||||||
|
|
||||||
For copying to a block B (named or unnamed), reallocation will be
|
For copying to a block B (named or unnamed), reallocation will be
|
||||||
required if dsi + num > sizeof(B). (This will not be permitted if
|
required if dsi + num > sizeof(B). (This will not be permitted if
|
||||||
protect(B) has bit 4 set.)
|
protect(B) has bit 4 set.)
|
||||||
|
|
||||||
For copying from a file stream fs, num can be at most size(fs) - ssi.
|
For copying from a file stream fs, num can be at most size(fs) - ssi.
|
||||||
|
12
help/blkfree
12
help/blkfree
@@ -12,7 +12,7 @@ TYPES
|
|||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
If val is a named block, or the name of a named block, or the
|
If val is a named block, or the name of a named block, or the
|
||||||
identifying index for a named block, blkfree(val) frees the
|
identifying index for a named block, blkfree(val) frees the
|
||||||
memory block allocated to this named block. The block remains
|
memory block allocated to this named block. The block remains
|
||||||
in existence with the same name, identifying index, and chunksize,
|
in existence with the same name, identifying index, and chunksize,
|
||||||
but its size and maxsize becomes zero and the pointer for the start
|
but its size and maxsize becomes zero and the pointer for the start
|
||||||
of its data block null.
|
of its data block null.
|
||||||
@@ -26,16 +26,16 @@ EXAMPLE
|
|||||||
> B1 = blk("foo")
|
> B1 = blk("foo")
|
||||||
> B2 = blk("Second block")
|
> B2 = blk("Second block")
|
||||||
show blocks
|
show blocks
|
||||||
id name
|
id name
|
||||||
---- -----
|
---- -----
|
||||||
0 foo
|
0 foo
|
||||||
1 Second block
|
1 Second block
|
||||||
|
|
||||||
> blkfree(B1)
|
> blkfree(B1)
|
||||||
> show blocks
|
> show blocks
|
||||||
id name
|
id name
|
||||||
---- -----
|
---- -----
|
||||||
1 Second block
|
1 Second block
|
||||||
|
|
||||||
> B1
|
> B1
|
||||||
block 0: foo
|
block 0: foo
|
||||||
|
@@ -12,7 +12,7 @@ TYPES
|
|||||||
Otherwise, if x is an object of type tt, or if x is not an object or
|
Otherwise, if x is an object of type tt, or if x is not an object or
|
||||||
number but y is an object of type tt, and the function tt_bround has
|
number but y is an object of type tt, and the function tt_bround has
|
||||||
to be defined; the types for x, plcs, rnd, and the returned value,
|
to be defined; the types for x, plcs, rnd, and the returned value,
|
||||||
if any, are as required for specified in tt_bround. For the object
|
if any, are as required for specified in tt_bround. For the object
|
||||||
case, plcs and rnd default to the null value.
|
case, plcs and rnd default to the null value.
|
||||||
|
|
||||||
For other cases:
|
For other cases:
|
||||||
@@ -31,7 +31,7 @@ DESCRIPTION
|
|||||||
If the number of binary places is n and eps = 10^-n, the
|
If the number of binary places is n and eps = 10^-n, the
|
||||||
result is the same as for appr(x, eps, rnd). This will be
|
result is the same as for appr(x, eps, rnd). This will be
|
||||||
exactly x if x is a multiple of eps; otherwise rounding occurs
|
exactly x if x is a multiple of eps; otherwise rounding occurs
|
||||||
to one of the nearest multiples of eps on either side of x. Which
|
to one of the nearest multiples of eps on either side of x. Which
|
||||||
of these multiples is returned is determined by z = rnd & 31, i.e.
|
of these multiples is returned is determined by z = rnd & 31, i.e.
|
||||||
the five low order bits of rnd, as follows:
|
the five low order bits of rnd, as follows:
|
||||||
|
|
||||||
|
@@ -4,25 +4,25 @@
|
|||||||
to be set or read. If only one argument is given, then the current
|
to be set or read. If only one argument is given, then the current
|
||||||
value of the named parameter is returned. If two arguments are given,
|
value of the named parameter is returned. If two arguments are given,
|
||||||
then the named parameter is set to the value of the second argument,
|
then the named parameter is set to the value of the second argument,
|
||||||
and the old value of the parameter is returned. Therefore you can
|
and the old value of the parameter is returned. Therefore you can
|
||||||
change a parameter and restore its old value later. The possible
|
change a parameter and restore its old value later. The possible
|
||||||
parameters are explained in the next section.
|
parameters are explained in the next section.
|
||||||
|
|
||||||
The scale function multiplies or divides a number by a power of 2.
|
The scale function multiplies or divides a number by a power of 2.
|
||||||
This is used for fractional calculations, unlike the << and >>
|
This is used for fractional calculations, unlike the << and >>
|
||||||
operators, which are only defined for integers. For example,
|
operators, which are only defined for integers. For example,
|
||||||
scale(6, -3) is 3/4.
|
scale(6, -3) is 3/4.
|
||||||
|
|
||||||
The quomod function is used to obtain both the quotient and remainder
|
The quomod function is used to obtain both the quotient and remainder
|
||||||
of a division in one operation. The first two arguments a and b are
|
of a division in one operation. The first two arguments a and b are
|
||||||
the numbers to be divided. The last two arguments c and d are two
|
the numbers to be divided. The last two arguments c and d are two
|
||||||
variables which will be assigned the quotient and remainder. For
|
variables which will be assigned the quotient and remainder. For
|
||||||
nonnegative arguments, the results are equivalent to computing a//b
|
nonnegative arguments, the results are equivalent to computing a//b
|
||||||
and a%b. If a is negative and the remainder is nonzero, then the
|
and a%b. If a is negative and the remainder is nonzero, then the
|
||||||
quotient will be one less than a//b. This makes the following three
|
quotient will be one less than a//b. This makes the following three
|
||||||
properties always hold: The quotient c is always an integer. The
|
properties always hold: The quotient c is always an integer. The
|
||||||
remainder d is always 0 <= d < b. The equation a = b * c + d always
|
remainder d is always 0 <= d < b. The equation a = b * c + d always
|
||||||
holds. This function returns 0 if there is no remainder, and 1 if
|
holds. This function returns 0 if there is no remainder, and 1 if
|
||||||
there is a remainder. For examples, quomod(10, 3, x, y) sets x to 3,
|
there is a remainder. For examples, quomod(10, 3, x, y) sets x to 3,
|
||||||
y to 1, and returns the value 1, and quomod(-4, 3.14159, x, y) sets x
|
y to 1, and returns the value 1, and quomod(-4, 3.14159, x, y) sets x
|
||||||
to -2, y to 2.28318, and returns the value 1.
|
to -2, y to 2.28318, and returns the value 1.
|
||||||
@@ -37,8 +37,8 @@
|
|||||||
|
|
||||||
The digit and bit functions return individual digits of a number,
|
The digit and bit functions return individual digits of a number,
|
||||||
either in base 10 or in base 2, where the lowest digit of a number
|
either in base 10 or in base 2, where the lowest digit of a number
|
||||||
is at digit position 0. For example, digit(5678, 3) is 5, and
|
is at digit position 0. For example, digit(5678, 3) is 5, and
|
||||||
bit(0b1000100, 2) is 1. Negative digit positions indicate places
|
bit(0b1000100, 2) is 1. Negative digit positions indicate places
|
||||||
to the right of the decimal or binary point, so that for example,
|
to the right of the decimal or binary point, so that for example,
|
||||||
digit(3.456, -1) is 4.
|
digit(3.456, -1) is 4.
|
||||||
|
|
||||||
@@ -139,11 +139,11 @@
|
|||||||
|
|
||||||
The functions rcin, rcmul, rcout, rcpow, and rcsq are used to
|
The functions rcin, rcmul, rcout, rcpow, and rcsq are used to
|
||||||
perform modular arithmetic calculations for large odd numbers
|
perform modular arithmetic calculations for large odd numbers
|
||||||
faster than the usual methods. To do this, you first use the
|
faster than the usual methods. To do this, you first use the
|
||||||
rcin function to convert all input values into numbers which are
|
rcin function to convert all input values into numbers which are
|
||||||
in a format called REDC format. Then you use rcmul, rcsq, and
|
in a format called REDC format. Then you use rcmul, rcsq, and
|
||||||
rcpow to multiply such numbers together to produce results also
|
rcpow to multiply such numbers together to produce results also
|
||||||
in REDC format. Finally, you use rcout to convert a number in
|
in REDC format. Finally, you use rcout to convert a number in
|
||||||
REDC format back to a normal number. The addition, subtraction,
|
REDC format back to a normal number. The addition, subtraction,
|
||||||
negation, and equality comparison between REDC numbers are done
|
negation, and equality comparison between REDC numbers are done
|
||||||
using the normal modular methods. For example, to calculate the
|
using the normal modular methods. For example, to calculate the
|
||||||
@@ -185,8 +185,8 @@
|
|||||||
|
|
||||||
The following convention is used to declare modes:
|
The following convention is used to declare modes:
|
||||||
|
|
||||||
base config
|
base config
|
||||||
value string
|
value string
|
||||||
|
|
||||||
2 "binary" binary fractions
|
2 "binary" binary fractions
|
||||||
8 "octal" octal fractions
|
8 "octal" octal fractions
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
Builtin functions
|
Builtin functions
|
||||||
|
|
||||||
There is a large number of built-in functions. Many of the
|
There is a large number of built-in functions. Many of the
|
||||||
functions work on several types of arguments, whereas some only
|
functions work on several types of arguments, whereas some only
|
||||||
work for the correct types (e.g., numbers or strings). In the
|
work for the correct types (e.g., numbers or strings). In the
|
||||||
following description, this is indicated by whether or not the
|
following description, this is indicated by whether or not the
|
||||||
description refers to values or numbers. This display is generated
|
description refers to values or numbers. This display is generated
|
||||||
by the 'show builtin' command.
|
by the 'show builtin' command.
|
||||||
|
35
help/calclevel
Normal file
35
help/calclevel
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
NAME
|
||||||
|
calclevel - current calculation level
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
calclevel()
|
||||||
|
|
||||||
|
TYPES
|
||||||
|
return nonnegative integer
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function returns the calculation level at which it is called.
|
||||||
|
When a command is being read from a terminal or from a file,
|
||||||
|
calc is at calculation level zero. The level is increased
|
||||||
|
by 1 each time calculation starts of a user-defined function
|
||||||
|
or of eval(S) for some expression S which evaluates to a string. It
|
||||||
|
decreases to zero if an error occurs or a quit or abort statement
|
||||||
|
is executed. Otherwise, it decreases by 1 when the calculation
|
||||||
|
is completed. Except when an error occurs or abort is executed,
|
||||||
|
the input level is not affected by changes in the calculation level.
|
||||||
|
|
||||||
|
Zero calculation level is also called top calculation level; greater
|
||||||
|
values of calclevel() indicate calculation is occurring at greater
|
||||||
|
depths.
|
||||||
|
|
||||||
|
EXAMPLE
|
||||||
|
n/a
|
||||||
|
|
||||||
|
LIMITS
|
||||||
|
none
|
||||||
|
|
||||||
|
LIBRARY
|
||||||
|
none
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
eval, read, quit, abort, inputlevel
|
@@ -6,7 +6,7 @@ SYNOPSIS
|
|||||||
|
|
||||||
TYPES
|
TYPES
|
||||||
x real
|
x real
|
||||||
eps real with abs(eps) < 1, defaults to epsilon()
|
eps real with abs(eps) < 1, defaults to epsilon()
|
||||||
n real with n >= 1
|
n real with n >= 1
|
||||||
rnd integer, defaults to config("cfappr")
|
rnd integer, defaults to config("cfappr")
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ DESCRIPTION
|
|||||||
|
|
||||||
If n >= 1 and den(x) > n, cfappr(x, n) returns the nearest above,
|
If n >= 1 and den(x) > n, cfappr(x, n) returns the nearest above,
|
||||||
nearest below, or nearest, approximation to x with denominator less
|
nearest below, or nearest, approximation to x with denominator less
|
||||||
than or equal to n. If den(x) <= n, cfappr(x,n) returns x.
|
than or equal to n. If den(x) <= n, cfappr(x,n) returns x.
|
||||||
|
|
||||||
In either case when the result v is not x, how v relates to x is
|
In either case when the result v is not x, how v relates to x is
|
||||||
determined by bits 0, 1, 2 and 4 of the argument rnd in the same way as
|
determined by bits 0, 1, 2 and 4 of the argument rnd in the same way as
|
||||||
|
@@ -30,7 +30,7 @@ DESCRIPTION
|
|||||||
This corresponds to the use of rnd for functions like round(x, n, rnd).
|
This corresponds to the use of rnd for functions like round(x, n, rnd).
|
||||||
|
|
||||||
If bit 3 or 4 of rnd is set, the lower order bits are ignored; bit 3
|
If bit 3 or 4 of rnd is set, the lower order bits are ignored; bit 3
|
||||||
is ignored if bit 4 is set. Thusi, for rnd > 3, it sufficient to
|
is ignored if bit 4 is set. Thusi, for rnd > 3, it sufficient to
|
||||||
consider the two cases rnd = 8 and rnd = 16.
|
consider the two cases rnd = 8 and rnd = 16.
|
||||||
|
|
||||||
If den(x) > 2, cfsim(x, 8) returns the value of the penultimate simple
|
If den(x) > 2, cfsim(x, 8) returns the value of the penultimate simple
|
||||||
@@ -55,7 +55,7 @@ DESCRIPTION
|
|||||||
|
|
||||||
rnd integer x half-integer x den(x) > 2
|
rnd integer x half-integer x den(x) > 2
|
||||||
|
|
||||||
8 0 x - sgn(x)/2 approximant
|
8 0 x - sgn(x)/2 approximant
|
||||||
16 x - sgn(x) x + sgn(x)/2 nearest
|
16 x - sgn(x) x + sgn(x)/2 nearest
|
||||||
|
|
||||||
From either cfsim(x, 0) and cfsim(x, 1), the other is easily
|
From either cfsim(x, 0) and cfsim(x, 1), the other is easily
|
||||||
@@ -72,7 +72,7 @@ DESCRIPTION
|
|||||||
Iteration of cfsim(x,8) until an integer is obtained gives a sequence of
|
Iteration of cfsim(x,8) until an integer is obtained gives a sequence of
|
||||||
"good" approximations to x with decreasing denominators and
|
"good" approximations to x with decreasing denominators and
|
||||||
correspondingly decreasing accuracy; each denominator is less than half
|
correspondingly decreasing accuracy; each denominator is less than half
|
||||||
the preceding denominator. (Unlike the "forward" sequence of
|
the preceding denominator. (Unlike the "forward" sequence of
|
||||||
continued-fraction approximants these are not necessarily alternately
|
continued-fraction approximants these are not necessarily alternately
|
||||||
greater than and less than x.)
|
greater than and less than x.)
|
||||||
|
|
||||||
|
4
help/cmp
4
help/cmp
@@ -17,7 +17,7 @@ TYPES
|
|||||||
|
|
||||||
return if x and y are both real: -1, 0, or 1
|
return if x and y are both real: -1, 0, or 1
|
||||||
if x and y are both numbers but not both real:
|
if x and y are both numbers but not both real:
|
||||||
-1, 0, 1, -1+1i, 1i, 1+1i, -1-1i, -1i, or 1-1i
|
-1, 0, 1, -1+1i, 1i, 1+1i, -1-1i, -1i, or 1-1i
|
||||||
if x and y are both strings: -1, 0, or 1
|
if x and y are both strings: -1, 0, or 1
|
||||||
all other cases: the null value
|
all other cases: the null value
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ DESCRIPTION
|
|||||||
obj point {x,y};
|
obj point {x,y};
|
||||||
|
|
||||||
if points with real components are to be partially ordered by their
|
if points with real components are to be partially ordered by their
|
||||||
euclidean distance from the origin, an appropriate point_rel
|
euclidean distance from the origin, an appropriate point_rel
|
||||||
function may be that given by
|
function may be that given by
|
||||||
|
|
||||||
define point_rel(a,b) = sgn(a.x^2 + a.y^2 - b.x^2 - b.y^2);
|
define point_rel(a,b) = sgn(a.x^2 + a.y^2 - b.x^2 - b.y^2);
|
||||||
|
275
help/command
275
help/command
@@ -3,7 +3,7 @@ Command sequence
|
|||||||
This is a sequence of any the following command formats, where
|
This is a sequence of any the following command formats, where
|
||||||
each command is terminated by a semicolon or newline. Long command
|
each command is terminated by a semicolon or newline. Long command
|
||||||
lines can be extended by using a back-slash followed by a newline
|
lines can be extended by using a back-slash followed by a newline
|
||||||
character. When this is done, the prompt shows a double angle
|
character. When this is done, the prompt shows a double angle
|
||||||
bracket to indicate that the line is still in progress. Certain
|
bracket to indicate that the line is still in progress. Certain
|
||||||
cases will automatically prompt for more input in a similar manner,
|
cases will automatically prompt for more input in a similar manner,
|
||||||
even without the back-slash. The most common case for this is when
|
even without the back-slash. The most common case for this is when
|
||||||
@@ -14,12 +14,10 @@ Command sequence
|
|||||||
described in the next section.
|
described in the next section.
|
||||||
|
|
||||||
|
|
||||||
NOTE: Calc commands are in lower case. UPPER case is used below
|
define a function
|
||||||
for emphasis only, and should be considered in lower case.
|
-----------------
|
||||||
|
define function(params) { body }
|
||||||
|
define function(params) = expression
|
||||||
DEFINE function(params) { body }
|
|
||||||
DEFINE function(params) = expression
|
|
||||||
This first form defines a full function which can consist
|
This first form defines a full function which can consist
|
||||||
of declarations followed by many statements which implement
|
of declarations followed by many statements which implement
|
||||||
the function.
|
the function.
|
||||||
@@ -27,18 +25,27 @@ Command sequence
|
|||||||
The second form defines a simple function which calculates
|
The second form defines a simple function which calculates
|
||||||
the specified expression value from the specified parameters.
|
the specified expression value from the specified parameters.
|
||||||
The expression cannot be a statement. However, the comma
|
The expression cannot be a statement. However, the comma
|
||||||
and question mark operators can be useful. Examples of
|
and question mark operators can be useful. Examples of
|
||||||
simple functions are:
|
simple functions are:
|
||||||
|
|
||||||
define sumcubes(a, b) = a^3 + b^3;
|
define sumcubes(a, b) = a^3 + b^3
|
||||||
define pimod(a) = a % pi();
|
define pimod(a) = a % pi()
|
||||||
|
define printnum(a, n, p)
|
||||||
|
{
|
||||||
|
if (p == 0) {
|
||||||
|
print a: "^": n, "=", a^n;
|
||||||
|
} else {
|
||||||
|
print a: "^": n, "mod", p, "=", pmod(a,n,p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HELP
|
|
||||||
This displays a general help message.
|
|
||||||
|
|
||||||
READ filename
|
read calc commands
|
||||||
|
------------------
|
||||||
|
read filename
|
||||||
|
read -once filename
|
||||||
This reads definitions from the specified filename.
|
This reads definitions from the specified filename.
|
||||||
The name can be quoted if desired. The calculator
|
The name can be quoted if desired. The calculator
|
||||||
uses the CALCPATH environment variable to search
|
uses the CALCPATH environment variable to search
|
||||||
through the specified directories for the filename,
|
through the specified directories for the filename,
|
||||||
similarly to the use of the PATH environment variable.
|
similarly to the use of the PATH environment variable.
|
||||||
@@ -47,19 +54,16 @@ Command sequence
|
|||||||
directory followed by a general calc library directory).
|
directory followed by a general calc library directory).
|
||||||
The ".cal" extension is defaulted for input files, so
|
The ".cal" extension is defaulted for input files, so
|
||||||
that if "filename" is not found, then "filename.cal" is
|
that if "filename" is not found, then "filename.cal" is
|
||||||
then searched for. The contents of the filename are
|
then searched for. The contents of the filename are
|
||||||
command sequences which can consist of expressions to
|
command sequences which can consist of expressions to
|
||||||
evaluate or functions to define, just like at the top
|
evaluate or functions to define, just like at the top
|
||||||
level command level.
|
level command level.
|
||||||
|
|
||||||
If the -m mode disallows opening of files for reading,
|
When -once is given, the read command acts like the regular
|
||||||
this command will be disabled.
|
read expect that it will ignore filename if is has been
|
||||||
|
previously read.
|
||||||
|
|
||||||
READ -once filename
|
The read -once form is particularly useful in a library that
|
||||||
This command acts like the regular READ expect that it
|
|
||||||
will ignore filename if is has been previously read.
|
|
||||||
|
|
||||||
This command is particularly useful in a library that
|
|
||||||
needs to read a 2nd library. By using the READ -once
|
needs to read a 2nd library. By using the READ -once
|
||||||
command, one will not reread that 2nd library, nor will
|
command, one will not reread that 2nd library, nor will
|
||||||
once risk entering into a infinite READ loop (where
|
once risk entering into a infinite READ loop (where
|
||||||
@@ -69,31 +73,236 @@ Command sequence
|
|||||||
If the -m mode disallows opening of files for reading,
|
If the -m mode disallows opening of files for reading,
|
||||||
this command will be disabled.
|
this command will be disabled.
|
||||||
|
|
||||||
WRITE filename
|
|
||||||
|
write calc commands
|
||||||
|
-------------------
|
||||||
|
write filename
|
||||||
This writes the values of all global variables to the
|
This writes the values of all global variables to the
|
||||||
specified filename, in such a way that the file can be
|
specified filename, in such a way that the file can be
|
||||||
later read in order to recreate the variable values.
|
later read in order to recreate the variable values.
|
||||||
For speed reasons, values are written as hex fractions.
|
For speed reasons, values are written as hex fractions.
|
||||||
This command currently only saves simple types, so that
|
This command currently only saves simple types, so that
|
||||||
matrices, lists, and objects are not saved. Function
|
matrices, lists, and objects are not saved. Function
|
||||||
definitions are also not saved.
|
definitions are also not saved.
|
||||||
|
|
||||||
If the -m mode disallows opening of files for writing,
|
If the -m mode disallows opening of files for writing,
|
||||||
this command will be disabled.
|
this command will be disabled.
|
||||||
|
|
||||||
QUIT
|
|
||||||
This leaves the calculator, when given as a top-level
|
|
||||||
command.
|
|
||||||
|
|
||||||
CD
|
quit or exit
|
||||||
Change the current directory to the home directory, if $HOME
|
------------
|
||||||
|
quit
|
||||||
|
quit string
|
||||||
|
exit
|
||||||
|
exit string
|
||||||
|
The action of these commands depends on where they are used.
|
||||||
|
At the interactive level, they will cause calc it edit.
|
||||||
|
This is the normal way to leave the calculator. In any
|
||||||
|
other use, they will stop the current calculation as if
|
||||||
|
an error had occurred.
|
||||||
|
|
||||||
|
If a string is given, then the string is printed as the reason
|
||||||
|
for quitting, otherwise a general quit message is printed.
|
||||||
|
The routine name and line number which executed the quit is
|
||||||
|
also printed in either case.
|
||||||
|
|
||||||
|
Exit is an alias for quit.
|
||||||
|
|
||||||
|
Quit is useful when a routine detects invalid arguments,
|
||||||
|
in order to stop a calculation cleanly. For example,
|
||||||
|
for a square root routine, an error can be given if the
|
||||||
|
supplied parameter was a negative number, as in:
|
||||||
|
|
||||||
|
define mysqrt(n)
|
||||||
|
{
|
||||||
|
if (! isnum(n))
|
||||||
|
quit "non-numeric argument";
|
||||||
|
if (n < 0)
|
||||||
|
quit "Negative argument";
|
||||||
|
return sqrt(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
See 'more information about abort and quit' below for
|
||||||
|
more information.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
abort
|
||||||
|
-----
|
||||||
|
abort
|
||||||
|
abort string
|
||||||
|
This command behaves like QUIT except that it will attempt
|
||||||
|
to return to the interactive level if permitted, otherwise
|
||||||
|
calc exit.
|
||||||
|
|
||||||
|
See 'more information about abort and quit' below for
|
||||||
|
more information.
|
||||||
|
|
||||||
|
|
||||||
|
change current directory
|
||||||
|
------------------------
|
||||||
|
cd
|
||||||
|
cd dir
|
||||||
|
Change the current directory to 'dir'. If 'dir' is ommitted,
|
||||||
|
change the current directory to the home directory, if $HOME
|
||||||
is set in the environment.
|
is set in the environment.
|
||||||
|
|
||||||
CD dir
|
|
||||||
Change the current directory to dir.
|
show information
|
||||||
|
----------------
|
||||||
|
show item
|
||||||
|
This command displays some information where 'item' is
|
||||||
|
one of the following:
|
||||||
|
|
||||||
|
blocks unfreed named blocks
|
||||||
|
builtin built in functions
|
||||||
|
config config parameters and values
|
||||||
|
constants cache of numeric constants
|
||||||
|
custom custom functions if calc -C was used
|
||||||
|
errors new error-values created
|
||||||
|
files open files, file position and sizes
|
||||||
|
function user-defined functions
|
||||||
|
globaltypes global variables
|
||||||
|
objfunctions possible object functions
|
||||||
|
objtypes defined objects
|
||||||
|
opcodes func internal opcodes for function `func'
|
||||||
|
sizes size in octets of calc value types
|
||||||
|
realglobals numeric global variables
|
||||||
|
statics unscoped static variables
|
||||||
|
numbers calc number cache
|
||||||
|
redcdata REDC data defined
|
||||||
|
strings calc string cache
|
||||||
|
literals calc literal cache
|
||||||
|
|
||||||
|
Only the first 4 characters of item are examined, so:
|
||||||
|
|
||||||
|
show globals
|
||||||
|
show global
|
||||||
|
show glob
|
||||||
|
|
||||||
|
do the same thing.
|
||||||
|
|
||||||
|
|
||||||
|
calc help
|
||||||
|
---------
|
||||||
|
help
|
||||||
|
help name
|
||||||
|
This displays a help related to 'name' or general
|
||||||
|
help of none is given.
|
||||||
|
|
||||||
|
|
||||||
|
=-=
|
||||||
|
|
||||||
|
|
||||||
|
more information about abort and quit
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
Consider the following calc file called myfile.cal:
|
||||||
|
|
||||||
|
print "start of myfile.cal";
|
||||||
|
define q() {quit "quit from q()"; print "end of q()"}
|
||||||
|
define a() {abort "abort from a()"}
|
||||||
|
x = 3;
|
||||||
|
{print "start #1"; if (x > 1) q()} print "after #1";
|
||||||
|
{print "start #2"; if (x > 1) a()} print "after #2";
|
||||||
|
{print "start #3"; if (x > 1) quit "quit from 3rd statement"}
|
||||||
|
print "end of myfile.cal";
|
||||||
|
|
||||||
|
The command:
|
||||||
|
|
||||||
|
calc read myfile
|
||||||
|
|
||||||
|
will produce:
|
||||||
|
|
||||||
|
q() defined
|
||||||
|
a() defined
|
||||||
|
start statment #1
|
||||||
|
quit from q()
|
||||||
|
after statment #1
|
||||||
|
start statment #2
|
||||||
|
abort from a()
|
||||||
|
|
||||||
|
The QUIT within the q() function prevented the ``end of q()''
|
||||||
|
statement from being evaluated. This QUIT command caused
|
||||||
|
control to be returned to just after the place where q()
|
||||||
|
was called.
|
||||||
|
|
||||||
|
Notice that unlike QUIT, the ABORT inside function a() halts
|
||||||
|
the processing of statements from the input source (myfile.cal).
|
||||||
|
Because calc was not interactive, ABORT causes calc to exit.
|
||||||
|
|
||||||
|
The command:
|
||||||
|
|
||||||
|
calc -i read myfile
|
||||||
|
|
||||||
|
will produce:
|
||||||
|
|
||||||
|
q() defined
|
||||||
|
a() defined
|
||||||
|
start statment #1
|
||||||
|
quit from q()
|
||||||
|
after statment #1
|
||||||
|
start statment #2
|
||||||
|
abort from a()
|
||||||
|
> <==== calc interactive prompt
|
||||||
|
|
||||||
|
because the '-i' calc causes ABORT to drop into an
|
||||||
|
interactive prompt. However typing a QUIT or ABORT
|
||||||
|
at the interactive prompt level will always calc to exit,
|
||||||
|
even when calc is invoked with '-i'.
|
||||||
|
|
||||||
|
Also observe that both of these commands:
|
||||||
|
|
||||||
|
cat myfile.cal | calc
|
||||||
|
cat myfile.cal | calc -i
|
||||||
|
|
||||||
|
will produce:
|
||||||
|
|
||||||
|
q() defined
|
||||||
|
a() defined
|
||||||
|
start statment #1
|
||||||
|
quit from q()
|
||||||
|
after statment #1
|
||||||
|
start statment #2
|
||||||
|
abort from a()
|
||||||
|
|
||||||
|
The ABORT inside function a() halts the processing of statements
|
||||||
|
from the input source (standard input). Because standard input
|
||||||
|
is not a terminal, using '-i' does not force it to drop into
|
||||||
|
an interactive prompt.
|
||||||
|
|
||||||
|
If one were to type in the contents of myfile.cal interactively,
|
||||||
|
calc will produce:
|
||||||
|
|
||||||
|
> print "start of myfile.cal";
|
||||||
|
start of myfile.cal
|
||||||
|
> define q() {quit "quit from q()"; print "end of q()"}
|
||||||
|
q() defined
|
||||||
|
> define a() {abort "abort from a()"}
|
||||||
|
a() defined
|
||||||
|
> x = 3;
|
||||||
|
> {print "start #1"; if (x > 1) q()} print "after #1";
|
||||||
|
start statment #1
|
||||||
|
quit from q()
|
||||||
|
after statment #1
|
||||||
|
> {print "start #2"; if (x > 1) a()} print "after #2";
|
||||||
|
start statment #2
|
||||||
|
abort from a()
|
||||||
|
> {print "start #3"; if (x > 1) quit "quit from 3rd statement"}
|
||||||
|
start #3
|
||||||
|
quit from 3rd statement
|
||||||
|
|
||||||
|
The ABORT from within the a() function returned control to
|
||||||
|
the interactive level.
|
||||||
|
|
||||||
|
The QUIT (after the if (x > 1) ...) will cause calc to exit
|
||||||
|
because it was given at the interactive prompt level.
|
||||||
|
|
||||||
|
|
||||||
|
=-=
|
||||||
|
|
||||||
|
|
||||||
Also see the help topic:
|
Also see the help topic:
|
||||||
|
|
||||||
statement flow control and declaration statements
|
statement flow control and declaration statements
|
||||||
usage for -m modes
|
usage how to invoke the calc command and calc -options
|
||||||
|
162
help/config
162
help/config
@@ -1,10 +1,10 @@
|
|||||||
Configuration parameters
|
Configuration parameters
|
||||||
|
|
||||||
Configuration parameters affect how the calculator performs certain
|
Configuration parameters affect how the calculator performs certain
|
||||||
operations. Among features that are controlled by these parameters
|
operations. Among features that are controlled by these parameters
|
||||||
are the accuracy of some calculations, the displayed format of results,
|
are the accuracy of some calculations, the displayed format of results,
|
||||||
the choice from possible alternative algorithms, and whether or not
|
the choice from possible alternative algorithms, and whether or not
|
||||||
debugging information is displayed. The parameters are
|
debugging information is displayed. The parameters are
|
||||||
read or set using the "config" built-in function; they remain in effect
|
read or set using the "config" built-in function; they remain in effect
|
||||||
until their values are changed by a config or equivalent instruction.
|
until their values are changed by a config or equivalent instruction.
|
||||||
The following parameters can be specified:
|
The following parameters can be specified:
|
||||||
@@ -40,9 +40,10 @@ Configuration parameters
|
|||||||
"blkverbose" TRUE=>print all lines, FALSE=>skip duplicates
|
"blkverbose" TRUE=>print all lines, FALSE=>skip duplicates
|
||||||
"blkbase" block output base
|
"blkbase" block output base
|
||||||
"blkfmt" block output format
|
"blkfmt" block output format
|
||||||
"lib_debug" calc library script debug level
|
"calc_debug" controls internal calc debug information
|
||||||
"calc_debug" internal calc debug level
|
"lib_debug" controls library script debug information
|
||||||
"user_debug" user defined debug level
|
"user_debug" for user defined debug information
|
||||||
|
"verbose_quit" TRUE=>print message on empty quit or abort
|
||||||
|
|
||||||
|
|
||||||
The "all" config value allows one to save/restore the configuration
|
The "all" config value allows one to save/restore the configuration
|
||||||
@@ -64,7 +65,7 @@ Configuration parameters
|
|||||||
It allows functions to control their configuration without impacting
|
It allows functions to control their configuration without impacting
|
||||||
the calling function.
|
the calling function.
|
||||||
|
|
||||||
There are two configuration state aliases that may be set. To
|
There are two configuration state aliases that may be set. To
|
||||||
set the backward compatible standard configuration:
|
set the backward compatible standard configuration:
|
||||||
|
|
||||||
config("all", "oldstd")
|
config("all", "oldstd")
|
||||||
@@ -78,7 +79,8 @@ Configuration parameters
|
|||||||
The "newstd" is not backward compatible with the historic
|
The "newstd" is not backward compatible with the historic
|
||||||
configuration. Even so, some people prefer this configuration
|
configuration. Even so, some people prefer this configuration
|
||||||
and place the config("all", "newstd") command in their CALCRC
|
and place the config("all", "newstd") command in their CALCRC
|
||||||
startup files.
|
startup files; newstd may also be established by invoking calc
|
||||||
|
with the flag -n.
|
||||||
|
|
||||||
When nonzero, the "trace" parameter activates one or more features
|
When nonzero, the "trace" parameter activates one or more features
|
||||||
that may be useful for debugging. These features correspond to
|
that may be useful for debugging. These features correspond to
|
||||||
@@ -103,31 +105,35 @@ Configuration parameters
|
|||||||
the decimal point to be printed in real or exponential mode in
|
the decimal point to be printed in real or exponential mode in
|
||||||
normal unformatted printing (print, strprint, fprint) or in
|
normal unformatted printing (print, strprint, fprint) or in
|
||||||
formatted printing (printf, strprintf, fprintf) when precision is not
|
formatted printing (printf, strprintf, fprintf) when precision is not
|
||||||
specified. The initial value is 20. This parameter does not change
|
specified. The initial value for oldstd is 20, for newstd 10.
|
||||||
the stored value of a number. Where rounding is necessary, the type
|
The parameter may be changed to the value d by either
|
||||||
of rounding to be used is controlled by "outround".
|
config("display", d) or by display (d). This parameter does not change
|
||||||
|
the stored value of a number. Where rounding is necessary to
|
||||||
|
display up to d decimal places, the type of rounding to be used is
|
||||||
|
controlled by config("outround").
|
||||||
|
|
||||||
The "epsilon" parameter specifies the default accuracy for the
|
The "epsilon" parameter specifies the default accuracy for the
|
||||||
calculation of functions for which exact values are not possible or
|
calculation of functions for which exact values are not possible or
|
||||||
not desired. For most functions, the
|
not desired. For most functions, the
|
||||||
|
|
||||||
remainder = exact value - calculated value
|
remainder = exact value - calculated value
|
||||||
|
|
||||||
has absolute value less than epsilon, but, except when the sign of
|
has absolute value less than epsilon, but, except when the sign of
|
||||||
the remainder is controlled by an appropriate parameter, the
|
the remainder is controlled by an appropriate parameter, the
|
||||||
absolute value of the remainder usually does not exceed epsilon/2.
|
absolute value of the remainder usually does not exceed epsilon/2.
|
||||||
Functions which require an epsilon value accept an
|
Functions which require an epsilon value accept an
|
||||||
optional argument which overrides this default epsilon value for
|
optional argument which overrides this default epsilon value for
|
||||||
that single call. (The value v can be assigned to the "epsilon"
|
that single call. The value v can be assigned to the "epsilon"
|
||||||
parameter by epsilon(v) as well as by config("epsilon", v), and the
|
parameter by either config("epsilon", v) or epsilon(v); each of
|
||||||
current value obtained by epsilon() as well as by config("epsilon").)
|
these functions return the current epsilon value; config("epsilon")
|
||||||
|
or epsilon() returns but does not change the epsilon value.
|
||||||
For the transcendental functions and the functions sqrt() and
|
For the transcendental functions and the functions sqrt() and
|
||||||
appr(), the calculated value is always a multiple of epsilon.
|
appr(), the calculated value is always a multiple of epsilon.
|
||||||
|
|
||||||
The "mode" parameter is a string specifying the mode for printing of
|
The "mode" parameter is a string specifying the mode for printing of
|
||||||
numbers by the unformatted print functions, and the default
|
numbers by the unformatted print functions, and the default
|
||||||
("%d" specifier) for formatted print functions. The initial mode
|
("%d" specifier) for formatted print functions. The initial mode
|
||||||
is "real". The available modes are:
|
is "real". The available modes are:
|
||||||
|
|
||||||
"frac" decimal fractions
|
"frac" decimal fractions
|
||||||
"int" decimal integer
|
"int" decimal integer
|
||||||
@@ -146,10 +152,10 @@ Configuration parameters
|
|||||||
runs in a time of O(N^2). The second method is a recursive and
|
runs in a time of O(N^2). The second method is a recursive and
|
||||||
complicated method which runs in a time of O(N^1.585). The argument
|
complicated method which runs in a time of O(N^1.585). The argument
|
||||||
for these parameters is the number of binary words at which the
|
for these parameters is the number of binary words at which the
|
||||||
second algorithm begins to be used. The minimum value is 2, and
|
second algorithm begins to be used. The minimum value is 2, and
|
||||||
the maximum value is very large. If 2 is used, then the recursive
|
the maximum value is very large. If 2 is used, then the recursive
|
||||||
algorithm is used all the way down to single digits, which becomes
|
algorithm is used all the way down to single digits, which becomes
|
||||||
slow since the recursion overhead is high. If a number such as
|
slow since the recursion overhead is high. If a number such as
|
||||||
1000000 is used, then the recursive algorithm is never used, causing
|
1000000 is used, then the recursive algorithm is never used, causing
|
||||||
calculations for large numbers to slow down. For a typical example
|
calculations for large numbers to slow down. For a typical example
|
||||||
on a 386, the two algorithms are about equal in speed for a value
|
on a 386, the two algorithms are about equal in speed for a value
|
||||||
@@ -168,9 +174,9 @@ Configuration parameters
|
|||||||
Redc2 specifies the sizes of numbers at which calc switches from
|
Redc2 specifies the sizes of numbers at which calc switches from
|
||||||
its first to its second algorithm when using the REDC algorithm.
|
its first to its second algorithm when using the REDC algorithm.
|
||||||
The first algorithm performs a multiply and a modular reduction
|
The first algorithm performs a multiply and a modular reduction
|
||||||
together in one loop which runs in O(N^2). The second algorithm
|
together in one loop which runs in O(N^2). The second algorithm
|
||||||
does the REDC calculation using three multiplies, and runs in
|
does the REDC calculation using three multiplies, and runs in
|
||||||
O(N^1.585). The argument for redc2 is the size of the modulus at
|
O(N^1.585). The argument for redc2 is the size of the modulus at
|
||||||
which the second algorithm begins to be used.
|
which the second algorithm begins to be used.
|
||||||
|
|
||||||
Config("tilde") controls whether or not a leading tilde ('~') is
|
Config("tilde") controls whether or not a leading tilde ('~') is
|
||||||
@@ -179,7 +185,7 @@ Configuration parameters
|
|||||||
specified maximum number. The initial "tilde" value is 1.
|
specified maximum number. The initial "tilde" value is 1.
|
||||||
|
|
||||||
Config ("tab") controls the printing of a tab before results
|
Config ("tab") controls the printing of a tab before results
|
||||||
automatically displayed when working interactively. It does not
|
automatically displayed when working interactively. It does not
|
||||||
affect the printing by the functions print, printf, etc. The initial
|
affect the printing by the functions print, printf, etc. The initial
|
||||||
"tab" value is 1.
|
"tab" value is 1.
|
||||||
|
|
||||||
@@ -265,7 +271,7 @@ Configuration parameters
|
|||||||
The default is to print only the first 256 octets.
|
The default is to print only the first 256 octets.
|
||||||
|
|
||||||
The "blkverbose" determines if all lines, including duplicates
|
The "blkverbose" determines if all lines, including duplicates
|
||||||
should be printed. If TRUE, then all lines are printed. If false,
|
should be printed. If TRUE, then all lines are printed. If false,
|
||||||
duplicate lines are skipped and only a "*" is printed in a style
|
duplicate lines are skipped and only a "*" is printed in a style
|
||||||
similar to od. This config value has not meaning if "blkfmt" is "str".
|
similar to od. This config value has not meaning if "blkfmt" is "str".
|
||||||
|
|
||||||
@@ -311,80 +317,100 @@ Configuration parameters
|
|||||||
|
|
||||||
The default "blkfmt" is "hd".
|
The default "blkfmt" is "hd".
|
||||||
|
|
||||||
With regards to "lib_debug", "calc_debug" and "user_debug":
|
The "calc_debug" is intended for controlling internal calc routines
|
||||||
higher absolute values result in more detailed debugging and
|
that test its operation, or collect or display information that
|
||||||
more verbose debug messages. The default value is 0 in which
|
might be useful for debug purposes. Much of the output from these
|
||||||
a very amount of debugging will be performed with nil messages.
|
will make sense only to calc wizards. Zero value (the default for
|
||||||
The -1 value is reserved for no debugging or messages. Any
|
both oldstd and newstd) of config("lib_calc") corresponds to switching
|
||||||
value <-1 will perform debugging silently (presumably collecting
|
off all these routines. For nonzero value, particular bits
|
||||||
data to be displayed at a later time). Values >0 result in a
|
currently have the following meanings:
|
||||||
greater degree of debugging and more verbose messages.
|
|
||||||
|
|
||||||
The "lib_debug" is reserved by convention for calc library scripts.
|
n Meaning of bit n of config("calc_debug")
|
||||||
This config parameter takes the place of the lib_debug global variable.
|
|
||||||
By convention, "lib_debug" has the following meanings:
|
|
||||||
|
|
||||||
<-1 no debug messages are printed though some internal
|
0 outputs shell commands prior to execution
|
||||||
debug actions and information may be collected
|
|
||||||
|
|
||||||
-1 no debug messages are printed, no debug actions will be taken
|
1 outputs currently active functions when a quit instruction
|
||||||
|
is executed
|
||||||
|
|
||||||
0 only usage message regarding each important object are
|
2 some details of shs, shs1 and md5 hash states are included
|
||||||
printed at the time of the read (default)
|
in the output when these are printed
|
||||||
|
|
||||||
>0 messages regarding each important object are
|
3 when a function constructs a block value, tests are
|
||||||
printed at the time of the read in addition
|
made that the result has the properties required for use of
|
||||||
to other debug messages
|
that block, e.g. that the pointer to the start of the
|
||||||
|
block is not NULL, and that its "length" is not negative.
|
||||||
|
A failure will result in a runtime error.
|
||||||
|
|
||||||
The "calc_debug" is reserved by convention for internal calc routines.
|
4 Report on changes to the state of stdin as well as changes
|
||||||
The output of "calc_debug" will change from release to release.
|
to internal variables that control the setting and restoring
|
||||||
Generally this value is used by calc wizards and by the regress.cal
|
of stdin.
|
||||||
routine (make check). By convention, "calc_debug" has the following
|
|
||||||
meanings:
|
|
||||||
|
|
||||||
<-1 reserved for future use
|
5 Report on changes to the run state of calc.
|
||||||
|
|
||||||
-1 no debug messages are printed, no debug actions will be taken
|
Bits >= 6 are reserved for future use and should not be used at this time.
|
||||||
|
|
||||||
0 very little, if any debugging is performed (and then mostly
|
By default, "calc_debug" is 0. The initial value may be overridden
|
||||||
in alpha test code). The only output is as a result of
|
by the -D command line option.
|
||||||
internal fatal errors (typically either math_error() or
|
|
||||||
exit() will be called). (default)
|
|
||||||
|
|
||||||
>0 a greater degree of debugging is performed and more
|
The "lib_debug" parameter is intended for controlling the possible
|
||||||
verbose messages are printed (regress.cal uses 1).
|
display of special information relating to functions, objects, and
|
||||||
|
other structures created by instructions in calc scripts.
|
||||||
|
Zero value of config("lib_debug") means that no such information
|
||||||
|
is displayed. For other values, the non-zero bits which currently
|
||||||
|
have meanings are as follows:
|
||||||
|
|
||||||
|
n Meaning of bit n of config("lib_debug")
|
||||||
|
|
||||||
|
0 When a function is defined, redefined or undefined at
|
||||||
|
interactive level, a message saying what has been done
|
||||||
|
is displayed.
|
||||||
|
|
||||||
|
1 When a function is defined, redefined or undefined during
|
||||||
|
the reading of a file, a message saying what has been done
|
||||||
|
is displayed.
|
||||||
|
|
||||||
|
The value for config("lib_debug") in both oldstd and newstd is 3,
|
||||||
|
but if calc is invoked with the -d flag, its initial value is zero.
|
||||||
|
Thus, if calc is started without the -d flag, until config("lib_debug")
|
||||||
|
is changed, a message will be output when a function is defined
|
||||||
|
either interactively or during the reading of a file.
|
||||||
|
|
||||||
|
By default, "lib_debug" is 3. The -d flag changes this default to 0.
|
||||||
|
The initial value may be overridden by the -D command line option.
|
||||||
|
|
||||||
The "user_debug" is provided for use by users. Calc ignores this value
|
The "user_debug" is provided for use by users. Calc ignores this value
|
||||||
other than to set it to 0 by default (for both "oldstd" and "newstd").
|
other than to set it to 0 by default (for both "oldstd" and "newstd").
|
||||||
No calc code or shipped library will change this value other than
|
No calc code or shipped library should change this value. Users
|
||||||
during startup or during a config("all", xyz) call.
|
should feel free to use it in any way. In particular they may
|
||||||
|
use particular bits for special purposes as with "calc_debug", or
|
||||||
|
they may use it to indicate a debug level with larger values
|
||||||
|
indicating more stringent and more informative tests with presumably
|
||||||
|
slower operation or more memory usage, and a particular value (like
|
||||||
|
-1 or 0) corresponding to "no tests".
|
||||||
|
|
||||||
The following is suggested as a convention for use of "user_debug".
|
By default, "user_debug" is 0. The initial value may be overridden
|
||||||
These are only suggestions: feel free to use it as you like:
|
by the -D command line option.
|
||||||
|
|
||||||
<-1 no debug messages are printed though some internal
|
The "verbose_quit" controls the print of the message:
|
||||||
debug actions and information may be collected
|
|
||||||
|
|
||||||
-1 no debug messages are printed, no debug actions will be taken
|
Quit or abort executed
|
||||||
|
|
||||||
0 very little, if any debugging is performed. The only output
|
when a non-interactive quit or abort without an argument is encounted.
|
||||||
are from fatal errors. (default)
|
A quit of abort without an argument does not display a message when
|
||||||
|
invoked at the interactive level.
|
||||||
>0 a greater degree of debugging is performed and more
|
|
||||||
verbose messages are printed
|
|
||||||
|
|
||||||
The following are synonyms for true:
|
The following are synonyms for true:
|
||||||
|
|
||||||
"on" "yes" "y" "true" "t" "1" any non-zero number
|
"on" "yes" "y" "true" "t" "1" any non-zero number
|
||||||
|
|
||||||
The following are synonyms for false:
|
The following are synonyms for false:
|
||||||
|
|
||||||
"off" "no" "n" "false" "f" "0" the number zero (0)
|
"off" "no" "n" "false" "f" "0" the number zero (0)
|
||||||
|
|
||||||
Examples of setting some parameters are:
|
Examples of setting some parameters are:
|
||||||
|
|
||||||
config("mode", "exp"); exponential output
|
config("mode", "exp"); exponential output
|
||||||
config("display", 50); 50 digits of output
|
config("display", 50); 50 digits of output
|
||||||
epsilon(epsilon() / 8); 3 bits more accuracy
|
epsilon(epsilon() / 8); 3 bits more accuracy
|
||||||
config("tilde", 0) disable roundoff tilde printing
|
config("tilde", 0) disable roundoff tilde printing
|
||||||
config("tab", "off") disable leading tab printing
|
config("tab", "off") disable leading tab printing
|
||||||
|
67
help/contrib
67
help/contrib
@@ -5,30 +5,27 @@ We welcome and encourage you to send us:
|
|||||||
* custom functions that you have modified or written
|
* custom functions that you have modified or written
|
||||||
* any other source code modifications
|
* any other source code modifications
|
||||||
|
|
||||||
Prior to doing so, you should consider trying your changes on the most
|
Prior to doing so, you should consider applying your changes to the most
|
||||||
recent alpha test code. To obtain the most recent code, look under
|
recent version of calc.
|
||||||
|
|
||||||
http://reality.sgi.com/chongo/calc/
|
Landon Noll maintains the official calc home page at:
|
||||||
|
|
||||||
You should also consider joining the calc testing group by sending a
|
http://reality.sgi.com/chongo/tech/comp/calc/
|
||||||
request to:
|
|
||||||
|
|
||||||
calc-tester-request@postofc.corp.sgi.com
|
See:
|
||||||
|
|
||||||
Your message body (not the subject) should consist of:
|
http://reality.sgi.com/chongo/tech/comp/calc/calc-download.html
|
||||||
|
|
||||||
subscribe calc-tester address
|
for information on how to obtain up a recent version of calc.
|
||||||
end
|
|
||||||
name your_full_name
|
|
||||||
|
|
||||||
where "address" is your EMail address and "your_full_name"
|
=-=
|
||||||
is your full name.
|
|
||||||
|
|
||||||
In order to consider integrating your code, we need:
|
In order to consider integrating your code, we need:
|
||||||
|
|
||||||
* help files (documentation)
|
* the calc version you are working with (use the latest calc, see above)
|
||||||
* CHANGES text (brief description of what it does)
|
* new help files or help file patches, if applicable (documentation)
|
||||||
* regress.cal test (to test non-custom code)
|
* proposed text for the CHANGES file (brief description of what it does)
|
||||||
|
* regress.cal test patch, if applicable
|
||||||
* your source code and/or source code changes (:-))
|
* your source code and/or source code changes (:-))
|
||||||
|
|
||||||
The best way to send us new code, if your changes are small, is
|
The best way to send us new code, if your changes are small, is
|
||||||
@@ -39,10 +36,44 @@ gziped (or compressed) tar file).
|
|||||||
|
|
||||||
You should send submissions to:
|
You should send submissions to:
|
||||||
|
|
||||||
calc-tester@postofc.corp.sgi.com
|
calc-tester at postofc dot corp dot sgi dot com
|
||||||
|
|
||||||
Thanks for considering submitting code to calc. Calc is a collective
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
|
||||||
|
Thanks for considering submitting code to calc. Calc is a collective
|
||||||
work by a number of people. It would not be what it is today without
|
work by a number of people. It would not be what it is today without
|
||||||
your efforts and submissions!
|
your efforts and submissions!
|
||||||
|
|
||||||
Landon Curt Noll <chongo@toad.com> /\oo/\
|
Calc bug reports, however, should be sent to:
|
||||||
|
|
||||||
|
calc-bugs at postofc dot corp dot sgi dot com
|
||||||
|
|
||||||
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
|
||||||
|
See the BUGS file or try the help command:
|
||||||
|
|
||||||
|
help bugs
|
||||||
|
|
||||||
|
for details on bug reporting.
|
||||||
|
|
||||||
|
=-=
|
||||||
|
|
||||||
|
One may join the calc testing group by sending a request to:
|
||||||
|
|
||||||
|
calc-tester-request at postofc dot corp dot sgi dot com
|
||||||
|
|
||||||
|
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||||
|
|
||||||
|
Your message body (not the subject) should consist of:
|
||||||
|
|
||||||
|
subscribe calc-tester address
|
||||||
|
end
|
||||||
|
name your_full_name
|
||||||
|
|
||||||
|
where "address" is your EMail address and "your_full_name"
|
||||||
|
is your full name.
|
||||||
|
|
||||||
|
Landon Curt Noll
|
||||||
|
http://reality.sgi.com/chongo/
|
||||||
|
|
||||||
|
chongo <was here> /\../\
|
||||||
|
47
help/credit
47
help/credit
@@ -2,7 +2,11 @@ Credits
|
|||||||
|
|
||||||
The majority of calc was written by David I. Bell.
|
The majority of calc was written by David I. Bell.
|
||||||
|
|
||||||
Calc archives and calc-tester mailing list maintained by Landon Curt Noll.
|
The Calc primary mirror, calc mailing list and calc bug report
|
||||||
|
processing is performed by Landon Curt Noll.
|
||||||
|
|
||||||
|
Landon Curt Noll maintains the master reference source, performs
|
||||||
|
release control functions as well as other calc maintenance functions.
|
||||||
|
|
||||||
Thanks for suggestions and encouragement from Peter Miller,
|
Thanks for suggestions and encouragement from Peter Miller,
|
||||||
Neil Justusson, and Landon Noll.
|
Neil Justusson, and Landon Noll.
|
||||||
@@ -11,7 +15,7 @@ Credits
|
|||||||
hist.c which is used to do the command line editing.
|
hist.c which is used to do the command line editing.
|
||||||
|
|
||||||
Thanks to Ernest W. Bowen for supplying many improvements in
|
Thanks to Ernest W. Bowen for supplying many improvements in
|
||||||
accuracy and generality for some numeric functions. Much of
|
accuracy and generality for some numeric functions. Much of
|
||||||
this was in terms of actual code which I gratefully accepted.
|
this was in terms of actual code which I gratefully accepted.
|
||||||
Ernest also supplied the original text for many of the help files.
|
Ernest also supplied the original text for many of the help files.
|
||||||
|
|
||||||
@@ -22,41 +26,10 @@ Credits
|
|||||||
|
|
||||||
Most of this source and binary has one of the following copyrights:
|
Most of this source and binary has one of the following copyrights:
|
||||||
|
|
||||||
Copyright (c) 19xx David I. Bell
|
Copyright (c) year David I. Bell
|
||||||
Copyright (c) 19xx David I. Bell and Landon Curt Noll
|
Copyright (c) year David I. Bell and Landon Curt Noll
|
||||||
Copyright (c) 19xx Landon Curt Noll
|
Copyright (c) year Landon Curt Noll
|
||||||
Copyright (c) 19xx Ernest Bowen and Landon Curt Noll
|
Copyright (c) year Ernest Bowen and Landon Curt Noll
|
||||||
|
|
||||||
Permission is granted to use, distribute, or modify this source,
|
Permission is granted to use, distribute, or modify this source,
|
||||||
provided that this copyright notice remains intact.
|
provided that this copyright notice remains intact.
|
||||||
|
|
||||||
Send calc comments, suggestions, bug fixes, enhancements and
|
|
||||||
interesting calc scripts that you would like you see included in
|
|
||||||
future distributions to:
|
|
||||||
|
|
||||||
dbell@auug.org.au
|
|
||||||
chongo@toad.com
|
|
||||||
|
|
||||||
Landon Noll maintains the official calc ftp archive at:
|
|
||||||
|
|
||||||
ftp://ftp.uu.net/pub/calc
|
|
||||||
|
|
||||||
Alpha test versions, complete with bugs, untested code and
|
|
||||||
experimental features may be fetched (if you are brave) under:
|
|
||||||
|
|
||||||
http://reality.sgi.com/chongo/calc/
|
|
||||||
|
|
||||||
One may join the calc testing group by sending a request to:
|
|
||||||
|
|
||||||
calc-tester-request@postofc.corp.sgi.com
|
|
||||||
|
|
||||||
Your message body (not the subject) should consist of:
|
|
||||||
|
|
||||||
subscribe calc-tester address
|
|
||||||
end
|
|
||||||
name your_full_name
|
|
||||||
|
|
||||||
where "address" is your EMail address and "your_full_name"
|
|
||||||
is your full name.
|
|
||||||
|
|
||||||
Enjoy!
|
|
||||||
|
@@ -28,7 +28,7 @@ DESCRIPTION
|
|||||||
calc -C
|
calc -C
|
||||||
|
|
||||||
In other words, explicit action must be taken in order to
|
In other words, explicit action must be taken in order to
|
||||||
enable the use of custom functions. By default (no -C arg)
|
enable the use of custom functions. By default (no -C arg)
|
||||||
custom functions are compiled in but disabled so that only
|
custom functions are compiled in but disabled so that only
|
||||||
portable calc scripts may be used.
|
portable calc scripts may be used.
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ DESCRIPTION
|
|||||||
multi-precision calculations in a C-like environment. You should
|
multi-precision calculations in a C-like environment. You should
|
||||||
consider implementing algorithms in the calc language as a first
|
consider implementing algorithms in the calc language as a first
|
||||||
choice. Sometimes an algorithm requires use of special hardware, a
|
choice. Sometimes an algorithm requires use of special hardware, a
|
||||||
non-portable OS or pre-compiled C library. In these cases a custom
|
non-portable OS or pre-compiled C library. In these cases a custom
|
||||||
interface may be needed.
|
interface may be needed.
|
||||||
|
|
||||||
The custom function interface is intended to make is easy for
|
The custom function interface is intended to make is easy for
|
||||||
|
@@ -9,7 +9,7 @@ Function definitions
|
|||||||
by a return statement, and the function definition is ended with a
|
by a return statement, and the function definition is ended with a
|
||||||
right brace.
|
right brace.
|
||||||
|
|
||||||
There are some subtle differences, however. The types of parameters
|
There are some subtle differences, however. The types of parameters
|
||||||
and variables are not defined at compile time, and may vary during
|
and variables are not defined at compile time, and may vary during
|
||||||
execution and be different in different calls to the function. For
|
execution and be different in different calls to the function. For
|
||||||
example, a two-argument function add may be defined by
|
example, a two-argument function add may be defined by
|
||||||
|
2
help/den
2
help/den
@@ -11,7 +11,7 @@ TYPES
|
|||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
For real x, den(x) returns the denominator of x when x is expressed
|
For real x, den(x) returns the denominator of x when x is expressed
|
||||||
in lowest terms with positive denominator. In calc,
|
in lowest terms with positive denominator. In calc,
|
||||||
real values are actually rational values. Each calc real
|
real values are actually rational values. Each calc real
|
||||||
value can be uniquely expressed as:
|
value can be uniquely expressed as:
|
||||||
|
|
||||||
|
@@ -14,7 +14,7 @@ Environment variables
|
|||||||
|
|
||||||
/usr/local/lib/calc
|
/usr/local/lib/calc
|
||||||
|
|
||||||
This value is used by the READ command. It is an error
|
This value is used by the READ command. It is an error
|
||||||
if no such readable file is found.
|
if no such readable file is found.
|
||||||
|
|
||||||
The CALCBINDINGS file searches the CALCPATH as well.
|
The CALCBINDINGS file searches the CALCPATH as well.
|
||||||
@@ -58,6 +58,10 @@ Environment variables
|
|||||||
a terminal, then calc will still run, but fancy command line
|
a terminal, then calc will still run, but fancy command line
|
||||||
editing is disabled.
|
editing is disabled.
|
||||||
|
|
||||||
|
NOTE: If calc was compiled with GNU-readline support, the
|
||||||
|
CALCBINDINGS facility is ignored and the standard
|
||||||
|
readline mechanisms (see readline(3)) are used.
|
||||||
|
|
||||||
HOME
|
HOME
|
||||||
|
|
||||||
This value is taken to be the home directory of the
|
This value is taken to be the home directory of the
|
||||||
|
@@ -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
|
DESCRIPTION
|
||||||
For eval(str), the value of str is to be a string that could be the body
|
For eval(str), the value of str is to be a string that could be the body
|
||||||
of the definition of a function f(). This string may declare local
|
of the definition of a function f(). This string may declare local
|
||||||
variables and include keywords (while, for, ...) other than the
|
variables and include keywords (while, for, ...) other than the
|
||||||
reserved keywords (define, show, help, read, write, show, cd) intended
|
reserved keywords (define, show, help, read, write, show, cd) intended
|
||||||
for interactive use or for reading from a file.
|
for interactive use or for reading from a file.
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user