Compare commits

...

31 Commits

Author SHA1 Message Date
Landon Curt Noll
97ed812cb9 Release calc version 2.11.0t10.1.2 2017-05-21 15:38:34 -07:00
Landon Curt Noll
6254c4a14c Release calc version 2.11.0t10.1.1 2017-05-21 15:38:34 -07:00
Landon Curt Noll
c7c0de97f2 Release calc version 2.11.0t10.1 2017-05-21 15:38:34 -07:00
Landon Curt Noll
96c34adee3 Release calc version 2.11.0t10 2017-05-21 15:38:33 -07:00
Landon Curt Noll
86c8e6dcf1 Release calc version 2.11.0t9.4.5 2017-05-21 15:38:33 -07:00
Landon Curt Noll
58d32c68f9 Release calc version 2.11.0t9.4.4 2017-05-21 15:38:33 -07:00
Landon Curt Noll
7d0b761de3 Release calc version 2.11.0t9.4.3 2017-05-21 15:38:33 -07:00
Landon Curt Noll
82ff31f246 Release calc version 2.11.0t9.4.2 2017-05-21 15:38:32 -07:00
Landon Curt Noll
7cb0a77c25 Release calc version 2.11.0t9.4.1 2017-05-21 15:38:32 -07:00
Landon Curt Noll
afb0e5c32a Release calc version 2.11.0t9.4 2017-05-21 15:38:32 -07:00
Landon Curt Noll
df32e3956d Release calc version 2.11.0t9.3.1 2017-05-21 15:38:32 -07:00
Landon Curt Noll
75e742c716 Release calc version 2.11.0t9.2 2017-05-21 15:38:32 -07:00
Landon Curt Noll
1b42111665 Release calc version 2.11.0t9.1.1 2017-05-21 15:38:32 -07:00
Landon Curt Noll
ea6b3904be Release calc version 2.11.0t9.1 2017-05-21 15:38:31 -07:00
Landon Curt Noll
f3fceff1b6 Release calc version 2.11.0t9 2017-05-21 15:38:31 -07:00
Landon Curt Noll
69d4a17187 Release calc version 2.11.0t8.10 2017-05-21 15:38:31 -07:00
Landon Curt Noll
a99a3400e7 Release calc version 2.11.0t8.9.1 2017-05-21 15:38:31 -07:00
Landon Curt Noll
9b6c308b42 Release calc version 2.11.0t8.9 2017-05-21 15:38:31 -07:00
Landon Curt Noll
8927373965 Release calc version 2.11.0t8.8 2017-05-21 15:38:30 -07:00
Landon Curt Noll
478d68fca9 Release calc version 2.11.0t8.7 2017-05-21 15:38:30 -07:00
Landon Curt Noll
e6e2556893 Release calc version 2.11.0t8.6 2017-05-21 15:38:30 -07:00
Landon Curt Noll
a7e363da8b Release calc version 2.11.0t8.5 2017-05-21 15:38:30 -07:00
Landon Curt Noll
8db10967e8 Release calc version 2.11.0t8.4 2017-05-21 15:38:30 -07:00
Landon Curt Noll
49be672338 Release calc version 2.11.0t8.3 2017-05-21 15:38:30 -07:00
Landon Curt Noll
a7d401cd65 Release calc version 2.11.0t8.2 2017-05-21 15:38:29 -07:00
Landon Curt Noll
5cc680fe42 Release calc version 2.11.0t8.1 2017-05-21 15:38:29 -07:00
Landon Curt Noll
2c72ea9339 Release calc version 2.11.0t8 2017-05-21 15:38:29 -07:00
Landon Curt Noll
0ffc341b10 Release calc version 2.11.0t7.5 2017-05-21 15:38:29 -07:00
Landon Curt Noll
2251281027 Release calc version 2.11.0t7.4 2017-05-21 15:38:29 -07:00
Landon Curt Noll
45a4b8469d Release calc version 2.11.0t7.3 2017-05-21 15:38:29 -07:00
Landon Curt Noll
9204d2fb8c Release calc version 2.11.0t7.2 2017-05-21 15:38:28 -07:00
317 changed files with 8588 additions and 4981 deletions

134
BUGS
View File

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

524
CHANGES
View File

@@ -1,4 +1,420 @@
Following is the change from calc version 2.11.0t7 to date: The following are the changes from calc version 2.11.0t10 to date:
Misc code cleanup. Removed dead code. Removed trailing whitespace.
Fixed whitespace to make the best use of 8 character tabs.
Fixed some bugs relaing to '// and %' in combination with some
of the the rounding modes based on a patch from Ernest Bowen
<ernie@turing.une.edu.au>.
A patch from Klaus Alexander Seistrup <klaus@seistrup.dk>, when
used in combination with the GNU-readline facility, will prevent
it from saving empty lines.
Minor typos fixed in regress.cal
Added 8500 test serise and test8500.cal to perform more extensive
tests on // and % with various rounding modes.
The 'unused value ignored' messages now start with Line 999: instead
of just 999:.
The following are the changes from calc version 2.11.0t8.9.1 to 2.11.0t9.4.5:
The config("verbose_quit") will control the printing of the message:
Quit or abort executed
when a non-interactive ABORT, QUIT or EXIT is encounted. By default,
config("verbose_quit") is TRUE and the message is printed. If one does:
config("verbose_quit", 0)
the message is disabled.
Added 8400 regression test set and test8400.cal to test the new
quit and config("verbose_quit") functionality.
Fixed the BigEndian BASEB==16 regression bugs by correctly swapping
16 bit HALFs in a 64 bit value (such as a 64 bit file pointer).
Added calclevel() builtin to calculation level at which it is called.
Added help/calclevel and help/inputlevel help files.
Removed regression tests 951 and 5984 so that the regress test will
run in non-interactively / without a TTY such as under Debian's
build daemon.
The eval(str) builtin will return an error-value rather than cause
an execution error str has a scan-error.
Declarations are permitted to end with EOF as well as a newline or ';'.
When prompt() occurs while reading a file, it will take input from
the terminal rather than taking it from a file. For example:
/* This demonstrates the use of prompt() and some other things */
config("verbose_quit", 0);
define getnumber() {
local x;
for (;;) {
x = eval(prompt(">>> "));
if (isnum(x))
return x;
print "Not a number! Try again";
}
}
print "This will display the sqrt of each number you enter";
print "Enter quit to stop";
for (;;) {
print sqrt(getnumber());
}
print "Good bye";
Comments entered at input terminal level may be spread over several
lines. For example:
/*
* Assume that this calc script is called: comment.cal
* Then these commands now work:
* cat comment.cal | calc
* calc < comment.cal
*/
print "Hello";
Added:
-D calc_debug[:lib_debug:[user_debug]]
to set the initial value of config("calc_debug"), config("lib_debug")
and config("user_debug").
The : separated strings of -D 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.
Reordered the config structure moving calc_debug ahead of lib_debug.
Added bits 4 and 5 to config("calc_debug"):
4 Report on changes to the state of stdin as well as changes
to internal variables that control the setting and restoring
of stdin.
5 Report on changes to the run state of calc.
Fixed portability issue in seed.c relating to /dev/urandom and ustat.
Added a fix from Martin Buck <mb@netwings.ch> to detect when
calc aborts early instead of completing the regression test.
Now 'make chk' will require the last line of calc output to
end in the string ``Ending regression tests''.
Added a patch from Martin Buck <mb@netwings.ch> to allow use of
GNU-readline. Note that GNU-readline is not shipped with calc.
His patch only provides the hooks to use it. One must comment out:
USE_READLINE=
READLINE_LIB=
READLINE_INCLUDE=
and comment in:
USE_READLINE= -DUSE_READLINE
READLINE_LIB= -lreadline -lhistory
READLINE_INCLUDE= -I/usr/include/readline
in addition to pre-installing GNU-readline in your system to use
this facility.
Changed the "object already defined" math_error to a scanerror message.
Removed the limit on the number of object types.
Calc tarballs are now named calc-version.tar.gz and untar into
a sub-directory called calc-version.
Made a small change to declarations of static variables to reduce
the internal opcodes needed to declare them.
Fixed a permission problem on ranlib-ed *.a files that was reported
by Michael Somos <somos@grail.cba.csuohio.edu>.
Added patch by Klaus Alexander Seistrup <klaus@seistrup.dk> related
to GNU-readline:
+ enable calc specific bindings in ~/.inputrc
+ save a copy of your session to disk and reload them next
time you're using calc
+ only add a line to the history if it is different from
the previous line
Added the Makefile symbol HAVE_GETRUSAGE to determine if the
system supports the getrusage() system call.
Fixed the make depend code in the custom and sample Makefiles.
Fixed how the help/builtin file is formed. The help/Makefile is
now given the name of the native C compiler by the top level Makefile.
The include files are installed under INCDIRCALC (a new Makefile variable)
which by default is ${INCDIR}/calc. The INCDIR (also a new Makefile var)
by default is /usr/local/include. Include files previously installed
directly under ${LIBDIR} will be removed.
Added the piforever() funcion to lib/pi.cal. It was written by
Klaus Alexander Seistrup <klaus@seistrup.dk> and was inspired by
an algorithm conceived by Lambert Meertens. (See also the ABC
Programmer's Handbook, by Geurts, Meertens & Pemberton, published
by Prentice-Hall (UK) Ltd., 1990.) The piforever() funcion prints
digits of pi for as long as your memory and system uptime allows. :-)
Fixed the URLs found thruout the source and documentation which did
not and in /, but should for performance and server load reasons.
Cleaned up and improved handling of "mat" and "obj". The comma in:
mat A[2], B[3];
is changed to whatever is appropriate in the context:
+ comma operator
+ separator of arguments in a function call
+ separator of arguments in a defintion
etc.
The expression (mat A[2]), B[3] returns B[3], assuming B already
exists as something created by a statement like: global mat B[4].
What used to be done by the expression:
mat A[2], B[3]
will now require something like:
mat A[2], mat B[3] or A = mat[2], B = mat[3]
For example, if obj point and obj pair are known types, the
following is now allowed:
L = list(mat[2], mat[3], obj point, obj pair)
As another example, the following is allowed:
define f(a = mat[2] = {3,4}) = 5 * a;
as well as the following:
obj point {x,y}, PP = obj pair {A,B} = {obj point, obj point}
which creates two object types at compile time and when executed,
assigns a pair-object value to a variable PP.
Fixed a bug whereby a for loop would behave incorrectly. For example:
config("trace", 2),
global x;
define f() {for ( ; x > 0; x--) {print x;}}
x = 5, f()
will stop after printing 1 instead of looping forever.
Added values l_format, which when CHECK_L_FORMAT is defined ahead
of including longlong.h will help detect when a system can deal with
'long long' but not '%lld' in printf. If a system with 'long long'
uses '%ld' to print a 64 bit value, then l_format will be > 0;
othewise if "%lld" is required, l_format will be < 0.
Added HAVE_STRDUP Makefile variable as well as the have_strdup.c
program that forms the have_strdup.h file. The have_strdup.h file
will define HAVE_STRDUP is the system has strdup(). If HAVE_STRDUP
is not defined, then calc will use calc_strdup() to simulate
the real strdup() function.
Calc no longer makes use of sys_errlist and sys_nerr. Some systems
no longer suppor these values (even though they should from a
legacy prospective). Calc now relies on the fact that strerror()
will return NULL of no such system error exists. System errors >=
10000 will be considered calc errors instead. The Makefile symbol
ERRNO_DECL has gone away as well as calc_errno.c and calc_errno.h.
System errors that are are not known to to the libc strerror()
function, will now print (via the strerror() calc builtin function)
something such as:
Unknown error 9999
Fixed some insure code inspection tool issues that were discovered
and investigated by Michel van der List <vanderlistmj@sbphrd.com>.
Made an effort to ensure that the v_subtype of VALUES are initialized
to V_NOSUBTYPE thruout the source code.
Established a separate calc-bugs address from the calc-tester
maining list. Using anti-spam address forms in order to try and
stay under the radar of spammers as much as one can do so.
The following are the changes from calc version 2.11.0t8 to 2.11.0t8.9:
Moved 'wishlist' enhancements from the help/todo file to a new
help/wishlist file. Ordered, by priority, help/todo items into
Very High, High and Medium priority items.
The BUGS file now has a 'bugs' section as well as a 'mis-features'
section.
Improved how calc internally dealt with reading EOF or '\0' characters.
Calc now allows multiple defines to occur on the same line:
(Thanks goes to Ernest Bowen <ernie@turing.une.edu.au>)
define f8300(x) = x^2; define g8300(x) = 1 - x;
Improved calc's ability to deal with and recover from errors.
Added inputlevel() builtin to return the input processing level.
In an interact mode, inputlevel() returns 0. When directly reading
a calc script, inputlevel() returns 1. When reading a script which
in turn reads another script, inputlevel() returns 2. etc...
If $CALCRC has more than one file as in file1:file2 and an error
occurs in file1, then calc -c will not read file2.
Fixed some of the old EMail addresses found in calc documentation.
Added HAVE_USTAT, HAVE_GETSID, HAVE_GETPGID, HAVE_GETTIME, HAVE_GETPRID
and HAVE_URANDOM symbols to the Makefile. These symbols, along with
have_ustat.c, have_getsid.c, have_getpgid.c, have_gettime.c and
have_getprid.c form: have_ustat.h, have_getsid.h, have_getpgid.h,
have_gettime.h, have_getprid.h and have_urandom.h which in turn
are used by pseudo_seed() in seed.c to determine what types of
system services can be used to form a pseudo-random seed.
Fixed the way calc -c will continue processing $CALCRC when errors
are encountered. Unless -d is also given, calc -c will report
when calc is unable to open a $CALCRC file.
Fixed the lower level make depend rules.
Misc cleanup on the have_*.c support source files.
Misc source file cleanup for things such as } else { style consistency.
Fixed the basis for FNV-1 hashes. Piror to this fix, the hash()
builtin produced FNV hash values that did not match the FNV-1
algorithm as specified in:
http://reality.sgi.com/chongo/tech/comp/fnv/index.html
Removed an unused argument in the function getbody() in codegen.c.
Encountering of EOF in getbody() will cause a scanerror rather then
stop activity. This will now result in a scanerror:
echo 'define f(x) { ' > myfile
calc -i read myfile
A '{' at the start of a command and a later matching '}' surrounding zero
or more statements (and possibly newlines) results in a function body to
be "evaluated". This permits another command to follow on the same
line as the '}' as in:
{display(5)} read something;
and:
{static a = 5} define f(x) = a + x;
String constants can now be concatenated. For exmaple:
s = "curds" ' and ' "whey";
Added FNV hash to the regression test suite.
Added Ernest Bowen's <ernie@turing.une.edu.au> fix for the
FNV regression test of the hash() builtin function.
Added Ernest Bowen's <ernie@turing.une.edu.au> patch to improve
the way config("calc_debug"). Now the lower 4 bits of the
config("calc_debug") parameter have the following meaning:
n Meaning of bit n of config("calc_debug")
0 Outputs shell commands prior to execution.
1 Outputs currently active functions when a quit instruction
is executed.
2 Some details of shs, shs1 and md5 hash states are included
in the output when these are printed.
3 When a function constructs a block value, tests are
made that the result has the properties required for use of
that block, e.g. that the pointer to the start of the
block is not NULL, and that its "length" is not negative.
A failure will result in a runtime error.
Changed the meaning of (config("calc_debug") & 1) from only printing
the shell commands (and pausing) while displaying help files into
the printing of any shell command prior to execution.
Documented the meaning of config("lib_debug"):
n Meaning of bit n of config("lib_debug")
0 When a function is defined, redefined or undefined at
interactive level, a message saying what has been done
is displayed.
1 When a function is defined, redefined or undefined during
the reading of a file, a message saying what has been done
is displayed.
The value for config("lib_debug") in both oldstd and newstd is
3, but if calc is invoked with the -d flag, its initial value
is zero. Thus, if calc is started without the -d flag, until
config("lib_debug") is changed, a message will be output when a
function is defined either interactively or during the reading
of a file.
Changed the calc lib files to reflect the new config("lib_debug")
bit field meaning. Calc lib files that need to print extra information
should now do something such as:
if (config("lib_debug") & 3) {
print "obj xyz defined";
print "funcA([val1 [, val2]]) defined";
print "funcB(size, mass, ...) defined";
}
Fixed the help/custom_cal, help/new_custom, and help/copy files so
that they contain the correct contents instead of the 'usage' file.
Fixed problem with loss of bindings when calc -i args runs into
an error while processing 'args' and drops into interactive mode
without the terminal bindings being set.
Added patch from Ernest Bowen to extablish the abort command as
well as to clarify the roles of quit and exit. See the help/command
file for details.
Updated to some extend, the help/statement and help/command help
files with new information about SHOW, QUIT, EXIT and ABORT.
Added show sizes to pzasusb8.cal.
Updated calc man page and help/usage file to reflect recent
command line changes.
Fixed a bug, reported by Michael Somos <somos@grail.cba.csuohio.edu>,
which prevented calc -m from being used.
Fixed misc compiler warnings.
The following are the changes from calc version 2.11.0t7 to 2.11.0t7.5:
Calc has some new command line flags / command line meaning: Calc has some new command line flags / command line meaning:
(Thanks goes to Ernest Bowen <ernie@turing.une.edu.au>) (Thanks goes to Ernest Bowen <ernie@turing.une.edu.au>)
@@ -103,8 +519,50 @@ Following is the change from calc version 2.11.0t7 to date:
n == 0 if -c, continue, without -c, stop n == 0 if -c, continue, without -c, stop
n < 0 continue on error, even if -c was given on the command line n < 0 continue on error, even if -c was given on the command line
Calc compilation now stops at the first scanerror.
Following is the change from calc version 2.11.0t1 to 2.11.0t6.3: Restored the feature where -p disables the printing of leading tabs
as of config("tab",0) had been executed. So using calc in a pipe:
calc -p 2+17 | whey
will write '19' instead of '\t19' to the whey command.
Updated calc man page and help/usage file to reflect recent
command line changes.
Converted start_done into a general calc run state enum called
run_state within the calc source.
Removed README.OLD.
Added the Makefile variable ${LCC} to invoke the local c compiler.
By default, ${CC} also run the ${LCC} compiler. The distinction is
useful when using something such as purify. In the case of ${LCC},
only the local C compiler is invoked. In the case of ${CC} a purify
compile is invoked. Only the source that must be compiled and run
on the local machine use ${LCC}; everything else uses ${CC}.
Fixed memory buffer ovreread problem in eatstring() in token.c.
Fixed memory leaks related to putenv().
Fixed memory leaks realted to srandom().
Fixed compilation warnings and problems on BSDI.
Removed ${CCMAIN} as a variable from the Makefile. Now files
use either ${CFLAGS} for general C source and ${ICFLAGS} for
intermediate C source (e.g., special code for building hsrc files).
The main calc URL is now:
http://reality.sgi.com/chongo/tech/comp/calc/
Misc calc man page fixes.
The following are the changes from calc version 2.11.0t1 to 2.11.0t6.3:
Removed the makefile symbol MAIN. Now forcing all functions to correctly Removed the makefile symbol MAIN. Now forcing all functions to correctly
be declared main. To satisfy some old broken compilers, a return 0; be declared main. To satisfy some old broken compilers, a return 0;
@@ -296,12 +754,12 @@ Following is the change from calc version 2.11.0t1 to 2.11.0t6.3:
Fixed misc compile warnings and notices. Fixed misc compile warnings and notices.
Following is the change from calc version 2.10.3t5.38 to 2.11.0t0: The following are the changes from calc version 2.10.3t5.38 to 2.11.0t0:
Fixed a few compile problems found under Red Hat 6.0 Linux. Fixed a few compile problems found under Red Hat 6.0 Linux.
Following is the change from calc version 2.10.3t5.38 to 2.11.3t5.46: The following are the changes from calc version 2.10.3t5.38 to 2.11.3t5.46:
Fixed a bug discovered by Ernest Bowen related to matrix-to-matrix copies. Fixed a bug discovered by Ernest Bowen related to matrix-to-matrix copies.
@@ -358,7 +816,7 @@ Following is the change from calc version 2.10.3t5.38 to 2.11.3t5.46:
into a single section. into a single section.
Following is the change from calc version 2.10.3t5.34 to 2.10.3t5.37: The following are the changes from calc version 2.10.3t5.34 to 2.10.3t5.37:
Per request from David I Bell, the README line: Per request from David I Bell, the README line:
@@ -877,7 +1335,7 @@ Following is the change from calc version 2.10.3t5.34 to 2.10.3t5.37:
user-specified bound. user-specified bound.
Following is the change from calc version 2.10.3t5.28 to 2.10.3t5.33: The following are the changes from calc version 2.10.3t5.28 to 2.10.3t5.33:
Added hnrmod(v, h, n, r) builtin to compute: Added hnrmod(v, h, n, r) builtin to compute:
@@ -1239,11 +1697,11 @@ Following is the change from calc version 2.10.3t5.28 to 2.10.3t5.33:
Added regression tests related to saveval(), dot and pointers. Added regression tests related to saveval(), dot and pointers.
Following is the change from calc version 2.10.3t5.11 to 2.10.3t5.27: The following are the changes from calc version 2.10.3t5.11 to 2.10.3t5.27:
The todo help file as been updated with the in-progress items: The todo help file as been updated with the in-progress items:
XXX - block print function is not written yet ... xxx - block print function is not written yet ...
Expanded the role of blk() to produce unnamed blocks as in: Expanded the role of blk() to produce unnamed blocks as in:
@@ -1381,7 +1839,7 @@ Following is the change from calc version 2.10.3t5.11 to 2.10.3t5.27:
where x was not 2^n-1 would leak memory. This has been fixed. where x was not 2^n-1 would leak memory. This has been fixed.
Following is the change from calc version 2.10.3t5.1 to 2.10.3t5.10: The following are the changes from calc version 2.10.3t5.1 to 2.10.3t5.10:
Misc printf warning bug fixes. Misc printf warning bug fixes.
@@ -1582,7 +2040,7 @@ Following is the change from calc version 2.10.3t5.1 to 2.10.3t5.10:
regression tests for memsize(), sizeof() and size(). regression tests for memsize(), sizeof() and size().
Following is the change from calc version 2.10.3t4.16 to 2.10.3t5.0: The following are the changes from calc version 2.10.3t4.16 to 2.10.3t5.0:
The calc source now comes with a custom sub-directory which The calc source now comes with a custom sub-directory which
contains the custom interface code. The main Makefile now contains the custom interface code. The main Makefile now
@@ -1774,7 +2232,7 @@ Following is the change from calc version 2.10.3t4.16 to 2.10.3t5.0:
The max(), min() builtins work for lists. The max(), min() builtins work for lists.
Following is the change from calc version 2.10.3t3 to 2.10.3t4.15: The following are the changes from calc version 2.10.3t3 to 2.10.3t4.15:
The priority of unary + and - to that of binary + and - when they are The priority of unary + and - to that of binary + and - when they are
applied to a first or only term. Thus: applied to a first or only term. Thus:
@@ -1950,7 +2408,7 @@ Following is the change from calc version 2.10.3t3 to 2.10.3t4.15:
Fixed error in using cmdbuf(""). Fixed error in using cmdbuf("").
Following is the change from calc version 2.10.3t0 to 2.10.3t2: The following are the changes from calc version 2.10.3t0 to 2.10.3t2:
Bumped to version 2.10.3 due to the amount of changes. Bumped to version 2.10.3 due to the amount of changes.
@@ -2112,7 +2570,7 @@ Following is the change from calc version 2.10.3t0 to 2.10.3t2:
SGI 6.2 and later uses -xansi. SGI 6.2 and later uses -xansi.
Following is the change from calc version 2.10.2t33 to 2.10.2t34: The following are the changes from calc version 2.10.2t33 to 2.10.2t34:
Fixed a bug related to fact(). Fixed a bug related to fact().
@@ -2189,7 +2647,7 @@ Following is the change from calc version 2.10.2t33 to 2.10.2t34:
http://www.latech.edu/~acm/HelloWorld.shtml http://www.latech.edu/~acm/HelloWorld.shtml
Following is the change from calc version 2.10.2t25 to 2.10.2t32: The following are the changes from calc version 2.10.2t25 to 2.10.2t32:
Eliminated use of VARARG and <varargs.h>. Calc supports only Eliminated use of VARARG and <varargs.h>. Calc supports only
<stdarg.h>. The VARARGS Makefile variable has been eliminated. <stdarg.h>. The VARARGS Makefile variable has been eliminated.
@@ -2373,7 +2831,7 @@ Following is the change from calc version 2.10.2t25 to 2.10.2t32:
and file system permits. and file system permits.
Following is the change from calc version 2.10.2t4 to 2.10.2t24: The following are the changes from calc version 2.10.2t4 to 2.10.2t24:
Added makefile debugging rules: Added makefile debugging rules:
@@ -2658,7 +3116,7 @@ Following is the change from calc version 2.10.2t4 to 2.10.2t24:
SWAP_HALF_IN_OFF_T. SWAP_HALF_IN_OFF_T.
Following is the change from calc version 2.10.2t1 to 2.10.2t3: The following are the changes from calc version 2.10.2t1 to 2.10.2t3:
Fixed bug in the regression suite that made test3400 and test4100 Fixed bug in the regression suite that made test3400 and test4100
fail on correct computations. fail on correct computations.
@@ -2834,7 +3292,7 @@ Following is the change from calc version 2.10.2t1 to 2.10.2t3:
treated as read-only. treated as read-only.
Following is the change from calc version 2.10.1t21 to 2.10.2t0: The following are the changes from calc version 2.10.1t21 to 2.10.2t0:
Bumped patch level 2.10.2t0 in honor of having help files for Bumped patch level 2.10.2t0 in honor of having help files for
all builtin functions. Beta release will happen at the end of all builtin functions. Beta release will happen at the end of
@@ -2916,7 +3374,7 @@ Following is the change from calc version 2.10.1t21 to 2.10.2t0:
mat D[] = { } mat D[] = { }
Following is the change from calc version 2.10.1t20 to 2.10.1t20: The following are the changes from calc version 2.10.1t20 to 2.10.1t20:
Changes made in preparation for Blum Blum Shub random number generator. Changes made in preparation for Blum Blum Shub random number generator.
@@ -2993,7 +3451,7 @@ Following is the change from calc version 2.10.1t20 to 2.10.1t20:
<ernie@neumann.une.edu.au> <ernie@neumann.une.edu.au>
Following is the change from calc version 2.10.1t11 to 2.10.1t19: The following are the changes from calc version 2.10.1t11 to 2.10.1t19:
Added many more regression tests to lib/regress.cal. Some Added many more regression tests to lib/regress.cal. Some
due to <ernie@neumann.une.edu.au>. due to <ernie@neumann.une.edu.au>.
@@ -3193,7 +3651,7 @@ Following is the change from calc version 2.10.1t11 to 2.10.1t19:
Ha Lam <hl@kuhep5.phsx.ukans.edu> Ha Lam <hl@kuhep5.phsx.ukans.edu>
Following is the change from calc version 2.10.0t13 to 2.10.1t10: The following are the changes from calc version 2.10.0t13 to 2.10.1t10:
Added SB8, USB8, SB16, USB16, SB32, USB32 typedefs, determined by Added SB8, USB8, SB16, USB16, SB32, USB32 typedefs, determined by
longbits and declared in longbits.h, to deal with 8, 16 and 32 bit longbits and declared in longbits.h, to deal with 8, 16 and 32 bit
@@ -3310,7 +3768,8 @@ Following is the change from calc version 2.10.0t13 to 2.10.1t10:
digits or bits rather than places, e.g. round(.00238, 2, 32) digits or bits rather than places, e.g. round(.00238, 2, 32)
returns .0023, round(.00238, 2, 56) returns .0024. returns .0023, round(.00238, 2, 56) returns .0024.
Following is the change from calc version 2.9.3t11 to 2.10.0t12:
The following are the changes from calc version 2.9.3t11 to 2.10.0t12:
The default ${LIBDIR}/bindings CALCBINDINGS uses ^D for editing. The default ${LIBDIR}/bindings CALCBINDINGS uses ^D for editing.
The alternate CALCBINDINGS ${LIBDIR}/altbind uses ^D for EOF. The alternate CALCBINDINGS ${LIBDIR}/altbind uses ^D for EOF.
@@ -3364,7 +3823,8 @@ Following is the change from calc version 2.9.3t11 to 2.10.0t12:
to provide a more extensive test suite for some builtin numeric to provide a more extensive test suite for some builtin numeric
functions. functions.
Following is the change from calc version 2.9.3t9.2+ to 2.9.3t10:
The following are the changes from calc version 2.9.3t9.2+ to 2.9.3t10:
Added many help files for builtin functions and some symbols. Added many help files for builtin functions and some symbols.
More help files are needed, see help/todo. More help files are needed, see help/todo.
@@ -3467,7 +3927,8 @@ Following is the change from calc version 2.9.3t9.2+ to 2.9.3t10:
{ {
} }
Following is the change from calc version 2.9.3t8 to 2.9.3t9.2:
The following are the changes from calc version 2.9.3t8 to 2.9.3t9.2:
Use of the macro zisleone(z) has been clarified. The zisleone(z) macro Use of the macro zisleone(z) has been clarified. The zisleone(z) macro
tests if z <= 1. The macro zisabsleone(z) tests of z is 1, 0 or -1. tests if z <= 1. The macro zisabsleone(z) tests of z is 1, 0 or -1.
@@ -3675,10 +4136,8 @@ Following is the change from calc version 2.9.3t8 to 2.9.3t9.2:
Fixed bug where reserved keyword used as symbol name caused a core dump. Fixed bug where reserved keyword used as symbol name caused a core dump.
Following is the change from calc version 2.9.3t7 to 2.9.3t7:
WARNING: This patch is an beta test patch by chongo@toad.com The following are the changes from calc version 2.9.3t7 to 2.9.3t7:
(Landon Curt Noll).
The 'show' command by itself will issue an error message The 'show' command by itself will issue an error message
that will remind one of the possible show arguments. that will remind one of the possible show arguments.
@@ -3725,10 +4184,8 @@ Following is the change from calc version 2.9.3t7 to 2.9.3t7:
Added utoz(), ztou() to zmath.c, and utoq(), qtou() to qmath.c Added utoz(), ztou() to zmath.c, and utoq(), qtou() to qmath.c
in preparation for 2.9.3t9 mods. in preparation for 2.9.3t9 mods.
Following is the change from calc version 2.9.2 to 2.9.3t7:
WARNING: This patch is an beta test patch by chongo@toad.com The following are the changes from calc version 2.9.2 to 2.9.3t7:
(Landon Curt Noll).
Calc can now compile on OSF/1, SGI and IBM RS6000 systems. Calc can now compile on OSF/1, SGI and IBM RS6000 systems.
@@ -3849,7 +4306,8 @@ Following is the change from calc version 2.9.2 to 2.9.3t7:
Updated the help/todo list. A BUGS file was added. Volunteers are Updated the help/todo list. A BUGS file was added. Volunteers are
welcome to send in patches! welcome to send in patches!
Following is the change from calc version 2.9.1 to 2.9.1:
The following are the changes from calc version 2.9.1 to 2.9.1:
Fixed floor() for values -1 < x < 0. Fixed floor() for values -1 < x < 0.
@@ -3863,12 +4321,14 @@ Following is the change from calc version 2.9.1 to 2.9.1:
Added more regression test code. Added more regression test code.
Following is the change from calc version 2.9.0 to 2.9.0:
The following are the changes from calc version 2.9.0 to 2.9.0:
A major bug was fixed in subtracting two numbers when the first A major bug was fixed in subtracting two numbers when the first
number was zero. The problem caused wrong answers and core dumps. number was zero. The problem caused wrong answers and core dumps.
Following is a list of visible changes to calc from version 1.27.0 to 2.8.0:
The following are the changes from calc version 1.27.0 to 2.8.0:
Full prototypes have been provided for all C functions, and are used Full prototypes have been provided for all C functions, and are used
if calc is compiled with an ANSI compiler. if calc is compiled with an ANSI compiler.

926
Makefile

File diff suppressed because it is too large Load Diff

21
README
View File

@@ -4,7 +4,7 @@ See the HOWTO.INSTALL file for information on how to build and install calc.
To be sure that your version of calc is up to date, check out: To be sure that your version of calc is up to date, check out:
http://reality.sgi.com/chongo/calc/calc-download.html http://reality.sgi.com/chongo/tech/comp/calc/calc-download.html
We are interested in any/all feedback on recent versions of calc. We are interested in any/all feedback on recent versions of calc.
In particular we would like to hear about: In particular we would like to hear about:
@@ -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:
@@ -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/

View File

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

17
addop.c
View File

@@ -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,8 +165,8 @@ endfunc(void)
size += dumpop(&fp->f_opcodes[size]); size += dumpop(&fp->f_opcodes[size]);
} }
} }
if ((inputisterminal() && conf->lib_debug & 1) || if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) ||
(!inputisterminal() && conf->lib_debug & 2)) { (!inputisterminal() && conf->lib_debug & LIBDBG_FILE_FUNC)) {
printf("%s(", fp->f_name); printf("%s(", fp->f_name);
for (index = 0; index < fp->f_paramcount; index++) { for (index = 0; index < fp->f_paramcount; index++) {
if (index) if (index)
@@ -238,8 +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;
} }
@@ -461,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;
} }
@@ -534,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--;
@@ -638,5 +639,3 @@ addoplabel(long op, LABEL *label)
addop(op); addop(op);
uselabel(label); uselabel(label);
} }
/* END CODE */

View File

@@ -3,7 +3,10 @@
* *
* This file was written by: * This file was written by:
* *
* Landon Curt Noll (chongo@toad.com) chongo <was here> /\../\ * Landon Curt Noll
* http://reality.sgi.com/chongo/
*
* chongo <was here> /\../\
* *
* This code has been placed in the public domain. Please do not * This code has been placed in the public domain. Please do not
* copyright this code. * copyright this code.

View File

@@ -57,7 +57,7 @@ associndex(ASSOC *ap, BOOL create, long dim, VALUE *indices)
* so that we can first select the correct hash chain, and * so that we can first select the correct hash chain, and
* also so we can quickly compare each element for a match. * also so we can quickly compare each element for a match.
*/ */
hash = (QCKHASH)0; hash = FNV1_32_BASIS;
for (i = 0; i < dim; i++) for (i = 0; i < dim; i++)
hash = hashvalue(&indices[i], hash); hash = hashvalue(&indices[i], hash);
@@ -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 */

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
*/ */
#include <stdio.h> #include <stdio.h>
@@ -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++;
} }

35
block.c
View File

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

View File

@@ -28,11 +28,9 @@
* 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 /\../\
*/ */

260
calc.c
View File

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

55
calc.h
View File

@@ -10,9 +10,12 @@
#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
@@ -37,7 +40,6 @@
#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 */
@@ -112,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);
@@ -121,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.
*/ */
@@ -139,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 */
@@ -172,8 +195,22 @@ 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

591
calc.man
View File

@@ -1,46 +1,226 @@
.\" .\"
.\" 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
.nf
calc read many_errors.cal
.fi
.in -5n
.sp 1
will cause
.B calc
to abort on the first error, whereas:
.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 .TP
\fI\-m mode\fP .B \-C
This flag sets the permission mode of calc. Permit the execution of custom builtin functions. Without
It controls the ability for \fIcalc\fP to open files this flag, calling the custom() builtin function will
and execute programs. simply generate an error.
\fIMode\fP may be a number from 0 to 7. .sp 1
.sp Use if this flag may cause
The \fImode\fP value is interpreted in a way similar .B calc
to that of the \fRchmod(1)\fP octal mode: to execute functions that
.sp are non-standard and that are not portable. Custom builtin
.in +0.5i 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 .nf
0 do not open any file, do not execute progs 0 do not open any file, do not execute progs
1 do not open any file 1 do not open any file
@@ -51,140 +231,166 @@ to that of the \fRchmod(1)\fP octal mode:
6 do not execute any program 6 do not execute any program
7 allow everything (default mode) 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 If one wished to run
want to use \fI\-m 0\fP in an effort to make calc more secure. .B calc
.sp from a privileged user, one might want to use
\fIMode\fP bits for reading and writing apply only on an open. .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.
@@ -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! :\-)

View File

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

View File

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

162
codegen.c
View File

@@ -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);
}
} }
} }
} }
@@ -189,13 +198,16 @@ evaluate(BOOL nestflag)
funcname = (nestflag ? "**" : "*"); funcname = (nestflag ? "**" : "*");
beginfunc(funcname, nestflag); beginfunc(funcname, nestflag);
if (gettoken() == T_LEFTBRACE) {
getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL, NULL_LABEL);
} else {
if (nestflag) if (nestflag)
(void) tokenmode(TM_DEFAULT); (void) tokenmode(TM_DEFAULT);
rescantoken();
while (loop) { while (loop) {
switch (gettoken()) { switch (gettoken()) {
case T_SEMICOLON: case T_SEMICOLON:
break; break;
case T_NEWLINE: case T_NEWLINE:
case T_EOF: case T_EOF:
loop = 0; loop = 0;
@@ -207,6 +219,7 @@ evaluate(BOOL nestflag)
NULL_LABEL, NULL_LABEL); NULL_LABEL, NULL_LABEL);
} }
} }
}
addop(OP_UNDEF); addop(OP_UNDEF);
addop(OP_RETURN); addop(OP_RETURN);
checklabels(); checklabels();
@@ -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;
} }
} }
} }
@@ -321,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,
@@ -346,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");
} }
@@ -368,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()) {
@@ -383,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);
@@ -396,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:
@@ -407,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;
} }
} }
} }
@@ -441,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;
} }
} }
} }
@@ -505,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 ';'
@@ -538,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:
@@ -598,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:
@@ -690,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);
@@ -717,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();
if (gettoken() != T_SEMICOLON) {
breaklabel = &label2;
clearlabel(breaklabel);
addoplabel(OP_JUMPZ, breaklabel); addoplabel(OP_JUMPZ, breaklabel);
getstatement(contlabel, breaklabel, NULL_LABEL, NULL_LABEL); rescantoken();
getstatement(contlabel, breaklabel,
NULL_LABEL, NULL_LABEL);
addoplabel(OP_JUMP, contlabel); addoplabel(OP_JUMP, contlabel);
setlabel(breaklabel); setlabel(breaklabel);
} else {
addoplabel(OP_JUMPNZ, contlabel);
}
(void) tokenmode(oldmode); (void) tokenmode(oldmode);
return; return;
@@ -869,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();
@@ -982,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:
@@ -1004,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);
@@ -1022,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)
@@ -1047,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;
@@ -1089,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);
@@ -1175,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);
} }
@@ -1339,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);
} }
@@ -1353,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();
} }
@@ -1433,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);
} }
@@ -1892,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;

View File

@@ -138,38 +138,6 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
up1 = up2 = 0; up1 = up2 = 0;
sign = (R & 64) != 0; sign = (R & 64) != 0;
#if 0
if (qiszero(epsilon)) {
aes = qsquare(c->real);
bes = qsquare(c->imag);
v = qqadd(aes, bes);
qfree(aes);
qfree(bes);
u = qsqrt(v, epsilon, 0);
qfree(v);
if (qiszero(u)) {
qfree(u);
return clink(&_czero_);
}
aes = qqadd(u, c->real);
qfree(u);
bes = qscale(aes, -1);
qfree(aes);
u = qsqrt(bes, epsilon, R);
qfree(bes);
if (qiszero(u)) {
qfree(u);
return clink(&_czero_);
}
aes = qscale(c->imag, -1);
v = qqdiv(aes, u);
qfree(aes);
r = comalloc();
r->real = u;
r->imag = v;
return r;
}
#endif
imsign = c->imag->num.sign; imsign = c->imag->num.sign;
es = qsquare(epsilon); es = qsquare(epsilon);
aes = qqdiv(c->real, es); aes = qqdiv(c->real, es);
@@ -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 */

View File

@@ -55,6 +55,7 @@ NAMETYPE configs[] = {
{"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 */
@@ -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;
} }

View File

@@ -29,11 +29,9 @@
* 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 /\../\
*/ */
@@ -82,6 +80,7 @@
#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
/* /*
@@ -116,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 */
@@ -127,28 +126,52 @@ 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)
/* /*
* global configuration states and aliases * global configuration states and aliases
*/ */
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") */
/* /*

View File

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

View File

@@ -29,14 +29,11 @@
* Happy bit twiddling, * Happy bit twiddling,
* *
* Landon Curt Noll * Landon Curt Noll
* http://reality.sgi.com/chongo/
* *
* chongo@toad.com * chongo <was here> /\../\
* ...!{pyramid,sun,uunet}!hoptoad!chongo
*
* chongo was here /\../\
*/ */
/* /*
* Be careful what you put in this file, upper .c files include * Be careful what you put in this file, upper .c files include
* this file even when CUSTOM is not defined (ALLOW_CUSTOM is empty). * this file even when CUSTOM is not defined (ALLOW_CUSTOM is empty).

View File

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

View File

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

View File

@@ -27,11 +27,9 @@
# 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 -=-=-=-=-=-=-=-=-#
@@ -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
@@ -339,15 +346,11 @@ libcustcalc.a: ${CUSTCALC_OBJ} ${MAKE_FILE} ../Makefile
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
## ##
# #
@@ -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

View File

@@ -10,7 +10,7 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ chongo@toad.com * chongo was here /\../\ http://reality.sgi.com/chongo/
*/ */
/* /*
* argv - print information about various args * argv - print information about various args

View File

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

View File

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

View File

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

View File

@@ -16,11 +16,9 @@
* 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);

View File

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

View File

@@ -10,7 +10,7 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ chongo@toad.com * chongo was here /\../\ http://reality.sgi.com/chongo/
*/ */
/* /*
* halflen - determine the length of numeric value in HALFs * halflen - determine the length of numeric value in HALFs

View File

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

26
file.c
View File

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

989
func.c

File diff suppressed because it is too large Load Diff

View File

@@ -46,16 +46,21 @@ int
main(void) main(void)
{ {
#if defined(HAVE_NO_CONST) #if defined(HAVE_NO_CONST)
printf("#undef HAVE_CONST /* no */\n"); printf("#undef HAVE_CONST /* no */\n");
printf("#undef CONST\n"); printf("#undef CONST\n");
printf("#define CONST /* no */\n"); printf("#define CONST /* no */\n");
#else /* HAVE_NO_CONST */ #else /* HAVE_NO_CONST */
const char * const str = "const"; const char * const str = "const";
printf("#define HAVE_CONST /* yes */\n"); printf("#define HAVE_CONST /* yes */\n");
printf("#undef CONST\n"); printf("#undef CONST\n");
printf("#define CONST %s /* yes */\n", str); printf("#define CONST %s /* yes */\n", str);
#endif /* HAVE_NO_CONST */ #endif /* HAVE_NO_CONST */
/* exit(0); */ /* exit(0); */
return 0; return 0;
} }

60
have_getpgid.c Normal file
View File

@@ -0,0 +1,60 @@
/*
* have_getpgid - Determine if we getpgid()
*
* usage:
* have_getpgid
*
* Not all systems have the getpgid() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETPGID
* defined ==> use getpgid()
* undefined ==> do not or cannot call getpgid()
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{
#if defined(HAVE_NO_GETPGID)
printf("#undef HAVE_GETPGID /* no */\n");
#else /* HAVE_NO_GETPGID */
(void) getpgid((pid_t)0);
printf("#define HAVE_GETPGID /* yes */\n");
#endif /* HAVE_NO_GETPGID */
/* exit(0); */
return 0;
}

59
have_getprid.c Normal file
View File

@@ -0,0 +1,59 @@
/*
* have_getprid - Determine if we getprid()
*
* usage:
* have_getprid
*
* Not all systems have the getprid() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETPRID
* defined ==> use getprid()
* undefined ==> do not or cannot call getprid()
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{
#if defined(HAVE_NO_GETPRID)
printf("#undef HAVE_GETPRID /* no */\n");
#else /* HAVE_NO_GETPRID */
(void) getprid();
printf("#define HAVE_GETPRID /* yes */\n");
#endif /* HAVE_NO_GETPRID */
/* exit(0); */
return 0;
}

59
have_getsid.c Normal file
View File

@@ -0,0 +1,59 @@
/*
* have_getsid - Determine if we getsid()
*
* usage:
* have_getsid
*
* Not all systems have the getsid() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETSID
* defined ==> use getsid()
* undefined ==> do not call or cannot call getsid()
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <sys/types.h>
int
main(void)
{
#if defined(HAVE_NO_GETSID)
printf("#undef HAVE_GETSID /* no */\n");
#else /* HAVE_NO_GETSID */
(void) getsid((pid_t)0);
printf("#define HAVE_GETSID /* yes */\n");
#endif /* HAVE_NO_GETSID */
/* exit(0); */
return 0;
}

74
have_gettime.c Normal file
View File

@@ -0,0 +1,74 @@
/*
* have_gettime - Determine if we clock_gettime()
*
* usage:
* have_gettime
*
* Not all systems have the clock_gettime() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETTIME
* defined ==> use clock_gettime() for either CLOCK_SGI_CYCLE
* and/or CLOCK_REALTIME
* undefined ==> clock_gettime() is not available for both
* CLOCK_SGI_CYCLE and CLOCK_REALTIME
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <time.h>
int
main(void)
{
#if defined(HAVE_NO_GETTIME)
printf("#undef HAVE_GETTIME /* no */\n");
#else /* HAVE_NO_GETTIME */
# if defined(CLOCK_SGI_CYCLE)
struct timespec sgi_cycle; /* SGI hardware clock */
(void) clock_gettime(CLOCK_SGI_CYCLE, &sgi_cycle);
printf("#define HAVE_GETTIME /* yes - w/CLOCK_SGI_CYCLE */\n");
# elif defined(CLOCK_REALTIME)
struct timespec realtime; /* POSIX realtime clock */
(void) clock_gettime(CLOCK_REALTIME, &realtime);
printf("#define HAVE_GETTIME /* yes - CLOCK_REALTIME only */\n");
# else
printf("#undef HAVE_GETTIME /* no - no SGI_CYCLE and no REALTIME */\n");
# endif /* CLOCK_REALTIME */
#endif /* HAVE_NO_GETTIME */
/* exit(0); */
return 0;
}

View File

@@ -2,7 +2,7 @@
* have_memmv - Determine if we memmove() * have_memmv - Determine if we memmove()
* *
* usage: * usage:
* have_newstr * have_memmv
* *
* Not all systems with memcpy() have memmove() functions, so this may not * Not all systems with memcpy() have memmove() functions, so this may not
* compile on your system. * compile on your system.
@@ -48,12 +48,17 @@ int
main(void) main(void)
{ {
#if defined(HAVE_NO_MEMMOVE) #if defined(HAVE_NO_MEMMOVE)
printf("#undef HAVE_MEMMOVE /* no */\n"); printf("#undef HAVE_MEMMOVE /* no */\n");
#else /* HAVE_NO_MEMMOVE */ #else /* HAVE_NO_MEMMOVE */
(void) memmove(dest, src, MOVELEN); (void) memmove(dest, src, MOVELEN);
printf("#define HAVE_MEMMOVE /* yes */\n"); printf("#define HAVE_MEMMOVE /* yes */\n");
#endif /* HAVE_NO_MEMMOVE */ #endif /* HAVE_NO_MEMMOVE */
/* exit(0); */ /* exit(0); */
return 0; return 0;
} }

View File

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

62
have_rusage.c Normal file
View 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;
}

62
have_strdup.c Normal file
View 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;
}

View File

@@ -51,15 +51,20 @@ int
main(void) main(void)
{ {
#if defined(HAVE_NO_UID_T) #if defined(HAVE_NO_UID_T)
printf("#undef HAVE_UID_T /* no */\n"); printf("#undef HAVE_UID_T /* no */\n");
#else /* HAVE_NO_UID_T */ #else /* HAVE_NO_UID_T */
uid_t curds; uid_t curds;
extern uid_t geteuid(); extern uid_t geteuid();
curds = geteuid(); curds = geteuid();
printf("#define HAVE_UID_T /* yes */\n"); printf("#define HAVE_UID_T /* yes */\n");
#endif /* HAVE_NO_UID_T */ #endif /* HAVE_NO_UID_T */
/* exit(0); */ /* exit(0); */
return 0; return 0;
} }

65
have_ustat.c Normal file
View File

@@ -0,0 +1,65 @@
/*
* have_ustat - Determine if we ustat()
*
* usage:
* have_ustat
*
* Not all systems have the ustat() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_USTAT
* defined ==> use ustat()
* undefined ==> do not call or cannot call ustat()
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <ustat.h>
int
main(void)
{
#if defined(HAVE_NO_USTAT)
printf("#undef HAVE_USTAT /* no */\n");
#else /* HAVE_NO_USTAT */
struct stat stat_dot; /* stat of "." */
struct ustat ustat_dot; /* usage stat of "." */
(void) stat(".", &stat_dot);
(void) ustat(stat_dot.st_dev, &ustat_dot);
printf("#define HAVE_USTAT /* yes */\n");
#endif /* HAVE_NO_USTAT */
/* exit(0); */
return 0;
}

View File

@@ -57,11 +57,13 @@ try_this(char *fmt, ...)
va_list ap; va_list ap;
va_start(ap); va_start(ap);
#if !defined(DONT_HAVE_VSPRINTF) #if !defined(DONT_HAVE_VSPRINTF)
vsprintf(buf, fmt, ap); vsprintf(buf, fmt, ap);
#else #else
sprintf(buf, fmt, ap); sprintf(buf, fmt, ap);
#endif #endif
va_end(ap); va_end(ap);
} }

3
help.c
View File

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

View File

@@ -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.
@@ -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 ''; \
@@ -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
@@ -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; \

View File

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

35
help/calclevel Normal file
View 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

View File

@@ -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.
@@ -30,13 +28,22 @@ Command sequence
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
@@ -52,14 +59,11 @@ Command sequence
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,7 +73,10 @@ 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.
@@ -81,19 +88,221 @@ Command sequence
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

View File

@@ -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
@@ -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,9 +105,12 @@ Configuration parameters
the decimal point to be printed in real or exponential mode in the decimal point to be printed in real or exponential mode in
normal unformatted printing (print, strprint, fprint) or in normal unformatted printing (print, strprint, fprint) or in
formatted printing (printf, strprintf, fprintf) when precision is not formatted printing (printf, strprintf, fprintf) when precision is not
specified. The initial value is 20. This parameter does not change specified. The initial value for oldstd is 20, for newstd 10.
the stored value of a number. Where rounding is necessary, the type The parameter may be changed to the value d by either
of rounding to be used is controlled by "outround". config("display", d) or by display (d). This parameter does not change
the stored value of a number. Where rounding is necessary to
display up to d decimal places, the type of rounding to be used is
controlled by config("outround").
The "epsilon" parameter specifies the default accuracy for the The "epsilon" parameter specifies the default accuracy for the
calculation of functions for which exact values are not possible or calculation of functions for which exact values are not possible or
@@ -118,9 +123,10 @@ Configuration parameters
absolute value of the remainder usually does not exceed epsilon/2. absolute value of the remainder usually does not exceed epsilon/2.
Functions which require an epsilon value accept an Functions which require an epsilon value accept an
optional argument which overrides this default epsilon value for optional argument which overrides this default epsilon value for
that single call. (The value v can be assigned to the "epsilon" that single call. The value v can be assigned to the "epsilon"
parameter by epsilon(v) as well as by config("epsilon", v), and the parameter by either config("epsilon", v) or epsilon(v); each of
current value obtained by epsilon() as well as by config("epsilon").) these functions return the current epsilon value; config("epsilon")
or epsilon() returns but does not change the epsilon value.
For the transcendental functions and the functions sqrt() and For the transcendental functions and the functions sqrt() and
appr(), the calculated value is always a multiple of epsilon. appr(), the calculated value is always a multiple of epsilon.
@@ -311,67 +317,87 @@ 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:

View File

@@ -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
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
Thanks for considering submitting code to calc. Calc is a collective Thanks for considering submitting code to calc. Calc is a collective
work by a number of people. It would not be what it is today without work by a number of people. It would not be what it is today without
your efforts and submissions! your efforts and submissions!
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> /\../\

View File

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

View File

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

View File

@@ -3,7 +3,5 @@ s/NUMBER[ ]*\*/int /
s/NUMBER/int/ s/NUMBER/int/
s/STRINGHEAD/int/ s/STRINGHEAD/int/
s/\(".*",.*,.*\),.*,.*,.*,.*,/\1, 0, 0, 0, 0,/ s/\(".*",.*,.*\),.*,.*,.*,.*,/\1, 0, 0, 0, 0,/
/sed me out/d
s/showbuiltins/main/
s/[ ][ ]*$// s/[ ][ ]*$//
p p

View File

@@ -1,5 +1,5 @@
NAME NAME
hash - hash value hash - FNV-1 hash value
SYNOPSIS SYNOPSIS
hash(x_1 [, x_2, x_3, ...]) hash(x_1 [, x_2, x_3, ...])
@@ -12,10 +12,32 @@ TYPES
DESCRIPTION DESCRIPTION
Returns a hash value for one or more values of arbitrary types. Returns a hash value for one or more values of arbitrary types.
The basis of this hash algorithm was taken from an idea sent
as reviewer comments to the IEEE POSIX P1003.2 committee by:
Phong Vo (http://www.research.att.com/info/kpv/)
Glenn Fowler (http://www.research.att.com/~gsf/)
In a subsequent ballot round:
Landon Curt Noll (http://reality.sgi.com/chongo/)
improved on their algorithm. Some people tried this hash
and found that it worked rather well. In an EMail message
to Landon, they named it ``Fowler/Noll/Vo'' or the FNV hash.
FNV hashes are architected to be fast while maintaining a low
collision rate. The FNV speed allows one to quickly hash lots
of data while maintaining a reasonable collision rate. See:
http://reality.sgi.com/chongo/tech/comp/fnv/
for more details as well as other forms of the FNV hash.
EXAMPLE EXAMPLE
> a = isqrt(2e1000); s = "xyz"; > a = isqrt(2e1000); s = "xyz";
> hash(a,s) > hash(a,s)
870000771 2378490456
LIMITS LIMITS
The number of arguments is not to exceed 100. The number of arguments is not to exceed 100.
@@ -24,3 +46,4 @@ LIBRARY
none none
SEE ALSO SEE ALSO
sha, sha1, md5

View File

@@ -42,7 +42,8 @@ following topics:
changes recent changes to calc changes recent changes to calc
contrib how to contribute scripts, code or custom functions contrib how to contribute scripts, code or custom functions
credit who wrote calc and who helped credit who wrote calc and who helped
todo needed enhancements and wish list todo list of priority action items for calc
wishlist wish list of future enhancements of calc
full all of the above (in the above order) full all of the above (in the above order)

36
help/inputlevel Normal file
View File

@@ -0,0 +1,36 @@
NAME
inputlevel - current input level
SYNOPSIS
inputlevel()
TYPES
return nonnegative integer
DESCRIPTION
This function returns the input level at which it is called.
When calc starts, it is at level zero. The level is increased
by 1 each time execution starts of a read file command or a call to
eval(S) for some expression S which evaluates to a string. It
decreases by 1 when a file being read reaches EOF or a string
being eval-ed reaches '\0', or earlier if a quit statement is
encountered at top calculation-level in the flle or string. It
decreases to zero if an abort statement is encountered at any
function-level in the file or string. If a quit or abort
statement is encountered at top calculation-level at top input-level,
calc is exited.
Zero input level is also called top input level; greater values
of inputlevel() indicate reading at greater depths.
EXAMPLE
n/a
LIMITS
none
LIBRARY
none
SEE ALSO
read, eval, quit, abort, calclevel

View File

@@ -71,6 +71,10 @@
help stdlib help stdlib
To learn how to invoke the calc command and about calc -flags, try:
help usage
A full and extensive overview of calc may be obtained by: A full and extensive overview of calc may be obtained by:
help full help full
@@ -160,5 +164,3 @@
These can contain both functions to be defined, and expressions These can contain both functions to be defined, and expressions
to be calculated. Global variables which are numbers can be to be calculated. Global variables which are numbers can be
saved to a file by using the 'write filename' command. saved to a file by using the 'write filename' command.
XXX - update this file and add in new major features

View File

@@ -19,9 +19,9 @@ DESCRIPTION
is almost certainly non-chaotic. This function is likely not is almost certainly non-chaotic. This function is likely not
suitable for applications (such as cryptographic applications) suitable for applications (such as cryptographic applications)
where the unpredictability of seeds is critical. For such critical where the unpredictability of seeds is critical. For such critical
applications, lavarand should be used. Seed: applications, lavarand should be used. See the URL:
http://lavarand.sgi.com http://lavarand.sgi.com/index.html
for information about seeding a pseudo-random number generator for information about seeding a pseudo-random number generator
(such as rand() or random()) with the cryptographic hash of the (such as rand() or random()) with the cryptographic hash of the

View File

@@ -222,8 +222,7 @@ DESCRIPTION
The pre-defined Blum moduli and quadratic residues were selected The pre-defined Blum moduli and quadratic residues were selected
by lavarand, a hardware random number generator. See the URL: by lavarand, a hardware random number generator. See the URL:
http://lavarand.sgi.com http://lavarand.sgi.com/index.html
XXX - This URL is not available on 17Feb97 ... but will be soon.
for an explanation of how the lavarand random number generator works. for an explanation of how the lavarand random number generator works.
For more information, see the comments at the top of the calc For more information, see the comments at the top of the calc

View File

@@ -10,28 +10,38 @@ Statements
expressions are optional and may be omitted (as in RETURN). expressions are optional and may be omitted (as in RETURN).
NOTE: Calc commands are in lower case. UPPER case is used below C-like statements
for emphasis only, and should be considered in lower case. -----------------
{ statement }
{ statement; ... statement }
IF (expr) statement if (expr) statement
IF (expr) statement ELSE statement if (expr) statement ELSE statement
FOR (optionalexpr ; optionalexpr ; optionalexpr) statement for (optionalexpr ; optionalexpr ; optionalexpr) statement
WHILE (expr) statement while (expr) statement
DO statement WHILE (expr) do statement while (expr)
CONTINUE continue
BREAK break
GOTO label goto label
These all work like in normal C. These all work like in normal C.
RETURN optionalexpr See 'help expression' for details on expressions.
See 'help builtin' for details on calc builtin functions.
return
------
return optionalexpr
return ( optionalexpr )
This returns a value from a function. Functions always This returns a value from a function. Functions always
have a return value, even if this statement is not used. have a return value, even if this statement is not used.
If no return statement is executed, or if no expression If no return statement is executed, or if no expression
is specified in the return statement, then the return is specified in the return statement, then the return
value from the function is the null type. value from the function is the null type.
SWITCH (expr) { caseclauses }
switch
------
switch (expr) { caseclauses }
Switch statements work similarly to C, except for the Switch statements work similarly to C, except for the
following. A switch can be done on any type of value, following. A switch can be done on any type of value,
and the case statements can be of any type of values. and the case statements can be of any type of values.
@@ -42,17 +52,12 @@ Statements
is the exception, and only matches once all other cases is the exception, and only matches once all other cases
have been tested. have been tested.
{ statements }
This is a normal list of statements, each one ended by
a semicolon. Unlike the C language, no declarations are
permitted within an inner-level compound statement.
Declarations are only permitted at the beginning of a
function definition, or at the beginning of an expression
sequence.
MAT variable [dimension] [dimension] ... matrix
MAT variable [dimension, dimension, ...] ------
MAT variable [] = { value, ... } mat variable [dimension] [dimension] ...
mat variable [dimension, dimension, ...]
mat variable [] = { value, ... }
This creates a matrix variable with the specified dimensions. This creates a matrix variable with the specified dimensions.
Matrices can have from 1 to 4 dimensions. When specifying Matrices can have from 1 to 4 dimensions. When specifying
multiple dimensions, you can use either the standard C syntax, multiple dimensions, you can use either the standard C syntax,
@@ -119,8 +124,11 @@ Statements
local mat temp[5]; local mat temp[5];
static mat strtable[] = {"hi", "there", "folks"); static mat strtable[] = {"hi", "there", "folks");
OBJ type { elementnames } optionalvariables
OBJ type variable object
------
obj type { elementnames } optionalvariables
obj type variable
These create a new object type, or create one or more These create a new object type, or create one or more
variables of the specified type. For this calculator, variables of the specified type. For this calculator,
an object is just a structure which is implicitly acted an object is just a structure which is implicitly acted
@@ -183,33 +191,12 @@ Statements
static obj point temp2 = {4, 3}; static obj point temp2 = {4, 3};
global obj point p1, p2, p3; global obj point p1, p2, p3;
EXIT string
QUIT string
This command is used in two cases. At the top command
line level, quit will exit from the calculator. This
is the normal way to leave the calculator. In any other
use, quit will abort 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.
Quit is useful when a routine detects invalid arguments, print expressions
in order to stop a calculation cleanly. For example, -----------------
for a square root routine, an error can be given if the print expr
supplied parameter was a negative number, as in: print expr, ... expr
print expr: ... expr
define mysqrt(n)
{
if (n < 0)
quit "Negative argument";
...
}
Exit is an alias for quit.
PRINT exprs
For interactive expression evaluation, the values of all For interactive expression evaluation, the values of all
typed-in expressions are automatically displayed to the typed-in expressions are automatically displayed to the
user. However, within a function or loop, the printing of user. However, within a function or loop, the printing of
@@ -247,25 +234,9 @@ Statements
prints the name of the file that was opened. prints the name of the file that was opened.
SHOW item
This command displays some information.
builtin built in functions
global global variables
function user-defined functions
objfunc possible object functions
config config parameters and values
objtype defined objects
Only the first 4 characters of item are examined, so:
show globals
show global
show glob
do the same thing.
Also see the help topic: Also see the help topic:
command top level commands command top level commands
expression calc expression syntax
builtin calc builtin functions
usage how to invoke the calc command and calc -options

259
help/todo
View File

@@ -1,183 +1,109 @@
Needed enhancements Calc Todo Items:
Send calc comments, suggestions, bug fixes, enhancements and The following items should be addressed sometime in the short to
interesting calc scripts that you would like you see included in medium term future, if not before the next release.
future distributions to:
dbell@auug.org.au Code contributions are welcome. Send patches to:
chongo@toad.com
The following items are in the calc wish list. Programs like this calc-tester at postofc dot corp dot sgi dot com
can be extended and improved forever.
* In general use faster algorithms for large numbers when they [[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
become known. In particular, look at better algorithms for
very large numbers -- multiply, square and mod in particular.
* Implement an autoload feature. Associate a calc library filename See also the 'wishlist' help files for the calc enhancement wish list.
with a function or global variable. On the first reference of
such item, perform an automatic load of that file.
* Add error handling statements, so that QUITs, errors from the Calc bug reports, however, should send to:
'eval' function, division by zeroes, and so on can be caught.
This should be done using syntax similar to:
ONERROR statement DO statement; calc-tester at postofc dot corp dot sgi dot com
Something like signal isn't versatile enough. [[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
* Add a debugging capability so that functions can be single stepped, see the BUGS file or try the calc command:
breakpoints inserted, variables displayed, and so on.
* Figure out how to write all variables out to a file, including help bugs
deeply nested arrays, lists, and objects.
Add the ability to read and write a value in some binary form. =-=
Clearly this is easy for non-neg integers. The question of
everything else is worth pondering.
* Eliminate the need for the define keyword by doing smarter parsing. Very High priority items:
* Allow results of a command (or all commands) to be re-directed to a * Write the help file for the display() builtin function.
file or piped into a command.
* Add some kind of #include and #define facility. Perhaps use * Write the help file for the stoponerror() builtin function.
the C pre-processor itself?
* Support a more general input and output base mode other than * Update the errmax about the meaning of errmax(-1).
just dec, hex or octal.
* Implement a form of symbolic algebra. Work on this has already * Review and if needed, correct/update the help topics:
begun. This will use backquotes to define expressions, and new
functions will be able to act on expressions. For example:
x = `hello * strlen(mom)`; topic description
x = sub(x, `hello`, `hello + 1`); ----- -----------
x = sub(x, `hello`, 10, `mom`, "curds"); intro introduction to calc
eval(x); overview overview of calc
assoc using associations
command top level commands
config configuration parameters
define how to define functions
environment how environment variables effect calc
errorcodes calc generated error codes
expression expression sequences
file using files
history command history
interrupt how interrupts are handled
list using lists
mat using matrices
obj user defined data types
operator math, relational, logic and variable access ...
statement flow control and declaration statements
types builtin data types
unexpected unexpected syntax/usage surprises for C ...
variable variables and variable declarations
libcalc using the arbitrary precision routines in ...
bugs known bugs and mis-features
wishlist wish list of future enhancements of calc
prints 55. * Fix any 'Known bugs' as noted in the BUGS file or as
displayed by 'calc help bugs'.
* Place the results of previous commands into a parallel history list. * Copyleft calc and place it under a LGPL.
Add a binding that returns the saved result of the command so
that one does not need to re-execute a previous command simply
to obtain its value.
If you have a command that takes a very long time to execute, =-=
it would be nice if you could get at its result without having
to spend the time to reexecute it.
* Add a binding to delete a value from the history list. High priority items:
One may need to remove a large value from the history list if * Verify, complete or fix the 'SEE ALSO' help file sections.
it is very large. Deleting the value would replace the history
entry with a null value.
* Add a binding to delete a command from the history list. * Verify, complete or fix the 'LIBRARY' help file sections.
Since you can delete values, you might as well be able to * Verify, complete or fix the 'LIMITS' help file sections.
delete commands.
* All one to alter the size of the history list thru config(). * Verify, complete or fix the 'SYNOPSIS' and 'TYPES' help file sections.
In some cases, 256 values is too small, in others it is too large. * Where reasonable, be sure that regress.cal tests builtin functions.
* Add a builtin that returns a value from the history list. * Perform a code coverage analysis of the 'make check' action
As an example: and improve the coverage (within reason) of the regress.cal suite.
histval(-10) * Create a Linux rpm (Red Hat Package Manager) package for calc.
returns the 10th value on the history value list, if such * Address, if possible and reasonable, any Calc Mis-features
a value is in the history list (null otherwise). And: as noted in the BUGS file or as displayed by 'calc help bugs'.
histval(23) * The shell script that is currently constructed to display a help
file (in help.c) is a gross hack. That code should be replaced
with code that looks for the help file in the pre-defined help
directories. When the specific help file is found and opened,
then a $PAGER should be forked and execed after doing things such
as closing open file descriptors that the $PAGER does not need.
return the value of the 23rd command given to calc, if * The arg passdown to the lower level Makfiles should be reviewed
such a value is in the history list (null otherwise). to determine which items really need to be passed down. The lower
level Makefiles should default to the shipped values.
It would be very helpful to use the history values in * Consider using configure to build the calc Makefile.
subsequent equations.
* Add a builtin that returns command as a string from the =-=
history list. As an example:
history(-10) Medium priority items:
returns a string containing the 10th command on the * Complete the use of CONST where appropriate:
history list, if a such a value is in the history list
(empty string otherwise). And:
history(23)
return the string containing the 23rd command given to calc, if
such a value is in the history list (empty string otherwise).
One could use the eval() function to re-evaluate the command.
* Allow one to optionally restore the command number to calc
prompts. When going back in the history list, indicate the
command number that is being examined.
The command number was a useful item. When one is scanning the
history list, knowing where you are is hard without it. It can
get confusing when the history list wraps or when you use
search bindings. Command numbers would be useful in
conjunction with positive args for the history() and histval()
functions as suggested above.
* Add a builtin that returns the current command number.
For example:
cmdnum()
returns the current command number.
This would allow one to tag a value in the history list. One
could save the result of cmdnum() in a variable and later use
it as an arg to the histval() or history() functions.
* Add a factoring builtin functions. Provide functions that perform
multiple polynomial quadratic sieves, elliptic curve, difference
of two squares, N-1 factoring as so on. Provide a easy general
factoring builtin (say factor(foo)) that would attempt to apply
whatever process was needed based on the value.
Factoring builtins would return a matrix of factors.
It would be handy to configure, via config(), the maximum time
that one should try to factor a number. By default the time
should be infinite. If one set the time limit to a finite
value and the time limit was exceeded, the factoring builtin
would return whatever if had found thus far, even if no new
factors had been found.
Another factoring configuration interface, via config(), that
is needed would be to direct the factoring builtins to return
as soon as a factor was found.
* Allow one to config calc break up long output lines.
The command: calc '2^100000' will produce one very long
line. Many times this is reasonable. Long output lines
are a problem for some utilities. It would be nice if one
could configure, via config(), calc to fold long lines.
By default, calc should continue to produce long lines.
One option to config should be to specify the length to
fold output. Another option should be to append a trailing
\ on folded lines (as some symbolic packages use).
* Allow one to use the READ and WRITE commands inside a function.
* Remove or increase limits on factor(), lfactor(), isprime(),
nextprime(), and prevprime(). Currently these functions cannot
search for factors > 2^32.
* Add read -once -try "filename" which would do nothing
if "filename" was not a readable file.
* Complete the use of CONST where appropirate:
CONST is beginning to be used with read-only tables and some CONST is beginning to be used with read-only tables and some
function arguments. This allows certain compilers to better function arguments. This allows certain compilers to better
@@ -196,48 +122,13 @@ Needed enhancements
at by 'fizbin' and the HALF array pointer at by 'data' should be at by 'fizbin' and the HALF array pointer at by 'data' should be
treated as read-only. treated as read-only.
* Blocks should have the following features:
+ read/write to/from files (ala fread/fwrite)
+ misc memory functions (ala memcpy, memcmp, memset,
memchr, etc.)
+ scatter and gather functions (to send every n-th octet
to another block and to copy from n blocks, the 1st
then 2nd then 3rd ... octets)
* Printing of blocks should be under the control of the
config() interface. This should allow one to select
from any of the following formats:
+ as one long string
+ as a series of lines (< 80 chars wide)
+ in od command style (offset: value value value ...)
+ in hex dump style (offset: val val val val ... 3hf.Uas.c)
* In addition one should be able to control the following
aspects of printing blocks via the config() interface:
+ base (hex, octal, char, base 2)
+ amount of data (the first n octets or the entire block)
+ skipping printing of duplicate print lines (ala od)
+ have the ability to print the block as raw data
* It is overkill to have nearly everything wind up in libcalc.a. * It is overkill to have nearly everything wind up in libcalc.a.
One should make available a the fundimental math operations One should make available a the fundamental math operations
on ZVALUE, NUMBER and perhaps COMPLEX (without all of the on ZVALUE, NUMBER and perhaps COMPLEX (without all of the
other stuff) in a separate library. other stuff) in a separate library.
* improve the coverage in the 'SEE ALSO' help file lists * Clean the source code and document it better.
* where reasonable, be sure that regress.cal tests builtin functions * Add a builtin function to access the 64 bit FNV hash which
is currently being used internally in seed.c.
* clean the source code and document it better

View File

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

189
help/wishlist Normal file
View File

@@ -0,0 +1,189 @@
Calc Enhancement Wish List:
Send calc comments, suggestions, bug fixes, enhancements and
interesting calc scripts that you would like you see included in
future distributions to:
calc-tester at postofc dot corp dot sgi dot com
[[ Replace 'at' with @, 'dot' is with . and remove the spaces ]]
The following items are in the calc wish list. Programs like this
can be extended and improved forever.
Calc bug repoers, 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 'todo' help file for higher priority todo items.
=-=
* In general use faster algorithms for large numbers when they
become known. In particular, look at better algorithms for
very large numbers -- multiply, square and mod in particular.
* Implement an autoload feature. Associate a calc library filename
with a function or global variable. On the first reference of
such item, perform an automatic load of that file.
* Add error handling statements, so that QUITs, errors from the
'eval' function, division by zeroes, and so on can be caught.
This should be done using syntax similar to:
ONERROR statement DO statement;
Something like signal isn't versatile enough.
* Add a debugging capability so that functions can be single stepped,
breakpoints inserted, variables displayed, and so on.
* Figure out how to write all variables out to a file, including
deeply nested arrays, lists, and objects.
Add the ability to read and write a value in some binary form.
Clearly this is easy for non-neg integers. The question of
everything else is worth pondering.
* Eliminate the need for the define keyword by doing smarter parsing.
* Allow results of a command (or all commands) to be re-directed to a
file or piped into a command.
* Add some kind of #include and #define facility. Perhaps use
the C pre-processor itself?
* Support a more general input and output base mode other than
just dec, hex or octal.
* Implement a form of symbolic algebra. Work on this has already
begun. This will use backquotes to define expressions, and new
functions will be able to act on expressions. For example:
x = `hello * strlen(mom)`;
x = sub(x, `hello`, `hello + 1`);
x = sub(x, `hello`, 10, `mom`, "curds");
eval(x);
prints 55.
* Place the results of previous commands into a parallel history list.
Add a binding that returns the saved result of the command so
that one does not need to re-execute a previous command simply
to obtain its value.
If you have a command that takes a very long time to execute,
it would be nice if you could get at its result without having
to spend the time to reexecute it.
* Add a binding to delete a value from the history list.
One may need to remove a large value from the history list if
it is very large. Deleting the value would replace the history
entry with a null value.
* Add a binding to delete a command from the history list.
Since you can delete values, you might as well be able to
delete commands.
* All one to alter the size of the history list thru config().
In some cases, 256 values is too small, in others it is too large.
* Add a builtin that returns a value from the history list.
As an example:
histval(-10)
returns the 10th value on the history value list, if such
a value is in the history list (null otherwise). And:
histval(23)
return the value of the 23rd command given to calc, if
such a value is in the history list (null otherwise).
It would be very helpful to use the history values in
subsequent equations.
* Add a builtin that returns command as a string from the
history list. As an example:
history(-10)
returns a string containing the 10th command on the
history list, if a such a value is in the history list
(empty string otherwise). And:
history(23)
return the string containing the 23rd command given to calc, if
such a value is in the history list (empty string otherwise).
One could use the eval() function to re-evaluate the command.
* Allow one to optionally restore the command number to calc
prompts. When going back in the history list, indicate the
command number that is being examined.
The command number was a useful item. When one is scanning the
history list, knowing where you are is hard without it. It can
get confusing when the history list wraps or when you use
search bindings. Command numbers would be useful in
conjunction with positive args for the history() and histval()
functions as suggested above.
* Add a builtin that returns the current command number.
For example:
cmdnum()
returns the current command number.
This would allow one to tag a value in the history list. One
could save the result of cmdnum() in a variable and later use
it as an arg to the histval() or history() functions.
* Add a factoring builtin functions. Provide functions that perform
multiple polynomial quadratic sieves, elliptic curve, difference
of two squares, N-1 factoring as so on. Provide a easy general
factoring builtin (say factor(foo)) that would attempt to apply
whatever process was needed based on the value.
Factoring builtins would return a matrix of factors.
It would be handy to configure, via config(), the maximum time
that one should try to factor a number. By default the time
should be infinite. If one set the time limit to a finite
value and the time limit was exceeded, the factoring builtin
would return whatever if had found thus far, even if no new
factors had been found.
Another factoring configuration interface, via config(), that
is needed would be to direct the factoring builtins to return
as soon as a factor was found.
* Allow one to config calc break up long output lines.
The command: calc '2^100000' will produce one very long
line. Many times this is reasonable. Long output lines
are a problem for some utilities. It would be nice if one
could configure, via config(), calc to fold long lines.
By default, calc should continue to produce long lines.
One option to config should be to specify the length to
fold output. Another option should be to append a trailing
\ on folded lines (as some symbolic packages use).
* Allow one to use the READ and WRITE commands inside a function.
* Remove or increase limits on factor(), lfactor(), isprime(),
nextprime(), and prevprime(). Currently these functions cannot
search for factors > 2^32.
* Add read -once -try "filename" which would do nothing
if "filename" was not a readable file.

203
hist.c
View File

@@ -5,6 +5,8 @@
* *
* Adapted from code written by Stephen Rothwell. * Adapted from code written by Stephen Rothwell.
* *
* GNU readline support added by Martin Buck <mbuck@debian.org>
*
* Interactive readline module. This is called to read lines of input, * Interactive readline module. This is called to read lines of input,
* while using emacs-like editing commands within a command stack. * while using emacs-like editing commands within a command stack.
* The key bindings for the editing commands are (slightly) configurable. * The key bindings for the editing commands are (slightly) configurable.
@@ -29,6 +31,11 @@
#include "terminal.h" #include "terminal.h"
#include "have_string.h" #include "have_string.h"
#include "have_strdup.h"
#if !defined(HAVE_STRDUP)
# define strdup(x) calc_strdup((CONST char *)(x))
#endif /* HAVE_STRDUP */
#if defined(USE_TERMIOS) #if defined(USE_TERMIOS)
# include <termios.h> # include <termios.h>
@@ -48,6 +55,8 @@
# include <string.h> # include <string.h>
#endif #endif
#if !defined(USE_READLINE)
extern FILE *curstream(void); extern FILE *curstream(void);
#define STDIN 0 #define STDIN 0
@@ -242,7 +251,7 @@ int
hist_getline(char *prompt, char *buf, int len) hist_getline(char *prompt, char *buf, int len)
{ {
if (!inited) if (!inited)
(void) hist_init((char *) NULL); (void) hist_init(calcbindings);
HS.prompt = prompt; HS.prompt = prompt;
HS.bufsize = len - 2; HS.bufsize = len - 2;
@@ -283,11 +292,16 @@ hist_init(char *filename)
{ {
TTYSTRUCT newtty; TTYSTRUCT newtty;
if (inited) if (inited) {
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: inited already set in hist_init\n");
return HIST_INITED; return HIST_INITED;
}
inited = 1; inited = 1;
canedit = 0; canedit = 0;
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Set inited, cleared canedit in hist_init\n");
/* /*
* open the bindings file * open the bindings file
@@ -309,20 +323,31 @@ hist_init(char *filename)
closeinput(); closeinput();
#ifdef USE_SGTTY #ifdef USE_SGTTY
if (ioctl(STDIN, TIOCGETP, &oldtty) < 0) if (ioctl(STDIN, TIOCGETP, &oldtty) < 0) {
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Cannot TIOCGETP stdin in hist_init\n");
return HIST_NOTTY; return HIST_NOTTY;
}
newtty = oldtty; newtty = oldtty;
newtty.sg_flags &= ~ECHO; newtty.sg_flags &= ~ECHO;
newtty.sg_flags |= CBREAK; newtty.sg_flags |= CBREAK;
if (ioctl(STDIN, TIOCSETP, &newtty) < 0) if (ioctl(STDIN, TIOCSETP, &newtty) < 0) {
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Cannot TIOCSETP stdin in hist_init\n");
return HIST_NOTTY; return HIST_NOTTY;
}
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: stty -ECHO +CBREAK in hist_init\n");
#endif #endif
#ifdef USE_TERMIO #ifdef USE_TERMIO
if (ioctl(STDIN, TCGETA, &oldtty) < 0) if (ioctl(STDIN, TCGETA, &oldtty) < 0) {
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Cannot TCGETA stdin in hist_init\n");
return HIST_NOTTY; return HIST_NOTTY;
}
newtty = oldtty; newtty = oldtty;
newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK); newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK);
@@ -331,13 +356,22 @@ hist_init(char *filename)
newtty.c_cc[VMIN] = 1; newtty.c_cc[VMIN] = 1;
newtty.c_cc[VTIME] = 0; newtty.c_cc[VTIME] = 0;
if (ioctl(STDIN, TCSETAW, &newtty) < 0) if (ioctl(STDIN, TCSETAW, &newtty) < 0) {
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Cannot TCSETAW stdin in hist_init\n");
return HIST_NOTTY; return HIST_NOTTY;
}
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: stty -ECHO -ECHOE -ECHOK -ICANON +ISTRIP "
"VMIN=1 VTIME=0 in hist_init\n");
#endif #endif
#ifdef USE_TERMIOS #ifdef USE_TERMIOS
if (tcgetattr(STDIN, &oldtty) < 0) if (tcgetattr(STDIN, &oldtty) < 0) {
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Cannot tcgetattr stdin in hist_init\n");
return HIST_NOTTY; return HIST_NOTTY;
}
newtty = oldtty; newtty = oldtty;
newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK); newtty.c_lflag &= ~(ECHO | ECHOE | ECHOK);
@@ -346,11 +380,19 @@ hist_init(char *filename)
newtty.c_cc[VMIN] = 1; newtty.c_cc[VMIN] = 1;
newtty.c_cc[VTIME] = 0; newtty.c_cc[VTIME] = 0;
if (tcsetattr(STDIN, TCSANOW, &newtty) < 0) if (tcsetattr(STDIN, TCSANOW, &newtty) < 0) {
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Cannot tcsetattr stdin in hist_init\n");
return HIST_NOTTY; return HIST_NOTTY;
}
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: stty -ECHO -ECHOE -ECHOK -ICANON +ISTRIP "
"VMIN=1 VTIME=0 in hist_init\n");
#endif #endif
canedit = 1; canedit = 1;
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Set canedit in hist_init\n");
return HIST_SUCCESS; return HIST_SUCCESS;
} }
@@ -363,20 +405,36 @@ void
hist_term(void) hist_term(void)
{ {
if (!inited || !canedit) { if (!inited || !canedit) {
if (conf->calc_debug & CALCDBG_TTY) {
if (!inited)
printf("DEBUG: inited already cleared "
"in hist_term\n");
if (!canedit)
printf("DEBUG: canedit already cleared "
"in hist_term\n");
}
inited = 0; inited = 0;
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: Cleared inited in hist_term\n");
return; return;
} }
#ifdef USE_SGTTY #ifdef USE_SGTTY
(void) ioctl(STDIN, TIOCSETP, &oldtty); (void) ioctl(STDIN, TIOCSETP, &oldtty);
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: TIOCSETP restored stdin in hist_term\n");
#endif #endif
#ifdef USE_TERMIO #ifdef USE_TERMIO
(void) ioctl(STDIN, TCSETAW, &oldtty); (void) ioctl(STDIN, TCSETAW, &oldtty);
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: TCSETAW restored stdin in hist_term\n");
#endif #endif
#ifdef USE_TERMIOS #ifdef USE_TERMIOS
(void) tcsetattr(STDIN, TCSANOW, &oldtty); (void) tcsetattr(STDIN, TCSANOW, &oldtty);
if (conf->calc_debug & CALCDBG_TTY)
printf("DEBUG: TCSANOW restored stdin in hist_term\n");
#endif #endif
} }
@@ -455,11 +513,12 @@ do_bind_line(KEY_MAP *map, char *line)
if (*cp == '?') { if (*cp == '?') {
key = 0177; key = 0177;
cp++; cp++;
} else } else {
key = CONTROL(*cp++); key = CONTROL(*cp++);
} }
else if (key == '\\') } else if (key == '\\') {
key = *cp++; key = *cp++;
}
while (isspace((int)*cp)) while (isspace((int)*cp))
cp++; cp++;
@@ -523,8 +582,7 @@ do_default_line(KEY_MAP *map, char *line)
func_name = cp; func_name = cp;
while ((*cp != '\0') && !isspace((int)*cp)) while ((*cp != '\0') && !isspace((int)*cp))
cp++; cp++;
if (*cp != '\0') if (*cp != '\0') {
{
*cp++ = '\0'; *cp++ = '\0';
while (isspace((int)*cp)) while (isspace((int)*cp))
cp++; cp++;
@@ -533,15 +591,13 @@ do_default_line(KEY_MAP *map, char *line)
if (func == NULL) if (func == NULL)
return; return;
if (*cp == '\0') if (*cp == '\0') {
next = map; next = map;
else } else {
{
next_name = cp; next_name = cp;
while ((*cp != '\0') && !isspace((int)*cp)) while ((*cp != '\0') && !isspace((int)*cp))
cp++; cp++;
if (*cp != '\0') if (*cp != '\0') {
{
*cp++ = '\0'; *cp++ = '\0';
while (isspace((int)*cp)) while (isspace((int)*cp))
cp++; cp++;
@@ -1347,9 +1403,9 @@ beep(void)
static void static void
echo_char(int ch) echo_char(int ch)
{ {
if (isprint(ch)) if (isprint(ch)) {
putchar(ch); putchar(ch);
else { } else {
putchar('^'); putchar('^');
putchar((ch + '@') & 0x7f); putchar((ch + '@') & 0x7f);
} }
@@ -1383,8 +1439,112 @@ quit_calc(void)
exit(0); exit(0);
} }
#else /* USE_READLINE */
#ifdef HIST_TEST
#define HISTORY_LEN (1024) /* number of entries to save */
#include <readline/readline.h>
#include <readline/history.h>
/*
* The readline/history libs do most of the dirty work for us, so we can
* replace hist_init() and hist_term() with dummies when using readline.
* For hist_getline() we have to add a newline that readline removed but
* calc expects. For hist_saveline(), we have to undo this. hist_getline()
* also has to cope with the different memory management schemes of calc and
* readline.
*/
/* name of history file */
char *my_calc_history = NULL;
int
hist_getline(char *prompt, char *buf, int len)
{
char *line;
buf[0] = '\0';
line = readline(prompt);
if (!line)
return 0;
strncpy(buf, line, len - 1);
buf[len - 2] = '\0';
len = strlen(buf);
buf[len] = '\n';
buf[len + 1] = '\0';
free(line);
return len + 1;
}
void
hist_term(void)
{
}
static void
my_stifle_history (void)
{
/* only save last number of entries */
stifle_history(HISTORY_LEN);
if (my_calc_history)
write_history(my_calc_history);
}
int
hist_init(char *filename)
{
/* used when parsing conditionals in ~/.inputrc */
rl_readline_name = "calc";
/* initialize interactive variables */
using_history();
/* name of history file */
my_calc_history = tilde_expand("~/.calc_history");
/* read previous history */
read_history(my_calc_history);
atexit(my_stifle_history);
return HIST_SUCCESS;
}
void
hist_saveline(char *line, int len)
{
static char *prev = NULL;
if (len <= 1)
return;
/* ignore if identical with previous line */
if (prev != NULL && strcmp(prev, line) == 0)
return;
free (prev);
/* fail silently */
prev = strdup(line);
line[len - 1] = '\0';
add_history(line);
line[len - 1] = '\n';
}
#endif /* USE_READLINE */
#if defined(HIST_TEST)
/* /*
* Main routine to test history. * Main routine to test history.
@@ -1425,6 +1585,5 @@ main(int argc, char **argv)
hist_term(); hist_term();
exit(0); exit(0);
} }
#endif
/* END CODE */ #endif /* HIST_TEST */

85
input.c
View File

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

View File

@@ -44,7 +44,8 @@ CALC_FILES= README bigprime.cal deg.cal ellip.cal lucas.cal lucas_chk.cal \
test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \ test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \
test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \ test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \
beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \ beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \
randomrun.cal xx_print.cal natnumset.cal qtime.cal randomrun.cal xx_print.cal natnumset.cal qtime.cal test8400.cal \
test8500.cal
# These files are found (but not built) in the distribution # These files are found (but not built) in the distribution
# #
@@ -73,15 +74,11 @@ all: ${CALC_FILES} ${MAKE_FILE} .all
distlist: ${DISTLIST} distlist: ${DISTLIST}
${Q}for i in ${DISTLIST}; do \ ${Q}for i in ${DISTLIST}; do \
echo calc/lib/$$i; \ echo lib/$$i; \
done done
# The bsdi distribution has generated files as well as distributed files. distdir:
# ${Q}echo lib
bsdilist: ${DISTLIST}
${Q}for i in ${DISTLIST}; do \
echo calc/lib/$$i; \
done
clean: clean:

View File

@@ -2,11 +2,11 @@ To load a library, try:
read filename read filename
You to not need to add the .cal extension to the filename. Calc You do not need to add the .cal extension to the filename. Calc
will search along the $CALCPATH (see ``help environment''). will search along the $CALCPATH (see ``help environment'').
Normally a library will simply define some functions. By default, Normally a library will simply define some functions. By default,
most libraries will print out a short message when thei are read. most libraries will print out a short message when they are read.
For example: For example:
> read lucas > read lucas
@@ -17,7 +17,7 @@ For example:
will cause calc to load and execute the 'lucas.cal' library. will cause calc to load and execute the 'lucas.cal' library.
Executing the library will cause several functions to be defined. Executing the library will cause several functions to be defined.
Executing the lucas function Executing the lucas function:
> lucas(149,60) > lucas(149,60)
1 1
@@ -33,7 +33,9 @@ the calc language, and/or because the authors thought them to be useful!
If you write something that you think is useful, please send it to: If you write something that you think is useful, please send it 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 ]]
By convention, a lib file only defines and/or initializes functions, By convention, a lib file only defines and/or initializes functions,
objects and variables. (The regress.cal and testxxx.cal regression test objects and variables. (The regress.cal and testxxx.cal regression test
@@ -50,37 +52,41 @@ version of read:
This will cause the needed library files to be read once. If these This will cause the needed library files to be read once. If these
files have already been read, the read -once will act as a noop. files have already been read, the read -once will act as a noop.
By convention, the config parameter "lib_debug" is used to control The "lib_debug" parameter is intended for controlling the possible
the verbosity of debug information printed by lib files. By default, display of special information relating to functions, objects, and
the "lib_debug" has a value of 0. other structures created by instructions in calc scripts.
Zero value of config("lib_debug") means that no such information
is displayed. For other values, the non-zero bits which currently
have meanings are as follows:
The "lib_debug" config parameter takes the place of the lib_debug n Meaning of bit n of config("lib_debug")
global variable. By convention, "lib_debug" has the following meanings:
<-1 no debug messages are printed though some internal 0 When a function is defined, redefined or undefined at
debug actions and information may be collected interactive level, a message saying what has been done
is displayed.
-1 no debug messages are printed, no debug actions will be taken 1 When a function is defined, redefined or undefined during
the reading of a file, a message saying what has been done
is displayed.
0 only usage message regarding each important object are The value for config("lib_debug") in both oldstd and newstd is 3,
printed at the time of the read (default) but if calc is invoked with the -d flag, its initial value is zero.
Thus, if calc is started without the -d flag, until config("lib_debug")
is changed, a message will be output when a function is defined
either interactively or during the reading of a file.
>0 messages regarding each important object are Sometimes the information printed is not enough. In addition to the
printed at the time of the read in addition standard information, one might want to print:
to other debug messages
When config("lib_debug") >= 0, function names and their arg are
printed as they are defined. Sometimes this printing is not enough
information. For example:
* useful obj definitions * useful obj definitions
* functions with optional args * functions with optional args
* functions with optional args where the param() interface is used * functions with optional args where the param() interface is used
For these cases we suggest that you place at the bottom of your code For these cases we suggest that you place at the bottom of your code
something like: something that prints extra information if config("lib_debug") has
either of the bottom 2 bits set:
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "obj xyz defined"; print "obj xyz defined";
print "funcA([val1 [, val2]]) defined"; print "funcA([val1 [, val2]]) defined";
print "funcB(size, mass, ...) defined"; print "funcB(size, mass, ...) defined";
@@ -269,10 +275,18 @@ pell.cal
pi.cal pi.cal
qpi(epsilon) qpi(epsilon)
piforever()
Calculate pi within the specified epsilon using the quartic convergence The qpi() calculate pi within the specified epsilon using the quartic
iteration. convergence iteration.
The piforever() prints digits of pi, nicely formatted, for as long
as your free memory space and system up time allows.
The piforever() funcion (written by Klaus Alexander Seistrup
<klaus@seistrup.dk>) was inspired by an algorithm conceived by
Lambert Meertens. See also the ABC Programmer's Handbook, by Geurts,
Meertens & Pemberton, published by Prentice-Hall (UK) Ltd., 1990.
pix.cal pix.cal
@@ -346,7 +360,7 @@ randbitrun.cal
randbitrun([run_cnt]) randbitrun([run_cnt])
Using randbit(1) to generate a sequence of random bits, determine if Using randbit(1) to generate a sequence of random bits, determine if
the number and kength of identical bits runs match what is expected. the number and length of identical bits runs match what is expected.
By default, run_cnt is to test the next 65536 random values. By default, run_cnt is to test the next 65536 random values.
This tests the a55 generator. This tests the a55 generator.
@@ -402,7 +416,7 @@ randrun.cal
regress.cal regress.cal
Test the correct execution of the calculator by reading this library file. Test the correct execution of the calculator by reading this library file.
Errors are reported with '****' mssages, or worse. :-) Errors are reported with '****' messages, or worse. :-)
seedrandom.cal seedrandom.cal

View File

@@ -1,4 +1,8 @@
# Alternate key bindings for calc line editing functions # Alternate key bindings for calc line editing functions
#
# NOTE: This facility is ignored if calc was compiled with GNU-readline.
# In that case, the standard readline mechanisms (see readline(3))
# are used in place of those found below.
map base-map map base-map
default insert-char default insert-char

View File

@@ -1,4 +1,8 @@
# Default key bindings for calc line editing functions # Default key bindings for calc line editing functions
#
# NOTE: This facility is ignored if calc was compiled with GNU-readline.
# In that case, the standard readline mechanisms (see readline(3))
# are used in place of those found below.
map base-map map base-map
default insert-char default insert-char

View File

@@ -86,7 +86,7 @@
* i.e., any value that is 301 mod 420. * i.e., any value that is 301 mod 420.
* *
* Written by: Ernest W Bowen <ernie@neumann.une.edu.au> * Written by: Ernest W Bowen <ernie@neumann.une.edu.au>
* Interface by: Landon Curt Noll <chongo@toad.com> * Interface by: Landon Curt Noll http://reality.sgi.com/chongo/
*/ */
static defaultmlist = list(2,3,5,7,11,13,17,19); /* The first eight primes */ static defaultmlist = list(2,3,5,7,11,13,17,19); /* The first eight primes */
@@ -174,7 +174,7 @@ define chrem()
} }
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "chrem(r1,m1 [,r2,m2 ...]) defined"; print "chrem(r1,m1 [,r2,m2 ...]) defined";
print "chrem(rlist [,mlist]) defined"; print "chrem(rlist [,mlist]) defined";
} }

View File

@@ -111,6 +111,6 @@ define fixdms(a)
a.deg %= 360; a.deg %= 360;
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "obj dms {deg, min, sec} defined"; print "obj dms {deg, min, sec} defined";
} }

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ chongo@toad.com * Landon Curt Noll
* http://reality.sgi.com/chongo/
*
* chongo <was here> /\../\
*/ */
/* /*
* lucas - perform a Lucas primality test on h*2^n-1 * lucas - perform a Lucas primality test on h*2^n-1
@@ -1024,7 +1027,7 @@ gen_v1(h, n)
define define
ldebug(funct, str) ldebug(funct, str)
{ {
if (config("lib_debug") > 0) { if (config("lib_debug") & 3) {
print "DEBUG:", funct:":", str; print "DEBUG:", funct:":", str;
} }
return; return;

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ chongo@toad.com * Landon Curt Noll
* http://reality.sgi.com/chongo/
*
* chongo <was here> /\../\
*/ */
/* /*
* primes of the form h*2^n-1 for 1<=h<200 and 1<=n<1000 * primes of the form h*2^n-1 for 1<=h<200 and 1<=n<1000
@@ -328,7 +331,7 @@ lucas_chk(high_n, quiet)
/* skip primes where h>=2^n */ /* skip primes where h>=2^n */
if (highbit(h_p[i]) >= n_p[i]) { if (highbit(h_p[i]) >= n_p[i]) {
if (config("lib_debug") > 0) { if (config("lib_debug") & 3) {
print "h>=2^n skip:", h_p[i]:"*2^":n_p[i]:"-1"; print "h>=2^n skip:", h_p[i]:"*2^":n_p[i]:"-1";
} }
continue; continue;

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ chongo@toad.com * Landon Curt Noll
* http://reality.sgi.com/chongo/
*
* chongo <was here> /\../\
*/ */
/* /*
* Lucasian criteria for primality * Lucasian criteria for primality
@@ -149,7 +152,7 @@ d_val[97]=1045; a_val[97]=33; b_val[97]=1; r_val[97]=44;
d_val[99]=9797; a_val[99]=97; b_val[99]=1; r_val[99]=388; d_val[99]=9797; a_val[99]=97; b_val[99]=1; r_val[99]=388;
d_val[100]= 51; a_val[100]= 7; b_val[100]=1; r_val[100]=2; d_val[100]= 51; a_val[100]= 7; b_val[100]=1; r_val[100]=2;
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "d_val[100] defined"; print "d_val[100] defined";
print "a_val[100] defined"; print "a_val[100] defined";
print "b_val[100] defined"; print "b_val[100] defined";

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ chongo@toad.com * Landon Curt Noll
* http://reality.sgi.com/chongo/
*
* chongo <was here> /\../\
*/ */
@@ -309,6 +312,6 @@ define mfactor(n, start_k, rept_loop, p_elim)
return q; return q;
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "mfactor(n [, start_k=1 [, rept_loop=10000 [, p_elim=17]]])" print "mfactor(n [, start_k=1 [, rept_loop=10000 [, p_elim=17]]])"
} }

View File

@@ -189,7 +189,7 @@ define mod_pow(a, b)
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "obj mod {a} defined"; print "obj mod {a} defined";
print "mod_value defined"; print "mod_value defined";
print "set mod_value as needed"; print "set mod_value as needed";

View File

@@ -47,3 +47,75 @@ define qpi(epsilon)
} }
return (bround(1/an, bits)); return (bround(1/an, bits));
} }
/*
* Print digits of PI forever, neatly formatted, using calc.
*
* Written by Klaus Alexander Seistrup <klaus@seistrup.dk>
* on a dull Friday evening in November 1999.
*
* Inspired by an algorithm conceived by Lambert Meertens.
*
* See also the ABC Programmer's Handbook, by Geurts, Meertens & Pemberton,
* published by Prentice-Hall (UK) Ltd., 1990.
*
*/
define piforever()
{
local k = 2;
local a = 4;
local b = 1;
local a1 = 12;
local b1 = 4;
local a2, b2, p, q, d, d1;
local stdout = files(1);
local first = 1, row = -1, col = 0;
while (1) {
/*
* Next approximation
*/
p = k * k;
q = k + k++;
a2 = a;
b2 = b;
a = a1;
a1 = p * a2 + q * a1;
b = b1;
b1 = p * b2 + q * b1;
/*
* Print common digits
*/
d = a // b;
d1 = a1 // b1;
while (d == d1) {
if (first) {
printf("%d.", d);
first = 0;
} else {
if (!(col % 50)) {
printf("\n");
col = 0;
if (!(++row % 20)) {
printf("\n");
row = 0;
}
}
printf("%d", d);
if (!(++col % 10))
printf(" ");
}
a = 10 * (a % b);
a1 = 10 * (a1 % b1);
d = a // b;
d1 = a1 // b1;
}
fflush(stdout);
}
}

View File

@@ -687,6 +687,6 @@ a=pol(1,4,4,2,3,1);
b=pol(5,16,8,1); b=pol(5,16,8,1);
c=pol(1+2i,3+4i,5+6i); c=pol(1+2i,3+4i,5+6i);
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "obj poly {p} defined"; print "obj poly {p} defined";
} }

View File

@@ -7,7 +7,7 @@
* utc_hr_offset Offset from UTC in hours. * utc_hr_offset Offset from UTC in hours.
* *
* Written by: Klaus Alexander Seistrup <kseis@magnetic-ink.dk> * Written by: Klaus Alexander Seistrup <kseis@magnetic-ink.dk>
* With minor mods by: Landon Curt Noll <chongo@toad.com> * With minor mods by: Landon Curt Noll <http://reality.sgi.com/chongo/>
* *
* See: * See:
* http://www.magnetic-ink.dk/download/qtime.html * http://www.magnetic-ink.dk/download/qtime.html

View File

@@ -195,6 +195,6 @@ define quat_shift(a, b)
return x.s; return x.s;
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "obj quat {s, v} defined"; print "obj quat {s, v} defined";
} }

View File

@@ -21,7 +21,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ chongo@toad.com * Landon Curt Noll
* http://reality.sgi.com/chongo/
*
* chongo <was here> /\../\
*/ */
/* obtain our required libs */ /* obtain our required libs */

View File

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

View File

@@ -20,17 +20,17 @@ print '002: Within each section, output should be numbered sequentially';
global prob; /* libregress.cal problem counter */ global prob; /* libregress.cal problem counter */
prob = 0; /* clear problem counter */ prob = 0; /* clear problem counter */
global junk; /* throw away value */ errcount(0),; /* clear error count */
junk = errcount(0); /* clear error count */ errmax(-1),; /* prevent errcount from abouting */
junk = errmax(-1); /* prevent errcount from abouting */
global ecnt; /* expected value of errcount() */ global ecnt; /* expected value of errcount() */
ecnt = 0; /* clear expected errcount() value */ ecnt = 0; /* clear expected errcount() value */
initcfg = config("all", "oldstd"); /* set config to startup default */ initcfg = config("all", "oldstd"); /* set config to startup default */
initcfg = config("lib_debug", -4); /* disable lib startup messages */ config("lib_debug", 0),; /* disable lib startup messages */
initcfg = config("calc_debug", 1); /* enable more internal debugging */ config("calc_debug", 0),; /* disable internal debugging */
initcfg = config("all"); /* save state for later use */ config("verbose_quit", 0),; /* disable quit messages */
startcfg = config("all"); /* save state for later use */
print '003: parsed global definitions'; print '003: parsed global definitions';
@@ -291,7 +291,7 @@ define test_arithmetic()
vrfy(8/4==2, '404: 8 / 4 == 2'); vrfy(8/4==2, '404: 8 / 4 == 2');
vrfy(2^3==8, '405: 2 ^ 3 == 8'); vrfy(2^3==8, '405: 2 ^ 3 == 8');
vrfy(9-4-2==3, '406: 9-4-2 == 3'); vrfy(9-4-2==3, '406: 9-4-2 == 3');
vrfy(9-4+2==7, '407: 9-4+2 == 6'); vrfy(9-4+2==7, '407: 9-4+2 == 7');
vrfy(-5+2==-3, '408: -5+2 == -3'); vrfy(-5+2==-3, '408: -5+2 == -3');
vrfy(2*3+1==7, '409: 2*3+1 == 7'); vrfy(2*3+1==7, '409: 2*3+1 == 7');
vrfy(1+2*3==7, '410: 1+2*3 == 7'); vrfy(1+2*3==7, '410: 1+2*3 == 7');
@@ -358,7 +358,7 @@ define test_config()
print '502: callcfg = config("all","oldstd")'; print '502: callcfg = config("all","oldstd")';
oldcfg = config("all", "newstd"); oldcfg = config("all", "newstd");
print '503: oldcfg = config("all","newstd")'; print '503: oldcfg = config("all","newstd")';
vrfy(callcfg == initcfg, '504: callcfg == initcfg'); vrfy(callcfg == startcfg, '504: callcfg == startcfg');
newcfg = config("all"); newcfg = config("all");
print '505: newcfg = config("all")'; print '505: newcfg = config("all")';
vrfy(config("all") == newcfg, '506: config("all") == newcfg'); vrfy(config("all") == newcfg, '506: config("all") == newcfg');
@@ -456,7 +456,7 @@ define test_config()
vrfy(config("all",callcfg) == oldcfg, vrfy(config("all",callcfg) == oldcfg,
'550: config("all",callcfg) == oldcfg'); '550: config("all",callcfg) == oldcfg');
vrfy(config("all") == callcfg, '551: config("all") == callcfg'); vrfy(config("all") == callcfg, '551: config("all") == callcfg');
vrfy(config("all") == initcfg, '552: config("all") == initcfg'); vrfy(config("all") == startcfg, '552: config("all") == startcfg');
print '553: Ending test_config'; print '553: Ending test_config';
} }
@@ -964,7 +964,7 @@ define test_functions()
vrfy(strpos(a, a) == 1, '948: strpos(a, a) == 1'); vrfy(strpos(a, a) == 1, '948: strpos(a, a) == 1');
vrfy(system("") == 0, '949: system("") == 0'); vrfy(system("") == 0, '949: system("") == 0');
vrfy(system("true") == 0, '950: system("true") == 0'); vrfy(system("true") == 0, '950: system("true") == 0');
vrfy(isatty(files(0)) == 1, '951: isatty(files(0)) == 1'); print '951: test disabled due to stdin dependency';
print '952: test removed'; print '952: test removed';
print '953: test removed'; print '953: test removed';
vrfy(isstr(cmdbuf()) == 1, '954: isstr(cmdbuf()) == 1'); vrfy(isstr(cmdbuf()) == 1, '954: isstr(cmdbuf()) == 1');
@@ -1694,6 +1694,7 @@ define test_obj()
{ {
static obj surd a; static obj surd a;
static obj surd b; static obj surd b;
local PP;
print '1800: Beginning object test'; print '1800: Beginning object test';
@@ -1731,7 +1732,10 @@ define test_obj()
vrfy(a <= a, '1828: a < a'); vrfy(a <= a, '1828: a < a');
vrfy(isobj(a) == 1, '1829: isobj(a) == 1'); vrfy(isobj(a) == 1, '1829: isobj(a) == 1');
print '1830: Ending object test'; obj pt {x,y}, PP = obj pair {A,B} = {obj pt, obj pt};
print '1830: obj pt {x,y}, PP = obj pair {A,B} = {obj pt, obj pt}';
print '1831: Ending object test';
} }
print '028: parsed test_obj()'; print '028: parsed test_obj()';
@@ -2867,7 +2871,7 @@ print '053: parsed test_frem()';
*/ */
define test_error() define test_error()
{ {
local strx, e99, list1, e999; local strx, e99, list1, e9999;
local a, b, c, n, x; /* used by newerror() */ local a, b, c, n, x; /* used by newerror() */
print '3600: Beginning test_error'; print '3600: Beginning test_error';
@@ -3040,11 +3044,12 @@ define test_error()
'3710: newerror() == newerror("???")'); '3710: newerror() == newerror("???")');
vrfy(newerror("") == newerror(), vrfy(newerror("") == newerror(),
'3711: newerror("") == newerror()'); '3711: newerror("") == newerror()');
e999 = error(999); e9999 = error(9999);
print '3712: e999 = error(999)'; print '3712: e9999 = error(9999)';
vrfy(errno() == 999, '3713: errno() == 999'); vrfy(errno() == 9999, '3713: errno() == 9999');
vrfy(error() == e999, '3714: error() == e999'); vrfy(error() == e9999, '3714: error() == e9999');
vrfy(strerror() == "Error 999", '3715: strerror() == "Error 999"'); vrfy(substr(strerror(), strlen(strerror())-3, 4) == "9999",
'3715: substr(strerror(), strlen(strerror())-3, 4) == "9999"');
x = newerror("Alpha"); x = newerror("Alpha");
print '3716: x = newerror("Alpha")'; print '3716: x = newerror("Alpha")';
n = iserror(x); n = iserror(x);
@@ -3052,19 +3057,22 @@ define test_error()
vrfy(errno() == n, '3718: errno() == n'); vrfy(errno() == n, '3718: errno() == n');
vrfy(error() == x, '3719: error() == x'); vrfy(error() == x, '3719: error() == x');
vrfy(strerror() == "Alpha", '3720: strerror() == "Alpha"'); vrfy(strerror() == "Alpha", '3720: strerror() == "Alpha"');
vrfy(errno(999) == n, '3721: errno() == n'); vrfy(errno(9999) == n, '3721: errno() == n');
vrfy(errno() == 999, '3722: errno() == 999'); vrfy(errno() == 9999, '3722: errno() == 9999');
vrfy(error() == e999, '3723: error() == e999'); vrfy(error() == e9999, '3723: error() == e9999');
vrfy(strerror() == "Error 999", '3724: strerror() == "Error 999"'); vrfy(substr(strerror(), strlen(strerror())-3, 4) == "9999",
'3724: substr(strerror(), strlen(strerror())-3, 4) == "9999"');
a = 1/0; a = 1/0;
print '3725: a = 1/0'; print '3725: a = 1/0';
vrfy(strerror() == "Division by zero", vrfy(strerror() == "Division by zero",
'3726: strerror() == "Division by zero"'); '3726: strerror() == "Division by zero"');
vrfy(substr(strerror(9941), strlen(strerror(9941))-3, 4) == "9941",
'3728: substr(strerror(9941), strlen(strerror(9941))-3, 4) == "9941"');
/* errmax and errcount should be bumped up the 148 errors above */ /* errmax and errcount should be bumped up the 148 errors above */
vrfy(errcount() == ecnt, '3727: errcount() == ecnt'); vrfy(errcount() == ecnt, '3728: errcount() == ecnt');
print '3728: Ending test_error'; print '3729: Ending test_error';
} }
print '054: parsed test_error()'; print '054: parsed test_error()';
@@ -3302,7 +3310,7 @@ define test_fileops()
print '4261: Ending test_fileops'; print '4261: Ending test_fileops';
} }
print '071: parsed test_redc()'; print '071: parsed test_fileops()';
/* /*
@@ -4223,7 +4231,7 @@ define test_random()
/* test range interface some more */ /* test range interface some more */
tmp = srandom(state1); tmp = srandom(state1);
print '5369: tmp = srandom(0)'; print '5369: tmp = srandom(state1)';
vrfy(random(-46,46) == -0x7, '5370: random(-46,46) == -0x7'); vrfy(random(-46,46) == -0x7, '5370: random(-46,46) == -0x7');
vrfy(random(21701,23209) == 23061, vrfy(random(21701,23209) == 23061,
'5371: random(21701,23209) == 23061'); '5371: random(21701,23209) == 23061');
@@ -4687,8 +4695,8 @@ define test_commaeq()
/* /*
* matrix assignment * matrix assignment
*/ */
mat A[3] = {1,2,3}, B[2] = {1,2}; mat A[3] = {1,2,3}, mat B[2] = {1,2};
print '5625: mat A[3] = {1,2,3}, B[2] = {1,2}'; print '5625: mat A[3] = {1,2,3}, mat B[2] = {1,2}';
vrfy(A[0] == 1, '5626: A[0] == 1'); vrfy(A[0] == 1, '5626: A[0] == 1');
vrfy(B[1] == 2, '5627: B[1] == 2'); vrfy(B[1] == 2, '5627: B[1] == 2');
@@ -4916,8 +4924,8 @@ define test_assign(base, work)
print base+3: ': X5800 = base+3'; print base+3: ': X5800 = base+3';
Y5800 = base+4; Y5800 = base+4;
print base+4: ': Y5800 = base+4'; print base+4: ': Y5800 = base+4';
obj xy5800 A={1,2}, B={3,4}; obj xy5800 A={1,2}, obj xy5800 B={3,4};
print base+5: ': obj xy5800 A={1,2}, B={3,4}'; print base+5: ': obj xy5800 A={1,2}, obj xy5000 B={3,4}';
/* /*
* test assignment * test assignment
@@ -5106,7 +5114,7 @@ define test_is()
vrfy(isatty(square) == 0, '5981: isatty(square) == 0'); vrfy(isatty(square) == 0, '5981: isatty(square) == 0');
vrfy(isatty(string) == 0, '5982: isatty(string) == 0'); vrfy(isatty(string) == 0, '5982: isatty(string) == 0');
vrfy(isatty(com) == 0, '5983: isatty(com) == 0'); vrfy(isatty(com) == 0, '5983: isatty(com) == 0');
vrfy(isatty(files(0)) == 1, '5984: isatty(files(0)) == 1'); print '5984: test disabled due to stdin dependency';
/* if we pipe to awk (for make chk), stdout and stderr are not ttys */ /* if we pipe to awk (for make chk), stdout and stderr are not ttys */
print '5985: test unused'; print '5985: test unused';
print '5986: test unused'; print '5986: test unused';
@@ -6861,7 +6869,7 @@ print '181: parsed test_ptr()';
*/ */
define test_newstring() define test_newstring()
{ {
local A, B, C, D, S, p; local A, B, C, D, S, p, q;
print '7700: Beginning test_newstring'; print '7700: Beginning test_newstring';
@@ -6953,7 +6961,14 @@ define test_newstring()
print '7762: setbit(A, 16, 0);'; print '7762: setbit(A, 16, 0);';
vrfy(A == "A\255fdef", '7763: A == "A\255fdef"'); vrfy(A == "A\255fdef", '7763: A == "A\255fdef"');
print '7764: Ending test_newstring'; q = "curds" " and " "whey";
print '7764: q = "curds" " and " "whey"';
vrfy(q == "curds and whey", '7765: q == "curds and whey"');
q = "chongo" ' was ' "here";
print '7766: q = "chongo" \' was \' "here"';
vrfy(q == "chongo was here", '7767: q == "chongo was here"');
print '7768: Ending test_newstring';
} }
print '182: parsed test_newstring()'; print '182: parsed test_newstring()';
@@ -7113,8 +7128,12 @@ print '188: parsed test_natnumset()';
/* /*
* test_somenew - test some new features * test_somenew - test some new features
*/ */
define func8200(x,y) {if (x>0) return calclevel()+func8200(x-1,y)-y; return 0;}
print '189: define func8200(x,y)';
define test_somenew() define test_somenew()
{ {
local a, s, y;
print '8200: Starting test_somenew'; print '8200: Starting test_somenew';
vrfy(char(-1) == char(255), '8201: char(-1) == char(255)'); vrfy(char(-1) == char(255), '8201: char(-1) == char(255)');
@@ -7139,9 +7158,42 @@ define test_somenew()
vrfy(1/(1/0) == 0, '8215: 1/(1/0) == 0'); vrfy(1/(1/0) == 0, '8215: 1/(1/0) == 0');
vrfy(inverse(1/0) == 0, '8216: inverse(1/0) == 0'); vrfy(inverse(1/0) == 0, '8216: inverse(1/0) == 0');
print '8217: Ending test_somenew'; a = isqrt(2e1000); s = "xyz";
print '8217: a = isqrt(2e1000); s = "xyz";';
vrfy(hash(a,s) == 2708885378, '8218: hash(a,s) == 2708885378');
vrfy(hash("curds n whey") == 2376141927,
'8219: hash("curds n whey") == 2376141927');
y = calclevel();
print '8220: y = calclevel()';
vrfy(func8200(0,y) == 0, '8221: func8200(0,y) == 0');
vrfy(func8200(1,y) == 1, '8222: func8200(1,y) == 1');
vrfy(func8200(10,y) == 55, '8223: func8200(10,y) == 55');
vrfy(func8200(100,y) == 5050, '8224: func8200(100,y) == 5050');
vrfy(inputlevel() == 1, '8225: inputlevel() == 1');
print '8226: Ending test_somenew';
} }
print '189: parsed test_somenew()'; print '190: parsed test_somenew()';
/*
* test_quit - test the QUIT functionality
*/
define test_quit()
{
local x8400 = 23209; /* watch for lost memory */
static s8400 = 21701; /* watch for lost memory */
print '8400: Starting test_quit';
quit;
prob('quit did not end the test_quit() function');
/* 8400 serise continued after return, do not print end here */
}
print '191: parsed test_quit()';
/* /*
@@ -7195,16 +7247,27 @@ print '1700: Beginning read test';
value = 0; value = 0;
vrfy(value == 0, '1701: value == 0'); vrfy(value == 0, '1701: value == 0');
read "test1700"; read "test1700";
vrfy(value == 1, '1702: value == 1'); print '1702: read "test1700";';
read -once "test1700";
vrfy(value == 1, '1703: value == 1'); vrfy(value == 1, '1703: value == 1');
read -once "test1700";
print '1704: read -once "test1700";';
vrfy(value == 1, '1705: value == 1');
read "test1700.cal"; read "test1700.cal";
vrfy(value == 2, '1704: value == 2'); print '1706: read "test1700.cal";';
vrfy(value == 2, '1707: value == 2');
read -once "test1700.cal"; read -once "test1700.cal";
vrfy(value == 2, '1705: value == 2'); print '1708: read -once "test1700.cal";';
vrfy(value == 2, '1709: value == 2');
read "test1700.cal"; read "test1700.cal";
vrfy(value == 3, '1706: value == 3'); print '1710: read "test1700.cal";';
print '1707: Ending read test'; vrfy(value == 3, '1711: value == 3');
{++value;} read "test1700.cal";
print '1712: {++value;} read "test1700.cal";';
vrfy(value == 5, '1713: value == 5');
{++value;} read -once "test1700.cal";
print '1714: {++value;} read -once "test1700.cal";';
vrfy(value == 6, '1715: value == 6');
print '1716: Ending read test';
print; print;
return test_obj(); return test_obj();
@@ -7279,6 +7342,9 @@ print;
return test_size(); return test_size();
print; print;
/*
* 5800 assignment tests
*/
return test_assign(5800, 1); return test_assign(5800, 1);
define xy5800_assign(a,b) { }; define xy5800_assign(a,b) { };
print '5812: define xy5800_assign(a,b) { }'; print '5812: define xy5800_assign(a,b) { }';
@@ -7323,7 +7389,10 @@ X5800 = obj xy5800 = {1,2};
print '5864: X5800 = obj xy5800 = {1,2}'; print '5864: X5800 = obj xy5800 = {1,2}';
vrfy(X5800 == (obj xy5800 = {1,2}), vrfy(X5800 == (obj xy5800 = {1,2}),
'5865: X5800 == (obj xy5800 = {1,2})'); '5865: X5800 == (obj xy5800 = {1,2})');
print '5899: End of 5800 sequence'; define f5800(a5800 = mat[2] = {3,4}) = 5 * a5800;
print '5866: define f5800(a5800 = mat[2] = {3,4}) = 5 * a5800;'
vrfy(f5800() == (mat[] = {15,20}),'5867: f5800() == (mat[] = {15,20})');
print '5868: End of 5800 sequence';
print; print;
return test_is(); return test_is();
@@ -7393,6 +7462,46 @@ print;
return test_somenew(); return test_somenew();
/*
* misc define tests
*/
print;
print '8300: Starting define tests';
define f8300(x) = x^2; define g8300(x) = 1 - x;
print '8301: define f8300(x) = x^2; define g8300(x) = 1 - x;';
vrfy(f8300(10) == 100, '8302: f8300(10) == 100');
vrfy(g8300(10) == -9, '8303: g8300(10) == -9');
define h8300(x)=x^3;define i8300(x)=x-1;define j8300(x)=x+1;
print '8304: define h8300(x)=x^3;define i8300(x)=x-1;define j8300(x)=x+1;';
vrfy(h8300(10) == 1000, '8305: h8300(10) == 1000');
vrfy(i8300(10) == 9, '8306: i8300(10) == 9');
vrfy(j8300(10) == 11, '8307: j8300(10) == 11');
{static k8300 = 5} define l8300(x) = k8300 + x;
print '8308: {static k8300 = 5} define l8300(x) = k8300 + x;';
vrfy(l8300(10) == 15, '8309: l8300(10) == 15');
print '8310: Ending define tests';
/*
* quit tests
*/
print;
return test_quit();
read -once test8400;
print '8404: read -once test8400';
vrfy(test8400() == 64434, '8405: test8400() == 64434');
print '8406: Ending test_quit';
/*
* test_divmod - psuedo-random tests on the // and % with various rounding modes
*/
print;
print '8500: Starting test_divmod'
read -once "test8500";
/* 85xx: Ending test_divmod is printed by test8500.cal */
/* /*
* read various calc libs * read various calc libs
* *
@@ -7406,7 +7515,7 @@ return test_somenew();
* lucas_tbl.cal - duplicatres code already read by another file * lucas_tbl.cal - duplicatres code already read by another file
* regress.cal - this file * regress.cal - this file
* surd.cal - already read by this file * surd.cal - already read by this file
* testXXXX.cal - already read by this file * test9999.cal - files of this form are already read by this file
* xx_print.cal - prints a bunch of things when loaded * xx_print.cal - prints a bunch of things when loaded
* *
* We want to do this 2nd to last; ahead of any final cleanup and behind * We want to do this 2nd to last; ahead of any final cleanup and behind

View File

@@ -19,7 +19,10 @@
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
* *
* chongo was here /\../\ chongo@toad.com * Landon Curt Noll
* http://reality.sgi.com/chongo/
*
* chongo <was here> /\../\
*/ */
/* /*
@@ -110,7 +113,7 @@ define seedrandom(seed1, seed2, size, trials)
p = 2*fp+1; p = 2*fp+1;
} while (ptest(p,1,0) == 0); } while (ptest(p,1,0) == 0);
} while(ptest(p, trials) == 0 || ptest(fp, trials) == 0); } while(ptest(p, trials) == 0 || ptest(fp, trials) == 0);
if (config("lib_debug") > 0) { if (config("lib_debug") & 3) {
print "/* 1st Blum prime */ p=", p; print "/* 1st Blum prime */ p=", p;
} }
@@ -124,7 +127,7 @@ define seedrandom(seed1, seed2, size, trials)
q = 2*fq+1; q = 2*fq+1;
} while (ptest(q,1,0) == 0); } while (ptest(q,1,0) == 0);
} while(ptest(q, trials) == 0 || ptest(fq, trials) == 0); } while(ptest(q, trials) == 0 || ptest(fq, trials) == 0);
if (config("lib_debug") > 0) { if (config("lib_debug") & 3) {
print "/* 2nd Blum prime */ q=", q; print "/* 2nd Blum prime */ q=", q;
} }
@@ -134,7 +137,7 @@ define seedrandom(seed1, seed2, size, trials)
n = p*q; /* the Blum modulus */ n = p*q; /* the Blum modulus */
binsize = highbit(n)+1; /* smallest power of 2 > p*q */ binsize = highbit(n)+1; /* smallest power of 2 > p*q */
r = pmod(rand(1<<ceil(binsize*4/5), 1<<(binsize-2)), 2, n); r = pmod(rand(1<<ceil(binsize*4/5), 1<<(binsize-2)), 2, n);
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "/* seed quadratic residue */ r=", r; print "/* seed quadratic residue */ r=", r;
print "/* newn", binsize, "bit quadratic residue*/ newn=", n; print "/* newn", binsize, "bit quadratic residue*/ newn=", n;
} }
@@ -151,6 +154,6 @@ define seedrandom(seed1, seed2, size, trials)
return old_state; return old_state;
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "seedrandom(seed1, seed2, size [, trials]) defined"; print "seedrandom(seed1, seed2, size [, trials]) defined";
} }

View File

@@ -261,7 +261,7 @@ define surd_rel(a, b)
return sgn(x^2 - y^2 * surd_type) * sgn(x); return sgn(x^2 - y^2 * surd_type) * sgn(x);
} }
if (config("lib_debug") >= 0) { if (config("lib_debug") & 3) {
print "obj surd {a, b} defined"; print "obj surd {a, b} defined";
print "surd_type defined"; print "surd_type defined";
print "set surd_type as needed"; print "set surd_type as needed";

View File

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

View File

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

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
* *
* This library is used by the 2600 series of the regress.cal test suite. * This library is used by the 2600 series of the regress.cal test suite.
*/ */

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
* *
* This library is used by the 2700 series of the regress.cal test suite. * This library is used by the 2700 series of the regress.cal test suite.
*/ */

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
* *
* This library is used by the 3100 series of the regress.cal test suite. * This library is used by the 3100 series of the regress.cal test suite.
*/ */

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
* *
* This library is used by the 3300 series of the regress.cal test suite. * This library is used by the 3300 series of the regress.cal test suite.
*/ */

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
* *
* This library is used by the 3400 series of the regress.cal test suite. * This library is used by the 3400 series of the regress.cal test suite.
*/ */

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
* *
* This library is used by the 3500 series of the regress.cal test suite. * This library is used by the 3500 series of the regress.cal test suite.
*/ */

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
* *
* This library is used by the 4000 series of the regress.cal test suite. * This library is used by the 4000 series of the regress.cal test suite.
*/ */

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
* *
* This library is used by the 4100 series of the regress.cal test suite. * This library is used by the 4100 series of the regress.cal test suite.
*/ */

View File

@@ -4,7 +4,7 @@
* provided that this copyright notice remains intact. * provided that this copyright notice remains intact.
* *
* By: Ernest Bowen and Landon Curt Noll * By: Ernest Bowen and Landon Curt Noll
* ernie@neumann.une.edu.au and chongo@toad.com * ernie@neumann.une.edu.au and http://reality.sgi.com/chongo/
* *
* This library is used by the 4600 series of the regress.cal test suite. * This library is used by the 4600 series of the regress.cal test suite.
*/ */

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