mirror of
https://github.com/lcn2/calc.git
synced 2025-08-19 01:13:27 +03:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4c0f2691e9 | ||
|
0d37ccb019 | ||
|
d7d31e9246 | ||
|
2dc364ee9f | ||
|
b54d8fc510 | ||
|
8cabbd6fb4 | ||
|
ea64a95b90 |
86
BUGS
86
BUGS
@@ -78,86 +78,14 @@ Known problems or mis-features:
|
||||
and not much in the way of comments. We need some major cleanup
|
||||
and documentation.
|
||||
|
||||
* On Solaris cc when compile with -Xc (which results in BASEB=16
|
||||
because it eliminates the long long type), some of the hash
|
||||
functions fail.
|
||||
* On a Dec Alpha, using the Dec Alpha cc (not gcc) make check for
|
||||
version 2.11.0t5.1 fails in the regression test:
|
||||
|
||||
NOTE: As a work-a-round, Solaris cc users should compile
|
||||
with -DFORCE_STDC and without -Xc.
|
||||
From vandermj@molbio.sbphrd.com Tue Oct 5 04:06:52 1999
|
||||
Subject: Re: oops, try calc version 2.10.0t5.1
|
||||
Date: Tue, 05 Oct 1999 07:06:30 -0400
|
||||
|
||||
From: "Dr.D.J.Picton" <dave@aps5.ph.bham.ac.uk>
|
||||
Subject: Re: calc version 2.11.0t4
|
||||
Date: Fri, 1 Oct 1999 16:12:30 +0100 (BST)
|
||||
Regular cc on Dec alpha, 'make check' dies with:
|
||||
|
||||
**** Non-true result (0): 7120: sha(sha(isqrt(2e1000)==0x6db8d9cf0b018b8f9cbbf5aa1edb8066d19e1bb0
|
||||
7120 result came out as 0x2f19f0baa7824cb8da5e9908044a3f648e992
|
||||
**** Non-true result (0): 7122: sha(sha("this is", 7^19-8, ..., "hash")) == 0x21e4...
|
||||
7122 result came out as 0xa050ece371eda88a461afcb807091f7613aa4488
|
||||
7123: z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi());
|
||||
**** Non-true result (0): 7124: sha(z) == 0x36dcca3e51865c30a2cf738023cda446f1368340
|
||||
7124 result came out as 0xccaff4f97187821018d983cc0ce51787fb96a73c
|
||||
**** Non-true result (0): 7209: sha1(sha1("this is",7^19-8,"a composit",3i+4.5,"hash")) == ...
|
||||
7209 result came out as 0xb9631fea54a3e999521efa99745d2e2a5f65cd3b
|
||||
7210: z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi());
|
||||
**** Non-true result (0): 7211: sha1(z) == 0xc19e7317675dbf71e293b4c41e117169e9da5b6f
|
||||
7211result came out as 0xb8e5c8fdbbe4539cf601b0f6eb874f9662edb50c
|
||||
**** Non-true result (0): 7227: sha1(sha1(isqrt(2e1000)))==0x6852a1365c51050c3d039e3c5d9cf29c12283ef4
|
||||
7227 result came out as 0x91018a59d87c7d945451538412cadd56b7ec4681
|
||||
**** Non-true result (0): 7310: md5(md5("this is", 7^19-8, "a composit", 3i+4.5, "hash")) == ...
|
||||
7310 result came out as 0x65c29173098713fdec0f319551355243
|
||||
7311: z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi());
|
||||
**** Non-true result (0): 7312: md5(z) == 0x63d2b2fccae2de265227c30b05abb6b5
|
||||
7311 result came out as 0x1ba0c3eb5ba11dfe11394c0837f52d85
|
||||
**** Non-true result (0): 7328: md5(md5(isqrt(2e1000))) == 0xe56ac4b8cad869e738a04fedc97058f3
|
||||
7328 result came out as 0x5afae12a1db610da2846c35f2bf144b0
|
||||
|
||||
**** 9 error(s) found \/++\/
|
||||
9999: Ending regression tests
|
||||
|
||||
* On a Dec Alpha, make check for version 2.11.0t1 core dumps:
|
||||
|
||||
From vandermj@molbio.sbphrd.com Fri Sep 24 06:15:28 1999
|
||||
Subject: Re: calc version 2.11.0t1
|
||||
Date: Fri, 24 Sep 1999 09:15:02 -0400
|
||||
|
||||
It dies as follows:
|
||||
|
||||
...
|
||||
1802: a = surd(2,3)
|
||||
1803: a == surd(2,3)
|
||||
1804: surd_value(a) == 2+3i
|
||||
Segmentation fault
|
||||
|
||||
dbx shows:
|
||||
signal Segmentation fault at [objcall:155 +0xc,0x1200507b4] index = oap->actions[action];
|
||||
(dbx) where
|
||||
> 0 objcall(action = 14, v1 = 0x1400203d0, v2 = 0x1400203e0, v3 = (nil)) ["obj.c":155, 0x1200507b4]
|
||||
1 comparevalue(v1 = 0x1400203d0, v2 = 0x1400203e0) ["value.c":2329, 0x12007f250]
|
||||
2 o_eq() ["opcodes.c":2659, 0x12003728c]
|
||||
3 calculate(fp = 0x14007fce0) ["opcodes.c":3614, 0x12003942c]
|
||||
4 o_usercall(fp = 0x14007fce0, index = 39, argcount = 0) ["opcodes.c":2602, 0x120037080]
|
||||
5 calculate(fp = 0x14003bfa0) ["opcodes.c":3622, 0x120039488]
|
||||
6 evaluate(nestflag = 14) ["codegen.c":210, 0x120028768]
|
||||
7 getcommands(toplevel = 536864560) ["codegen.c":158, 0x1200285bc]
|
||||
8 getcommands(toplevel = 536864560) ["codegen.c":122, 0x1200284dc]
|
||||
9 main() ["calc.c":279, 0x12001f61c]
|
||||
|
||||
Michel van der List reports that he was using the Dec compiler.
|
||||
|
||||
However On 25-Sep-99 9:18, Ernest Bowen wrote:
|
||||
|
||||
Last night I downloaded 2.11.0t1 and without changing Makefile
|
||||
or anything else did a make and make check. Absolutely no
|
||||
reported errors or warnings and the check "passed all tests".
|
||||
The machine I'm using is a Dec 20 alpha running Digitial
|
||||
UNIX V4.0B (Rev 564).
|
||||
|
||||
Ernest Bowen was using gcc.
|
||||
|
||||
We definitely want to hunt down this Dec's cc compiler issue. It
|
||||
could very well be that gcc is letting something slide where as
|
||||
Dec's cc compiler is compiling it faithfully into core dumping code.
|
||||
The fault could very well be the calc code and not the compiler.
|
||||
|
||||
Any more information on calc core dumps compiled with Dec's cc compiler
|
||||
would be most appreciated!
|
||||
"": line 1706: Calling qfreenum with nozero links!!!
|
||||
|
183
CHANGES
183
CHANGES
@@ -1,4 +1,103 @@
|
||||
Following is the change from calc version 2.11.0t1 to date:
|
||||
Following is the change from calc version 2.11.0t7 to date:
|
||||
|
||||
Calc has some new command line flags / command line meaning:
|
||||
(Thanks goes to Ernest Bowen <ernie@turing.une.edu.au>)
|
||||
|
||||
-i Go into interactive mode if possible.
|
||||
|
||||
-c Continue reading command lines even after an execution
|
||||
error has caused the abandonment of a line
|
||||
|
||||
To understand the -i and -c effects, consider the following
|
||||
file (call it myfile.cal) which has deliberate errors in it:
|
||||
|
||||
print 1;
|
||||
mat A[1] = {2,3};
|
||||
print 2;
|
||||
epsilon(-1);
|
||||
print 3;
|
||||
|
||||
calc read myfile
|
||||
|
||||
Reports an error on the 2nd line and exits; prints 1 only.
|
||||
|
||||
calc -c read myfile
|
||||
|
||||
Report errors on the 2nd and 4th lines and exits; prints 1,2 and 3.
|
||||
|
||||
calc -i read myfile
|
||||
|
||||
Report errors on the 2nd and gives you a prompt; prints 1 only.
|
||||
|
||||
calc -i -c read myfile
|
||||
|
||||
Report errors on the 2nd and 4th and gives you a prompt;
|
||||
prints 1, 2 and 3.
|
||||
|
||||
cat myfile | calc
|
||||
|
||||
Reports an error on the 2nd line and exits; prints 1 only.
|
||||
|
||||
cat myfile | calc -c
|
||||
|
||||
Report errors on the 2nd and 4th lines and exits; prints 1,2 and 3.
|
||||
|
||||
Note that continuation refers to command lines, not to statements. So:
|
||||
|
||||
calc -c 'print "start"; mat A[1] = {2,3}; print "end";'
|
||||
|
||||
since it contains no newline, the whole string is compiled,
|
||||
but execution is abandoned when the error is encountered and
|
||||
the string ``end'' is not printed.
|
||||
|
||||
You can use your shell to supply newlines in your command line
|
||||
arguments. For example in sh, ksh, bash:
|
||||
|
||||
calc -c 'print "start";
|
||||
mat A[1] = {2,3};
|
||||
print "end";'
|
||||
|
||||
will print both ``start'' and ``end''. C-shell users can do:
|
||||
|
||||
calc -c 'print "start"; \
|
||||
mat A[1] = {2,3}; \
|
||||
print "end";'
|
||||
|
||||
however sh, ksh, bash will not see ``end'' printed because their
|
||||
shell will remove the internal newlines.
|
||||
|
||||
Added display(n) builtin which does almost the same as config("display",n)
|
||||
except that rather than causing an execution with an out-of-range or
|
||||
bad-type argument type, it simply writes a message to stderr. This
|
||||
also now happens to the errmax() builtin.
|
||||
|
||||
Added qtime.cal to the standard calc library.
|
||||
|
||||
Added another command line flag to calc:
|
||||
|
||||
-d Disable display of the opening title and config("lib_debug",0)
|
||||
|
||||
The command:
|
||||
|
||||
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.
|
||||
|
||||
A call of errmax(-1) will prevent errcount from aborting calc.
|
||||
|
||||
|
||||
Following is the change from calc version 2.11.0t1 to 2.11.0t6.3:
|
||||
|
||||
Removed the makefile symbol MAIN. Now forcing all functions to correctly
|
||||
be declared main. To satisfy some old broken compilers, a return 0;
|
||||
@@ -25,17 +124,19 @@ Following is the change from calc version 2.11.0t1 to date:
|
||||
porting calc to C++! We will NOT support C++ compilation of calc.
|
||||
Calc will written ANSI C. We just compiled with a suggestion from
|
||||
Love-Jensen, John <jlove-jensen@globalmt.com> to make calc's version
|
||||
of C a little more to C++ compilers. Avoiding symbols such as new
|
||||
or try for example.
|
||||
of C a little more to C++ compilers. We are simply avoiding symbols
|
||||
such as new or try for example.
|
||||
|
||||
Updated README.FIRST and BUGS to reflect new URLs and addresses.
|
||||
Renamed README to README.OLD. Renamed README.FIRST to README.
|
||||
Updated README, lib/README and BUGS to reflect new URLs and addresses.
|
||||
|
||||
Added a HOWTO.INSTALL file.
|
||||
|
||||
Reordered cc Makefile variable sets in the main Makefile.
|
||||
|
||||
Fixed a bug and applied a fix that was reported by Ernest Bowen
|
||||
<ernie@turing.une.edu.au>. Added regression tests 1103 to 1112.
|
||||
Fixed a bug in hnrmod() and applied a fix that was reported by Ernest
|
||||
Bowen <ernie@turing.une.edu.au>. Added regression tests 1103 to
|
||||
1112 to confirm the fix.
|
||||
|
||||
Fixed a bug in version.c related to MINOR_PATCHs in both the
|
||||
empty and non-empty MINOR_PATCH cases.
|
||||
@@ -78,15 +179,6 @@ Following is the change from calc version 2.11.0t1 to date:
|
||||
|
||||
The custom.c file is now compiled with full ${CFLAGS}.
|
||||
|
||||
### XXX - this change has been backed out:
|
||||
#
|
||||
# Thanks to the efforts of Ernest Bowen <ernie@neumann.une.edu.au> and
|
||||
# Dr.D.J.Picton <dave@aps5.ph.bham.ac.uk>, a nasty endian-ness bug
|
||||
# in the sha and sha1 hash functions that showed up on machines such
|
||||
# as the Sparc was fixed.
|
||||
#
|
||||
###
|
||||
|
||||
Rewrote command line / argument processing code. Calc is now
|
||||
using getopt(3) argument processing.
|
||||
|
||||
@@ -113,14 +205,12 @@ Following is the change from calc version 2.11.0t1 to date:
|
||||
|
||||
Fixed memory leaks in zsrand() in zrand.c.
|
||||
|
||||
Fixed a memory leak in zsrandom1() in zrandom.c.
|
||||
Fixed a memory leak in zsrandom1() in zrandom.c. Fixed memory
|
||||
leaks associated with replacing the internal random state with
|
||||
another random state.
|
||||
|
||||
Added seed() builtin to return a 64 bit seed for a
|
||||
psuedo-random generator.
|
||||
|
||||
Added functionality from Ernest Bowen <ernie@turing.une.edu.au>
|
||||
to give arguments as well as function names after definitions when
|
||||
calc_debug >= 0.
|
||||
pseudo-random generator.
|
||||
|
||||
Added functionality from Ernest Bowen <ernie@turing.une.edu.au> to
|
||||
permit nested "= {...}" assignments for lists as well as matrices
|
||||
@@ -145,6 +235,57 @@ Following is the change from calc version 2.11.0t1 to date:
|
||||
freeglobals() at the end of the test suite to free storage
|
||||
consumed during the regression.
|
||||
|
||||
Added custom function custom("pzasusb8", n) and lib/pzasusb8.cal based on
|
||||
Ernest Bowen's diagnostic patch.
|
||||
|
||||
Thanks to the efforts of Ernest Bowen <ernie@neumann.une.edu.au> and
|
||||
Dr.D.J.Picton <dave@aps5.ph.bham.ac.uk>, a nasty endian-ness bug
|
||||
in the sha and sha1 hash functions that showed up on machines such
|
||||
as the Sparc was fixed.
|
||||
|
||||
Added functionality from Ernest Bowen <ernie@turing.une.edu.au>
|
||||
to give arguments as well as function names after definitions when
|
||||
config("lib_debug") >= 0.
|
||||
|
||||
Removed if (config("lib_debug") >= 0) { ... } the ends of most
|
||||
of the calc library scripts because it was redundant with the
|
||||
new config("lib_debug") >= 0 functionality. Some of the calc
|
||||
library still has a partial section because some useful
|
||||
additional information was being printed:
|
||||
|
||||
chrem.cal deg.cal lucas_tbl.cal randrun.cal
|
||||
mfactor.cal mod.cal poly.cal seedrandom.cal
|
||||
surd.cal varargs.cal
|
||||
|
||||
Fixed ellip.cal so that its defined function does not conflict with
|
||||
the factor() builtin function.
|
||||
|
||||
Fixed mod.cal so that a defined function does not conflict with
|
||||
the mod() builtin function.
|
||||
|
||||
The regression test suite now reads in most calc libs. A few
|
||||
libs are not read because they, by design, produce output
|
||||
when read even when config("lib_debug") is set to -1.
|
||||
|
||||
Increased the maximum number of object types that one can define
|
||||
from 10 to 128.
|
||||
|
||||
Added a patch from Ernest Bowen <ernie@turing.une.edu.au>
|
||||
to correctly hash a V_STR value-type that has an \0 byte
|
||||
inside it.
|
||||
|
||||
A patch from Ernest Bowen <ernie@turing.une.edu.au> now defines
|
||||
special meaning to the first 2 bits of config("lib_debug"):
|
||||
|
||||
bit 0 set => messages printed when inputisterminal
|
||||
bit 1 set => messages printed when reading from a file
|
||||
|
||||
The lib/regress.cal regression suite does:
|
||||
|
||||
config("lib_debug", -4);
|
||||
|
||||
to eliminate lib messages (both bit 0 and bit 1 are not set).
|
||||
|
||||
Fixed misc compile warnings and notices.
|
||||
|
||||
|
||||
|
@@ -50,3 +50,6 @@ Installing calc in 4 easy steps:
|
||||
4) install calc:
|
||||
|
||||
make install
|
||||
|
||||
We suggest that you might want to read the README file and look at
|
||||
the calc help subsystem. See the README file for details.
|
||||
|
6
Makefile
6
Makefile
@@ -931,7 +931,7 @@ C_SRC= ${LIBSRC} ${CALCSRC} ${UTIL_C_SRC}
|
||||
# These files are found (but not built) in the distribution
|
||||
#
|
||||
DISTLIST= ${C_SRC} ${H_SRC} ${MAKE_FILE} BUGS CHANGES LIBRARY README \
|
||||
calc.man lint.sed README.FIRST HOWTO.INSTALL ${UTIL_MISC_SRC}
|
||||
calc.man lint.sed README.OLD HOWTO.INSTALL ${UTIL_MISC_SRC}
|
||||
|
||||
# complete list of .o files
|
||||
#
|
||||
@@ -2259,11 +2259,11 @@ bsdilist: ${DISTLIST} ${BUILD_H_SRC} calc.1
|
||||
##
|
||||
|
||||
check: all ./lib/regress.cal ${REGRESS_CAL}
|
||||
${CALC_ENV} ./calc -i -q read regress
|
||||
${CALC_ENV} ./calc -d -q read regress
|
||||
|
||||
chk: ./lib/regress.cal ${REGRESS_CAL}
|
||||
${V} echo '=-=-=-=-= start of $@ rule =-=-=-=-='
|
||||
${CALC_ENV} ./calc -i -q read regress 2>&1 | ${AWK} -f check.awk
|
||||
${CALC_ENV} ./calc -d -q read regress 2>&1 | ${AWK} -f check.awk
|
||||
${V} echo '=-=-=-=-= end of $@ rule =-=-=-=-='
|
||||
|
||||
##
|
||||
|
122
README
122
README
@@ -1,73 +1,87 @@
|
||||
# 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.
|
||||
Dear calc user,
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
NOTE: This is an old historic README. We recommend that you
|
||||
read README.FIRST and HOWTO.INSTALL for more info.
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
See the HOWTO.INSTALL file for information on how to build and install calc.
|
||||
|
||||
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.
|
||||
To be sure that your version of calc is up to date, check out:
|
||||
|
||||
-dbell-
|
||||
http://reality.sgi.com/chongo/calc/calc-download.html
|
||||
|
||||
p.s. By Landon Curt Noll:
|
||||
We are interested in any/all feedback on recent versions of calc.
|
||||
In particular we would like to hear about:
|
||||
|
||||
Building calc in 3 easy steps:
|
||||
* compiler warnings
|
||||
* compile problems
|
||||
* regression test problems (try: make check)
|
||||
* special compile flags/options that you needed
|
||||
* Makefile problems
|
||||
* help file problems
|
||||
* misc nits and typos
|
||||
|
||||
1) Look at the makefile, and adjust it to suit your needs.
|
||||
We would like to offer a clean compile across a wide verity of platforms,
|
||||
so if you can test on several, so much the better!
|
||||
|
||||
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<<<==
|
||||
If you run into problems, see the BUGS file.
|
||||
|
||||
=-=
|
||||
|
||||
For further reading:
|
||||
Calc is distributed with an extensive collection of help files that
|
||||
are accessible from the command line. The following assume that you
|
||||
are running calc from the distribution directory or that you have
|
||||
installed calc. In these examples, the ">" is the calc prompt, not
|
||||
something that you type in.
|
||||
|
||||
LIBRARY
|
||||
explains how programs can use libcalc.a to take advantage
|
||||
of the calc multi-precision routines.
|
||||
For list of help topics:
|
||||
|
||||
> help
|
||||
|
||||
For overview of calc overview:
|
||||
|
||||
> help intro
|
||||
> help overview
|
||||
> help command
|
||||
> help define
|
||||
> help statement
|
||||
> help variable
|
||||
|
||||
For list of builtin functions:
|
||||
|
||||
> help builtin
|
||||
|
||||
C programmers should note some unexpected differences in the calc syntax:
|
||||
|
||||
> help unexpected
|
||||
|
||||
Calc is shipped with a library of calc scripts. For a list see:
|
||||
|
||||
> help stdlib
|
||||
|
||||
=-=
|
||||
|
||||
See the file:
|
||||
|
||||
help/todo
|
||||
current wish list for calc
|
||||
|
||||
CHANGES
|
||||
recent changes to calc
|
||||
or run:
|
||||
|
||||
BUGS
|
||||
known bugs, mis-features and how to report problems
|
||||
calc 'help todo'
|
||||
|
||||
help/full
|
||||
full set of calc documentation
|
||||
for a wish/todo list. Code contributions are welcome.
|
||||
|
||||
=-=
|
||||
|
||||
David I. Bell dbell@auug.org.au
|
||||
chongo@toad.com <Landon Curt Noll -- chongo@toad.com> /\../\
|
||||
To join the calc-tester mailing list. Send 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.
|
||||
|
||||
The calc web site is located at:
|
||||
|
||||
http://reality.sgi.com/chongo/calc
|
||||
|
54
README.FIRST
54
README.FIRST
@@ -1,54 +0,0 @@
|
||||
Dear calc user,
|
||||
|
||||
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:
|
||||
|
||||
http://reality.sgi.com/chongo/calc/calc-download.html
|
||||
|
||||
We are interested in any/all feedback on recent versions of calc.
|
||||
In particular we would like to hear about:
|
||||
|
||||
* compiler warnings
|
||||
* compile problems
|
||||
* regression test problems (try: make check)
|
||||
* special compile flags/options that you needed
|
||||
* Makefile problems
|
||||
* help file problems
|
||||
* misc nits and typos
|
||||
|
||||
We would like to offer a clean compile across a wide verity of platforms,
|
||||
so if you can test on several, so much the better!
|
||||
|
||||
If you run into problems, see the BUGS file.
|
||||
|
||||
=-=
|
||||
|
||||
See the file:
|
||||
|
||||
help/todo
|
||||
|
||||
or run:
|
||||
|
||||
calc 'help todo'
|
||||
|
||||
for a wish/todo list. Code contributions are welcome.
|
||||
|
||||
=-=
|
||||
|
||||
To join the calc-tester mailing list. Send 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.
|
||||
|
||||
The calc web site is located at:
|
||||
|
||||
http://reality.sgi.com/chongo/calc
|
73
README.OLD
Normal file
73
README.OLD
Normal file
@@ -0,0 +1,73 @@
|
||||
# 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> /\../\
|
11
addop.c
11
addop.c
@@ -164,7 +164,8 @@ endfunc(void)
|
||||
size += dumpop(&fp->f_opcodes[size]);
|
||||
}
|
||||
}
|
||||
if (inputisterminal() || conf->lib_debug >= 0) {
|
||||
if ((inputisterminal() && conf->lib_debug & 1) ||
|
||||
(!inputisterminal() && conf->lib_debug & 2)) {
|
||||
printf("%s(", fp->f_name);
|
||||
for (index = 0; index < fp->f_paramcount; index++) {
|
||||
if (index)
|
||||
@@ -237,7 +238,8 @@ rmuserfunc(char *name)
|
||||
return;
|
||||
freenumbers(functions[index]);
|
||||
free(functions[index]);
|
||||
if (!inputisterminal() && conf->lib_debug >= 0)
|
||||
if ((inputisterminal() && conf->lib_debug & 1) ||
|
||||
(!inputisterminal() && conf->lib_debug & 2))
|
||||
printf("%s() undefined\n", name);
|
||||
functions[index] = NULL;
|
||||
}
|
||||
@@ -447,6 +449,11 @@ addop(long op)
|
||||
case OP_GLOBALADDR:
|
||||
diff = 1 + PTR_SIZE;
|
||||
break;
|
||||
case OP_UNDEF:
|
||||
fp->f_opcodecount -= 1;
|
||||
oldop = OP_NOP;
|
||||
oldoldop = OP_NOP;
|
||||
return;
|
||||
default:
|
||||
cut = FALSE;
|
||||
}
|
||||
|
116
calc.c
116
calc.c
@@ -49,6 +49,7 @@ 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 char *pager; /* $PAGER or default */
|
||||
extern int stdin_tty; /* TRUE if stdin is a tty */
|
||||
@@ -63,9 +64,12 @@ extern char *version(void); /* return version string */
|
||||
* static definitions and functions
|
||||
*/
|
||||
static char *usage = "usage: %s [-C] [-e] [-h] [-i] [-m mode] [-n] [-p]\n"
|
||||
"\t[-q] [-u] [[--] calc_cmd ...]\n";
|
||||
"\t[-q] [-u] [-c] [-d] [[--] calc_cmd ...]\n";
|
||||
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.
|
||||
@@ -84,7 +88,7 @@ main(int argc, char **argv)
|
||||
* parse args
|
||||
*/
|
||||
program = argv[0];
|
||||
while ((c = getopt(argc, argv, "Cehim:npquv")) != -1) {
|
||||
while ((c = getopt(argc, argv, "Cehim:npquvcd")) != -1) {
|
||||
switch (c) {
|
||||
case 'C':
|
||||
#if defined(CUSTOM)
|
||||
@@ -107,7 +111,7 @@ main(int argc, char **argv)
|
||||
want_defhelp = 1;
|
||||
break;
|
||||
case 'i':
|
||||
ign_errmax = TRUE;
|
||||
i_flag = TRUE;
|
||||
break;
|
||||
case 'm':
|
||||
if (optarg[1] == '\0' || *optarg<'0' || *optarg>'7') {
|
||||
@@ -136,6 +140,12 @@ main(int argc, char **argv)
|
||||
case 'u':
|
||||
u_flag = TRUE;
|
||||
break;
|
||||
case 'c':
|
||||
c_flag = TRUE;
|
||||
break;
|
||||
case 'd':
|
||||
d_flag = TRUE;
|
||||
break;
|
||||
case 'v':
|
||||
/*
|
||||
* we are too early in processing to call
|
||||
@@ -153,6 +163,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
interactive = (optind >= argc);
|
||||
havecommands = !interactive;
|
||||
|
||||
/*
|
||||
* look at the length of any trailing command args
|
||||
@@ -201,8 +212,7 @@ main(int argc, char **argv)
|
||||
* initialize
|
||||
*/
|
||||
libcalc_call_me_first();
|
||||
stdin_tty = TRUE; /* assume internactive default */
|
||||
conf->tab_ok = TRUE; /* assume internactive default */
|
||||
stdin_tty = isatty(0); /* assume stdin is on fd 0 */
|
||||
if (want_defhelp) {
|
||||
givehelp(DEFAULTCALCHELP);
|
||||
libcalc_call_me_last();
|
||||
@@ -212,21 +222,12 @@ main(int argc, char **argv)
|
||||
/*
|
||||
* if allowed or needed, print version and setup bindings
|
||||
*/
|
||||
if (interactive) {
|
||||
/*
|
||||
* check for pipe mode and/or non-tty stdin
|
||||
*/
|
||||
if (!p_flag) {
|
||||
stdin_tty = isatty(0); /* assume stdin is on fd 0 */
|
||||
}
|
||||
|
||||
/*
|
||||
* if tty, setup bindings
|
||||
*/
|
||||
if (stdin_tty) {
|
||||
if (!havecommands && stdin_tty) {
|
||||
if (!d_flag) {
|
||||
printf("%s (version %s)\n", CALC_TITLE, version());
|
||||
printf("[%s]\n\n",
|
||||
"Type \"exit\" to exit, or \"help\" for help.");
|
||||
}
|
||||
switch (hist_init(calcbindings)) {
|
||||
case HIST_NOFILE:
|
||||
fprintf(stderr,
|
||||
@@ -242,7 +243,6 @@ main(int argc, char **argv)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* establish error longjump point with initial conditions
|
||||
@@ -252,53 +252,65 @@ main(int argc, char **argv)
|
||||
/*
|
||||
* reset/initialize the computing environment
|
||||
*/
|
||||
if (post_init) {
|
||||
if (post_init)
|
||||
initialize();
|
||||
} else {
|
||||
/* initialize already done, jmpbuf is ready */
|
||||
post_init = TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* if arg mode or non-tty mode, just do the work and be gone
|
||||
*/
|
||||
if (!interactive || !stdin_tty) {
|
||||
if (q_flag == FALSE && allow_read) {
|
||||
runrcfiles();
|
||||
q_flag = TRUE;
|
||||
}
|
||||
if (interactive)
|
||||
(void) openterminal();
|
||||
else
|
||||
(void) openstring(cmdbuf);
|
||||
start_done = TRUE;
|
||||
getcommands(FALSE);
|
||||
libcalc_call_me_last();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
/* if in arg mode, we should not get here */
|
||||
if (!interactive) {
|
||||
libcalc_call_me_last();
|
||||
exit(1);
|
||||
}
|
||||
(void) signal(SIGINT, intint);
|
||||
|
||||
/*
|
||||
* process commands
|
||||
*/
|
||||
if (!start_done) {
|
||||
if (start_done == 0) {
|
||||
if (!q_flag && allow_read) {
|
||||
start_done = 1;
|
||||
runrcfiles();
|
||||
}
|
||||
start_done = 2;
|
||||
}
|
||||
if (start_done == 1) {
|
||||
fprintf(stderr, "Execution error in rcfiles\n");
|
||||
if (c_flag)
|
||||
getcommands(FALSE);
|
||||
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)
|
||||
getcommands(FALSE);
|
||||
else
|
||||
closeinput();
|
||||
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) {
|
||||
start_done = 6;
|
||||
}
|
||||
reinitialize();
|
||||
}
|
||||
(void) signal(SIGINT, intint);
|
||||
start_done = TRUE;
|
||||
|
||||
if (start_done < 6) {
|
||||
start_done = 5;
|
||||
getcommands(TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* all done
|
||||
*/
|
||||
libcalc_call_me_last();
|
||||
/* exit(0); */
|
||||
return 0;
|
||||
return (start_done - 6) ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
|
6
calc.h
6
calc.h
@@ -37,7 +37,7 @@
|
||||
#define SYMBOLSIZE 256 /* maximum symbol name size */
|
||||
#define MAXINDICES 20 /* maximum number of indices for objects */
|
||||
#define MAXLABELS 100 /* maximum number of user labels in function */
|
||||
#define MAXOBJECTS 10 /* maximum number of object types */
|
||||
#define MAXOBJECTS 128 /* maximum number of object types */
|
||||
#define MAXSTRING 1024 /* maximum size of string constant */
|
||||
#define MAXSTACK 1000 /* maximum depth of evaluation stack */
|
||||
#define MAXFILES 20 /* maximum number of opened files */
|
||||
@@ -58,6 +58,8 @@
|
||||
#define ABORT_MATH 3 /* abort on any math operation */
|
||||
#define ABORT_NOW 4 /* abort right away */
|
||||
|
||||
#define ERRMAX 20 /* default errmax value */
|
||||
|
||||
/*
|
||||
* File ids corresponding to standard in, out, error, and when not in use.
|
||||
*/
|
||||
@@ -163,7 +165,7 @@ extern char *shell; /* $SHELL or default */
|
||||
extern char *program; /* our name (argv[0]) */
|
||||
|
||||
extern int no_env; /* TRUE (-e) => ignore env vars on startup */
|
||||
extern int ign_errmax; /* TRUE (-i) => ignore when errcount exceeds errmax */
|
||||
extern int errmax; /* if >= 0, error when errcount exceeds errmax */
|
||||
extern int new_std; /* TRUE (-n) => use newstd configuration */
|
||||
|
||||
extern int allow_read; /* FALSE => may not open any files for reading */
|
||||
|
49
codegen.c
49
codegen.c
@@ -261,6 +261,8 @@ getfunction(void)
|
||||
{
|
||||
char *name; /* parameter name */
|
||||
int type; /* type of token read */
|
||||
LABEL label;
|
||||
long index;
|
||||
|
||||
(void) tokenmode(TM_DEFAULT);
|
||||
if (gettoken() != T_SYMBOL) {
|
||||
@@ -276,9 +278,11 @@ getfunction(void)
|
||||
beginfunc(name, FALSE);
|
||||
enterfuncscope();
|
||||
if (gettoken() != T_LEFTPAREN) {
|
||||
scanerror(T_SEMICOLON, "Left parenthesis expected for function");
|
||||
scanerror(T_SEMICOLON,
|
||||
"Left parenthesis expected for function");
|
||||
return;
|
||||
}
|
||||
index = 0;
|
||||
for (;;) {
|
||||
type = gettoken();
|
||||
if (type == T_RIGHTPAREN)
|
||||
@@ -292,12 +296,22 @@ getfunction(void)
|
||||
case SYM_UNDEFINED:
|
||||
case SYM_GLOBAL:
|
||||
case SYM_STATIC:
|
||||
(void) addparam(name);
|
||||
index = addparam(name);
|
||||
break;
|
||||
default:
|
||||
scanerror(T_NULL, "Parameter \"%s\" is already defined", name);
|
||||
}
|
||||
type = gettoken();
|
||||
if (type == T_ASSIGN) {
|
||||
clearlabel(&label);
|
||||
addopone(OP_PARAMADDR, index);
|
||||
addoplabel(OP_JUMPNN, &label);
|
||||
getopassignment();
|
||||
addop(OP_ASSIGNPOP);
|
||||
setlabel(&label);
|
||||
type = gettoken();
|
||||
}
|
||||
|
||||
if (type == T_RIGHTPAREN)
|
||||
break;
|
||||
if (type != T_COMMA) {
|
||||
@@ -598,25 +612,25 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
||||
scanerror(T_SEMICOLON, "CONTINUE not within FOR, WHILE, or DO");
|
||||
return;
|
||||
}
|
||||
addoplabel(OP_JUMPNE, contlabel);
|
||||
addoplabel(OP_JUMPNZ, contlabel);
|
||||
break;
|
||||
case T_BREAK:
|
||||
if (breaklabel == NULL_LABEL) {
|
||||
scanerror(T_SEMICOLON, "BREAK not within FOR, WHILE, or DO");
|
||||
return;
|
||||
}
|
||||
addoplabel(OP_JUMPNE, breaklabel);
|
||||
addoplabel(OP_JUMPNZ, breaklabel);
|
||||
break;
|
||||
case T_GOTO:
|
||||
if (gettoken() != T_SYMBOL) {
|
||||
scanerror(T_SEMICOLON, "Missing label in goto");
|
||||
return;
|
||||
}
|
||||
addop(OP_JUMPNE);
|
||||
addop(OP_JUMPNZ);
|
||||
addlabel(tokensymbol());
|
||||
break;
|
||||
default:
|
||||
addoplabel(OP_JUMPEQ, &label1);
|
||||
addoplabel(OP_JUMPZ, &label1);
|
||||
rescantoken();
|
||||
getstatement(contlabel, breaklabel, NULL_LABEL, NULL_LABEL);
|
||||
if (gettoken() != T_ELSE) {
|
||||
@@ -667,7 +681,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
||||
contlabel = &label1;
|
||||
rescantoken();
|
||||
(void) getexprlist();
|
||||
addoplabel(OP_JUMPNE, &label3);
|
||||
addoplabel(OP_JUMPNZ, &label3);
|
||||
addoplabel(OP_JUMP, breaklabel);
|
||||
if (gettoken() != T_SEMICOLON) {
|
||||
(void) tokenmode(oldmode);
|
||||
@@ -708,7 +722,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
||||
clearlabel(breaklabel);
|
||||
setlabel(contlabel);
|
||||
getcondition();
|
||||
addoplabel(OP_JUMPEQ, breaklabel);
|
||||
addoplabel(OP_JUMPZ, breaklabel);
|
||||
getstatement(contlabel, breaklabel, NULL_LABEL, NULL_LABEL);
|
||||
addoplabel(OP_JUMP, contlabel);
|
||||
setlabel(breaklabel);
|
||||
@@ -731,7 +745,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
|
||||
}
|
||||
setlabel(contlabel);
|
||||
getcondition();
|
||||
addoplabel(OP_JUMPNE, &label3);
|
||||
addoplabel(OP_JUMPNZ, &label3);
|
||||
setlabel(breaklabel);
|
||||
(void) tokenmode(oldmode);
|
||||
return;
|
||||
@@ -1377,6 +1391,21 @@ getassignment (void)
|
||||
{
|
||||
int type; /* type of expression */
|
||||
|
||||
switch(gettoken()) {
|
||||
case T_COMMA:
|
||||
case T_SEMICOLON:
|
||||
case T_NEWLINE:
|
||||
case T_RIGHTPAREN:
|
||||
case T_RIGHTBRACKET:
|
||||
case T_RIGHTBRACE:
|
||||
case T_EOF:
|
||||
addop(OP_UNDEF);
|
||||
rescantoken();
|
||||
return EXPR_RVALUE;
|
||||
}
|
||||
|
||||
rescantoken();
|
||||
|
||||
type = getaltcond();
|
||||
|
||||
switch (gettoken()) {
|
||||
@@ -1441,7 +1470,7 @@ getaltcond(void)
|
||||
}
|
||||
clearlabel(&donelab);
|
||||
clearlabel(&altlab);
|
||||
addoplabel(OP_JUMPEQ, &altlab);
|
||||
addoplabel(OP_JUMPZ, &altlab);
|
||||
type = getaltcond();
|
||||
if (gettoken() != T_COLON) {
|
||||
scanerror(T_SEMICOLON, "Missing colon for conditional expression");
|
||||
|
4
config.c
4
config.c
@@ -93,7 +93,7 @@ CONFIG oldstd = { /* backward compatible standard configuration */
|
||||
FALSE, /* skip duplicate block output lines */
|
||||
BLK_BASE_HEX, /* block octet print base */
|
||||
BLK_FMT_HD_STYLE, /* block output format */
|
||||
0, /* calc library debug level */
|
||||
3, /* calc library debug level */
|
||||
0, /* internal calc debug level */
|
||||
0 /* user defined debug level */
|
||||
};
|
||||
@@ -128,7 +128,7 @@ CONFIG newstd = { /* new non-backward compatible configuration */
|
||||
FALSE, /* skip duplicate block output lines */
|
||||
BLK_BASE_HEX, /* block octet print base */
|
||||
BLK_FMT_HD_STYLE, /* block output format */
|
||||
0, /* calc library debug level */
|
||||
3, /* calc library debug level */
|
||||
0, /* internal calc debug level */
|
||||
0 /* user defined debug level */
|
||||
};
|
||||
|
4
config.h
4
config.h
@@ -85,7 +85,7 @@
|
||||
|
||||
|
||||
/*
|
||||
* config defult symbols
|
||||
* config default symbols
|
||||
*/
|
||||
#define DISPLAY_DEFAULT 20 /* default digits for float display */
|
||||
#define EPSILON_DEFAULT "1e-20" /* allowed error for float calculations */
|
||||
@@ -95,8 +95,6 @@
|
||||
#define MAXPRINT_DEFAULT 16 /* default number of elements printed */
|
||||
#define MAXSCANCOUNT 20 /* default max scan errors before an abort */
|
||||
|
||||
#define ERRMAX 20 /* default errmax value */
|
||||
|
||||
|
||||
/*
|
||||
* configuration object
|
||||
|
@@ -41,13 +41,13 @@
|
||||
#
|
||||
# Put your custom calc library files here.
|
||||
#
|
||||
CUSTOM_CALC_FILES= argv.cal halflen.cal
|
||||
CUSTOM_CALC_FILES= argv.cal halflen.cal pzasusb8.cal
|
||||
|
||||
# The custom help files to install
|
||||
#
|
||||
# Put your custom help files here.
|
||||
#
|
||||
CUSTOM_HELP= argv devnull help sysinfo
|
||||
CUSTOM_HELP= argv devnull help sysinfo pzasusb8
|
||||
|
||||
# Any .h files that are needed by programs that use libcustcalc.a
|
||||
#
|
||||
@@ -63,7 +63,7 @@ CUSTOM_H_SRC=
|
||||
#
|
||||
# Put your custom .c files here.
|
||||
#
|
||||
CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c
|
||||
CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c
|
||||
|
||||
# Any .o files that are needed by program that use libcustcalc.a.
|
||||
# Don't put ${REQUIRED_OBJ} files in this list.
|
||||
@@ -72,7 +72,7 @@ CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c
|
||||
#
|
||||
# Put your custom .o files here.
|
||||
#
|
||||
CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o
|
||||
CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o
|
||||
|
||||
##############################################################################
|
||||
#-=-=-=-=-=-=- Defaults in case you want to build from this dir -=-=-=-=-=-=-#
|
||||
@@ -590,6 +590,11 @@ c_help.o: ../string.h
|
||||
c_help.o: ../value.h
|
||||
c_help.o: ../zmath.h
|
||||
c_help.o: c_help.c
|
||||
c_pzasusb8.o: ../custom.h
|
||||
c_pzasusb8.o: ../have_const.h
|
||||
c_pzasusb8.o: ../value.h
|
||||
c_pzasusb8.o: ../zmath.h
|
||||
c_pzasusb8.o: c_pzasusb8.c
|
||||
c_sysinfo.o: ../alloc.h
|
||||
c_sysinfo.o: ../block.h
|
||||
c_sysinfo.o: ../byteswap.h
|
||||
|
70
custom/c_pzasusb8.c
Normal file
70
custom/c_pzasusb8.c
Normal file
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Permission to use, copy, modify, and distribute this software and
|
||||
* its documentation for any purpose and without fee is hereby granted.
|
||||
*
|
||||
* Ernest Bowen, following Landon Curt Noll
|
||||
*/
|
||||
|
||||
#if defined(CUSTOM)
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "../have_const.h"
|
||||
#include "../value.h"
|
||||
#include "../custom.h"
|
||||
#include "../zmath.h"
|
||||
|
||||
/*
|
||||
* c_pzasusb8 - print numereator of real as if its array of HALFs were
|
||||
* a string of USB8s
|
||||
*
|
||||
* given:
|
||||
* count = 1;
|
||||
* vals[0] real number;
|
||||
*
|
||||
* returns:
|
||||
* null
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
VALUE
|
||||
c_pzasusb8(char *name, int count, VALUE **vals)
|
||||
{
|
||||
VALUE result; /* what we will return */
|
||||
ZVALUE z; /* numerator of the value */
|
||||
long half_cnt; /* number of HALFs in the numerator */
|
||||
USB8 *h; /* octet pointer */
|
||||
long half_len; /* length of a half in octets */
|
||||
long i;
|
||||
long j;
|
||||
|
||||
/*
|
||||
* arg check
|
||||
*/
|
||||
result.v_type = V_NULL;
|
||||
if (vals[0]->v_type != V_NUM) {
|
||||
math_error("Non-real argument for pzasusb8");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
/*
|
||||
* look at the numerator
|
||||
*/
|
||||
z = vals[0]->v_num->num;
|
||||
half_len = sizeof(HALF);
|
||||
half_cnt = z.len;
|
||||
|
||||
/*
|
||||
* print the octets
|
||||
*/
|
||||
h = (USB8 *) z.v;
|
||||
for (i=0; i < half_cnt; ++i) {
|
||||
printf("%ld:\t", i);
|
||||
for (j=0; j < half_len; ++j) {
|
||||
printf("%02x", (int)(*h++));
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif /* CUSTOM */
|
@@ -59,6 +59,7 @@ extern VALUE c_argv(char*, int, VALUE**);
|
||||
extern VALUE c_devnull(char*, int, VALUE**);
|
||||
extern VALUE c_help(char*, int, VALUE**);
|
||||
extern VALUE c_sysinfo(char*, int, VALUE**);
|
||||
extern VALUE c_pzasusb8(char*, int, VALUE**);
|
||||
|
||||
|
||||
#endif /* CUSTOM */
|
||||
@@ -108,6 +109,9 @@ CONST struct custom cust[] = {
|
||||
{ "sysinfo", "return a calc #define value",
|
||||
0, 1, c_sysinfo },
|
||||
|
||||
{ "pzasusb8", "print ZCALUE as USB8",
|
||||
0, 1, c_pzasusb8 },
|
||||
|
||||
|
||||
#endif /* CUSTOM */
|
||||
|
||||
|
50
custom/pzasusb8
Normal file
50
custom/pzasusb8
Normal file
@@ -0,0 +1,50 @@
|
||||
NAME
|
||||
pzasusb8 - print a number in hex octets
|
||||
|
||||
SYNOPSIS
|
||||
custom("pzasusb8", arg)
|
||||
|
||||
TYPES
|
||||
arg real
|
||||
|
||||
return null
|
||||
|
||||
DESCRIPTION
|
||||
This custom function prints out the numerator of a real value
|
||||
in octets. Each HALF value is printed in a separate line.
|
||||
|
||||
NOTE: The output will vary depending on the size of a HALF
|
||||
and the byte order of the system. See:
|
||||
|
||||
custom("sysinfo", "BASEB")
|
||||
custom("sysinfo", "CALC_BYTE_ORDER")
|
||||
|
||||
foe details.
|
||||
|
||||
This custom function is intented for testing of the general
|
||||
custom interface.
|
||||
|
||||
EXAMPLE
|
||||
> custom("pzasusb8", 0x01020304050607080910111213141516);
|
||||
0: 13141516
|
||||
1: 09101112
|
||||
2: 05060708
|
||||
3: 01020304
|
||||
|
||||
> custom("pzasusb8", 10^25)
|
||||
0: 4a000000
|
||||
1: 16140148
|
||||
2: 00084595
|
||||
|
||||
> printf("%x\n", 10^25);
|
||||
0x84595161401484a000000
|
||||
|
||||
LIMITS
|
||||
calc must be built with ALLOW_CUSTOM= -DCUSTOM
|
||||
calc must be executed with a -C arg.
|
||||
|
||||
LIBRARY
|
||||
none
|
||||
|
||||
SEE ALSO
|
||||
custom
|
29
custom/pzasusb8.cal
Normal file
29
custom/pzasusb8.cal
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Permission to use, copy, modify, and distribute this software and
|
||||
* its documentation for any purpose and without fee is hereby granted.
|
||||
*
|
||||
* Ernest Bowen, following Landon Curt Noll
|
||||
*/
|
||||
|
||||
print "p(n) prints array in which numerator of n is stored as a";
|
||||
print "sequence of 2-hex-digits representing unsigned characters.";
|
||||
print "h(n) printx n in hex notation. This should be the same as";
|
||||
print "p(n) except for (1) its leading 0x, (2) possible trailing zeros";
|
||||
print "in p(n), and (3) the order of the hex-digit pairs.";
|
||||
print "The following example show results for n = isqrt(2e100).";
|
||||
print "";
|
||||
|
||||
define p(n) {custom("pzasusb8", n); print;}
|
||||
define h(n) = printf("%x\n", n);
|
||||
|
||||
n = isqrt(2e100);
|
||||
print "";
|
||||
p(n);
|
||||
h(n);
|
||||
print "";
|
||||
print "BASEB: ", custom("sysinfo", "BASEB");
|
||||
print "CALC_BYTE_ORDER: ", custom("sysinfo", "CALC_BYTE_ORDER");
|
||||
print "BIG_ENDIAN: ", custom("sysinfo", "BIG_ENDIAN");
|
||||
print "LITTLE_ENDIAN: ", custom("sysinfo", "LITTLE_ENDIAN");
|
||||
print "LONG_BITS: ", custom("sysinfo", "LONG_BITS");
|
||||
print "LONGLONG_BITS: ", custom("sysinfo", "LONGLONG_BITS");
|
48
func.c
48
func.c
@@ -209,6 +209,28 @@ f_prompt(VALUE *vp)
|
||||
}
|
||||
|
||||
|
||||
static VALUE
|
||||
f_display(int count, VALUE **vals)
|
||||
{
|
||||
long oldvalue;
|
||||
VALUE res;
|
||||
|
||||
oldvalue = conf->outdigits;
|
||||
|
||||
if (count > 0) {
|
||||
if (vals[0]->v_type != V_NUM || qisfrac(vals[0]->v_num) ||
|
||||
qisneg(vals[0]->v_num) || zge31b(vals[0]->v_num->num))
|
||||
fprintf(stderr,
|
||||
"Out-of-range arg for display ignored\n");
|
||||
else
|
||||
conf->outdigits = qtoi(vals[0]->v_num);
|
||||
}
|
||||
res.v_type = V_NUM;
|
||||
res.v_num = itoq(oldvalue);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/*ARGSUSED*/
|
||||
static VALUE
|
||||
f_null(int count, VALUE **vals)
|
||||
@@ -4392,11 +4414,7 @@ f_errno(int count, VALUE **vals)
|
||||
math_error("errno argument out of range");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
newerr = z1tol(vp->v_num->num);
|
||||
if (newerr >= 32768) {
|
||||
math_error("errno argument out of range");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
newerr = (int) ztoi(vp->v_num->num);
|
||||
}
|
||||
olderr = set_errno(newerr);
|
||||
|
||||
@@ -4423,7 +4441,7 @@ f_errcount(int count, VALUE **vals)
|
||||
math_error("errcount argument out of range");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
newcount = z1tol(vp->v_num->num);
|
||||
newcount = (int) ztoi(vp->v_num->num);
|
||||
}
|
||||
oldcount = set_errcount(newcount);
|
||||
|
||||
@@ -4436,23 +4454,21 @@ f_errcount(int count, VALUE **vals)
|
||||
static VALUE
|
||||
f_errmax(int count, VALUE **vals)
|
||||
{
|
||||
int newmax, oldmax;
|
||||
int oldmax;
|
||||
VALUE *vp;
|
||||
VALUE result;
|
||||
|
||||
newmax = -1;
|
||||
oldmax = errmax;
|
||||
if (count > 0) {
|
||||
vp = vals[0];
|
||||
|
||||
/* arg must be an integer */
|
||||
if (vp->v_type != V_NUM || qisfrac(vp->v_num) ||
|
||||
qisneg(vp->v_num) || zge31b(vp->v_num->num)) {
|
||||
math_error("errcount argument out of range");
|
||||
/*NOTREACHED*/
|
||||
zge31b(vp->v_num->num))
|
||||
fprintf(stderr,
|
||||
"Out-of-range arg for errmax ignored\n");
|
||||
else
|
||||
errmax = (int) ztoi(vp->v_num->num);
|
||||
}
|
||||
newmax = z1tol(vp->v_num->num);
|
||||
}
|
||||
oldmax = set_errmax(newmax);
|
||||
|
||||
result.v_type = V_NUM;
|
||||
result.v_num = itoq((long) oldmax);
|
||||
@@ -6806,6 +6822,8 @@ static CONST struct builtin builtins[] = {
|
||||
"digit at specified decimal place of number"},
|
||||
{"digits", 1, 1, 0, OP_NOP, f_digits, 0,
|
||||
"number of digits in number"},
|
||||
{"display", 0, 1, 0, OP_NOP, 0, f_display,
|
||||
"number of decimal digits for displaying numbers"},
|
||||
{"dp", 2, 2, 0, OP_NOP, 0, f_dp,
|
||||
"dot product of two vectors"},
|
||||
{"epsilon", 0, 1, 0, OP_SETEPSILON, 0, 0,
|
||||
|
49
hash.c
49
hash.c
@@ -391,8 +391,8 @@ hash_zvalue(int type, ZVALUE zval, HASH *state)
|
||||
*/
|
||||
if (zval.len > full_lim) {
|
||||
for (j=0; j < zval.len-full_lim-1; j += 2) {
|
||||
half[j] = zval.v[full_lim+i+1];
|
||||
half[j+1] = zval.v[full_lim+i];
|
||||
half[j] = zval.v[full_lim+j+1];
|
||||
half[j+1] = zval.v[full_lim+j];
|
||||
}
|
||||
if (j < zval.len-full_lim) {
|
||||
half[j] = (HALF)0;
|
||||
@@ -562,7 +562,7 @@ hash_complex(int type, void *c, HASH *state)
|
||||
|
||||
|
||||
/*
|
||||
* hash_str - hash a string
|
||||
* hash_str - hash a null-terminated string
|
||||
*
|
||||
* given:
|
||||
* type - hash type (see hash.h)
|
||||
@@ -606,6 +606,47 @@ hash_str(int type, char *str, HASH *state)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* hash_STR - hash a STRING
|
||||
*
|
||||
* given:
|
||||
* type - hash type (see hash.h)
|
||||
* str - the STRING
|
||||
* state - the state to hash or NULL
|
||||
*
|
||||
* returns:
|
||||
* the new state
|
||||
*/
|
||||
HASH *
|
||||
hash_STR(int type, STRING *str, HASH *state)
|
||||
{
|
||||
/*
|
||||
* initialize if state is NULL
|
||||
*/
|
||||
if (state == NULL) {
|
||||
state = hash_init(type, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* setup for the string hash
|
||||
*/
|
||||
if (!state->bytes) {
|
||||
(state->chkpt)(state);
|
||||
state->bytes = TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* hash the string
|
||||
*/
|
||||
(state->update)(state, (USB8*) str->s_str, (USB32) str->s_len);
|
||||
|
||||
/*
|
||||
* all done
|
||||
*/
|
||||
return state;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* hash_usb8 - hash an array of USB8s
|
||||
*
|
||||
@@ -720,7 +761,7 @@ hash_value(int type, void *v, HASH *state)
|
||||
/* strings have no setup */
|
||||
|
||||
/* hash this type */
|
||||
state = hash_str(type, value->v_str->s_str, state);
|
||||
state = hash_STR(type, value->v_str, state);
|
||||
break;
|
||||
|
||||
case V_MAT:
|
||||
|
@@ -8,7 +8,7 @@ Environment variables
|
||||
If this variable does not exist, a compiled value
|
||||
is used. Typically compiled in value is:
|
||||
|
||||
.:./lib:~/lib:${LIBDIR}/calc
|
||||
.:./lib:~/lib:${LIBDIR}/calc:${LIBDIR}/custom
|
||||
|
||||
where ${LIBDIR} is usually:
|
||||
|
||||
|
@@ -44,7 +44,7 @@
|
||||
|
||||
for and overview of the help system. The command:
|
||||
|
||||
help builtins
|
||||
help builtin
|
||||
|
||||
provides information on built-in mathematical functions, whereas:
|
||||
|
||||
@@ -67,6 +67,10 @@
|
||||
It contains information about differences between C and calc
|
||||
that may surprize you.
|
||||
|
||||
To learn about calc library files that are shipped with calc, try:
|
||||
|
||||
help stdlib
|
||||
|
||||
A full and extensive overview of calc may be obtained by:
|
||||
|
||||
help full
|
||||
|
@@ -44,7 +44,7 @@ CALC_FILES= README bigprime.cal deg.cal ellip.cal lucas.cal lucas_chk.cal \
|
||||
test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \
|
||||
test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \
|
||||
beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \
|
||||
randomrun.cal xx_print.cal natnumset.cal
|
||||
randomrun.cal xx_print.cal natnumset.cal qtime.cal
|
||||
|
||||
# These files are found (but not built) in the distribution
|
||||
#
|
||||
|
102
lib/README
102
lib/README
@@ -1,20 +1,44 @@
|
||||
# Copyright (c) 1997 David I. Bell and Landon Curt Noll
|
||||
# Permission is granted to use, distribute, or modify this source,
|
||||
# provided that this copyright notice remains intact.
|
||||
To load a library, try:
|
||||
|
||||
The following calc library files are provided because they serve as
|
||||
examples of how use the calc language, and/or because the authors thought
|
||||
them to be useful!
|
||||
read filename
|
||||
|
||||
You to not need to add the .cal extension to the filename. Calc
|
||||
will search along the $CALCPATH (see ``help environment'').
|
||||
|
||||
Normally a library will simply define some functions. By default,
|
||||
most libraries will print out a short message when thei are read.
|
||||
For example:
|
||||
|
||||
> read lucas
|
||||
lucas(h,n) defined
|
||||
gen_u0(h,n,v1) defined
|
||||
gen_v1(h,n) defined
|
||||
ldebug(funct,str) defined
|
||||
|
||||
will cause calc to load and execute the 'lucas.cal' library.
|
||||
Executing the library will cause several functions to be defined.
|
||||
Executing the lucas function
|
||||
|
||||
> lucas(149,60)
|
||||
1
|
||||
> lucas(146,61)
|
||||
0
|
||||
|
||||
shows that 149*2^60-1 is prime whereas 146*2^61-1 is not.
|
||||
|
||||
=-=
|
||||
|
||||
Calc library files are provided because they serve as examples of how use
|
||||
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:
|
||||
|
||||
dbell@auug.org.au
|
||||
chongo@toad.com {uunet,pyramid,sun}!hoptoad!chongo
|
||||
calc-tester@postofc.corp.sgi.com
|
||||
|
||||
By convention, a lib file only defines and/or initializes functions,
|
||||
objects and variables. (The regression test is an exception.) Also by
|
||||
convention, the a usage message regarding each important object and
|
||||
function is printed at the time of the read.
|
||||
objects and variables. (The regress.cal and testxxx.cal regression test
|
||||
suite is an exception.) Also by convention, an additional usage message
|
||||
regarding important object and functions is printed.
|
||||
|
||||
If a lib file needs to load another lib file, it should use the -once
|
||||
version of read:
|
||||
@@ -45,18 +69,29 @@ global variable. By convention, "lib_debug" has the following meanings:
|
||||
printed at the time of the read in addition
|
||||
to other debug messages
|
||||
|
||||
To conform to the above convention, your lib files should end with
|
||||
lines of the form:
|
||||
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
|
||||
* functions with optional args
|
||||
* functions with optional args where the param() interface is used
|
||||
|
||||
For these cases we suggest that you place at the bottom of your code
|
||||
something like:
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "obj xyz defined";
|
||||
print "funcA(side_a, side_b, side_c) defined";
|
||||
print "funcB(size, mass) defined";
|
||||
print "funcA([val1 [, val2]]) defined";
|
||||
print "funcB(size, mass, ...) defined";
|
||||
}
|
||||
|
||||
|
||||
=-=
|
||||
|
||||
The following is a brief description of some of the calc library files
|
||||
that are shipped with calc. See above for example of how to read in
|
||||
and execute these files.
|
||||
|
||||
beer.cal
|
||||
|
||||
Calc's contribution to the 99 Bottles of Beer web page:
|
||||
@@ -100,7 +135,7 @@ deg.cal
|
||||
|
||||
ellip.cal
|
||||
|
||||
factor(iN, ia, B, force)
|
||||
efactor(iN, ia, B, force)
|
||||
|
||||
Attempt to factor using the elliptic functions: y^2 = x^3 + a*x + b.
|
||||
|
||||
@@ -160,7 +195,7 @@ mfactor.cal
|
||||
|
||||
mod.cal
|
||||
|
||||
mod(a)
|
||||
lmod(a)
|
||||
mod_print(a)
|
||||
mod_one()
|
||||
mod_cmp(a, b)
|
||||
@@ -250,7 +285,7 @@ pix.cal
|
||||
|
||||
pollard.cal
|
||||
|
||||
factor(N, N, ai, af)
|
||||
pfactor(N, N, ai, af)
|
||||
|
||||
Factor using Pollard's p-1 method.
|
||||
|
||||
@@ -276,6 +311,13 @@ psqrt.cal
|
||||
Calculate square roots modulo a prime
|
||||
|
||||
|
||||
qtime.cal
|
||||
|
||||
qtime(utc_hr_offset)
|
||||
|
||||
Print the time as English sentence given the hours offset from UTC.
|
||||
|
||||
|
||||
quat.cal
|
||||
|
||||
quat(a, b, c, d)
|
||||
@@ -520,6 +562,20 @@ test3400.cal
|
||||
This script is used by regress.cal to test trig functions.
|
||||
containing objects.
|
||||
|
||||
test3500.cal
|
||||
|
||||
global defaultverbose
|
||||
global err
|
||||
testfrem(x, y, verbose)
|
||||
testgcdrem(x, y, verbose)
|
||||
testf(str, n, verbose)
|
||||
testg(str, n, verbose)
|
||||
testh(str, n, N, verbose)
|
||||
test3500(verbose, n, N)
|
||||
|
||||
This script is used by regress.cal to test the functions frem,
|
||||
fcnt, gcdrem.
|
||||
|
||||
test4000.cal
|
||||
|
||||
global defaultverbose
|
||||
@@ -617,7 +673,7 @@ varargs.cal
|
||||
|
||||
xx_print.cal
|
||||
|
||||
isoctet(a) defined
|
||||
is_octet(a) defined
|
||||
list_print(a) defined
|
||||
mat_print (a) defined
|
||||
octet_print(a) defined
|
||||
@@ -628,3 +684,9 @@ xx_print.cal
|
||||
error_print(a) defined
|
||||
|
||||
Demo for the xx_print object routines.
|
||||
|
||||
=-=
|
||||
|
||||
# Copyright (c) 1999 David I. Bell and Landon Curt Noll
|
||||
# Permission is granted to use, distribute, or modify this source,
|
||||
# provided that this copyright notice remains intact.
|
||||
|
@@ -20,7 +20,3 @@ for (i=99; i > 0;) {
|
||||
bottles = (i!=1) ? "bottles" : "bottle";
|
||||
print less, bottles, "of beer on the wall!\n";
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
/* nothing to do! */
|
||||
}
|
||||
|
@@ -60,7 +60,3 @@ define B(n)
|
||||
Bnmax = n;
|
||||
return Bn[n];
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "B(n) defined";
|
||||
}
|
||||
|
@@ -25,7 +25,3 @@ define bigprime(a, m, p)
|
||||
print " " : n;
|
||||
}
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "bigprime(a, m, p) defined";
|
||||
}
|
||||
|
@@ -113,11 +113,4 @@ define fixdms(a)
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "obj dms {deg, min, sec} defined";
|
||||
print "dms(deg, min, sec) defined";
|
||||
print "dms_add(a, b) defined";
|
||||
print "dms_neg(a) defined";
|
||||
print "dms_sub(a, b) defined";
|
||||
print "dms_mul(a, b) defined";
|
||||
print "dms_print(a) defined";
|
||||
print "dms_abs(a) defined";
|
||||
}
|
||||
|
@@ -24,7 +24,7 @@
|
||||
* only an approximation, read "A Course in Number Theory and Cryptography"
|
||||
* by Neal Koblitz for a good explanation.
|
||||
*
|
||||
* factor(iN, ia, B, force)
|
||||
* efactor(iN, ia, B, force)
|
||||
* iN is the number to be factored.
|
||||
* ia is the initial value of a in the equation, and each successive
|
||||
* value of a is an independent attempt at factoring (default 1).
|
||||
@@ -66,7 +66,7 @@ global b; /* second coefficient */
|
||||
global f; /* found factor */
|
||||
|
||||
|
||||
define factor(iN, ia, B, force)
|
||||
define efactor(iN, ia, B, force)
|
||||
{
|
||||
local C, x, p;
|
||||
|
||||
@@ -165,7 +165,3 @@ define point_pow(p, pow)
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "factor(N, I, B, force) defined";
|
||||
}
|
||||
|
@@ -6,7 +6,3 @@
|
||||
*/
|
||||
|
||||
while(1) print "Hello World!";
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
/* nothing to do */
|
||||
}
|
||||
|
@@ -1029,7 +1029,3 @@ ldebug(funct, str)
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "lucas(h, n) defined";
|
||||
}
|
||||
|
@@ -374,7 +374,3 @@ lucas_chk(high_n, quiet)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "lucas_chk(high_n) defined";
|
||||
}
|
||||
|
@@ -31,7 +31,3 @@ define mersenne(p)
|
||||
/* 2^p-1 is prime iff u(p) = 0 mod 2^p-1 */
|
||||
return (u == 0);
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "mersenne(p) defined";
|
||||
}
|
||||
|
28
lib/mod.cal
28
lib/mod.cal
@@ -12,12 +12,12 @@ obj mod {a}; /* definition of the object */
|
||||
global mod_value = 100; /* modulus value (value of N) */
|
||||
|
||||
|
||||
define mod(a)
|
||||
define lmod(a)
|
||||
{
|
||||
local obj mod x;
|
||||
|
||||
if (!isreal(a) || !isint(a))
|
||||
quit "Bad argument for mod function";
|
||||
quit "Bad argument for lmod function";
|
||||
x.a = a % mod_value;
|
||||
return x;
|
||||
}
|
||||
@@ -34,7 +34,7 @@ define mod_print(a)
|
||||
|
||||
define mod_one()
|
||||
{
|
||||
return mod(1);
|
||||
return lmod(1);
|
||||
}
|
||||
|
||||
|
||||
@@ -51,9 +51,9 @@ define mod_cmp(a, b)
|
||||
define mod_rel(a, b)
|
||||
{
|
||||
if (isnum(a))
|
||||
a = mod(a);
|
||||
a = lmod(a);
|
||||
if (isnum(b))
|
||||
b = mod(b);
|
||||
b = lmod(b);
|
||||
if (a.a < b.a)
|
||||
return -1;
|
||||
return a.a != b.a;
|
||||
@@ -163,9 +163,9 @@ define mod_div(a, b)
|
||||
|
||||
obj mod x, y;
|
||||
if (isnum(a))
|
||||
a = mod(a);
|
||||
a = lmod(a);
|
||||
if (isnum(b))
|
||||
b = mod(b);
|
||||
b = lmod(b);
|
||||
c = gcd(a.a, b.a);
|
||||
x.a = a.a / c;
|
||||
y.a = b.a / c;
|
||||
@@ -191,20 +191,6 @@ define mod_pow(a, b)
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "obj mod {a} defined";
|
||||
print "mod(a) defined";
|
||||
print "mod_print(a) defined";
|
||||
print "mod_one(a) defined";
|
||||
print "mod_cmp(a, b) defined";
|
||||
print "mod_rel(a, b) defined";
|
||||
print "mod_add(a, b) defined";
|
||||
print "mod_sub(a, b) defined";
|
||||
print "mod_mod(a, b) defined";
|
||||
print "mod_square(a) defined";
|
||||
print "mod_inc(a) defined";
|
||||
print "mod_dec(a) defined";
|
||||
print "mod_inv(a) defined";
|
||||
print "mod_div(a, b) defined";
|
||||
print "mod_pow(a, b) defined";
|
||||
print "mod_value defined";
|
||||
print "set mod_value as needed";
|
||||
}
|
||||
|
@@ -592,41 +592,3 @@ define set_print(a)
|
||||
}
|
||||
|
||||
local N, M; /* End scope of static variables N, M */
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "isset(a) defined";
|
||||
print "setbound(n) defined";
|
||||
print "empty() defined";
|
||||
print "full() defined";
|
||||
print "isin(a, b) defined";
|
||||
print "addmember(a, n) defined";
|
||||
print "rmmember(a, n) defined";
|
||||
print "set() defined";
|
||||
print "mkset(s) defined";
|
||||
print "primes(a, b) defined";
|
||||
print "set_max(a) defined";
|
||||
print "set_min(a) defined";
|
||||
print "set_not(a) defined";
|
||||
print "set_cmp(a, b) defined";
|
||||
print "set_rel(a, b) defined";
|
||||
print "set_or(a, b) defined";
|
||||
print "set_and(a, b) defined";
|
||||
print "set_comp(a) defined";
|
||||
print "set_setminus(a, b) defined";
|
||||
print "set_xor(a,b) defined";
|
||||
print "set_content(a) defined";
|
||||
print "set_add(a, b) defined";
|
||||
print "set_sub(a, b) defined";
|
||||
print "set_mul(a, b) defined";
|
||||
print "set_square(a) defined";
|
||||
print "set_pow(a, n) defined";
|
||||
print "set_sum(a) defined";
|
||||
print "set_plus(a) defined";
|
||||
print "interval(a, b) defined";
|
||||
print "isinterval(a) defined";
|
||||
print "set_mod(a, b) defined";
|
||||
print "randset(n, a, b) defined";
|
||||
print "polyvals(L, A) defined";
|
||||
print "polyvals2(L, A, B) defined";
|
||||
print "set_print(a) defined";
|
||||
}
|
||||
|
@@ -66,8 +66,3 @@ define pellx(D)
|
||||
}
|
||||
return Q1;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "pell(D) defined";
|
||||
print "pellx(D) defined";
|
||||
}
|
||||
|
@@ -47,7 +47,3 @@ define qpi(epsilon)
|
||||
}
|
||||
return (bround(1/an, bits));
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "qpi(epsilon) defined";
|
||||
}
|
||||
|
@@ -38,7 +38,3 @@ define pi_of_x(x)
|
||||
}
|
||||
return primes;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "pi_of_x(x) defined";
|
||||
}
|
||||
|
@@ -6,7 +6,7 @@
|
||||
* Factor using Pollard's p-1 method.
|
||||
*/
|
||||
|
||||
define factor(N, B, ai, af)
|
||||
define pfactor(N, B, ai, af)
|
||||
{
|
||||
local a, k, i, d;
|
||||
|
||||
@@ -28,7 +28,3 @@ define factor(N, B, ai, af)
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "factor(N, B, ai, af) defined";
|
||||
}
|
||||
|
35
lib/poly.cal
35
lib/poly.cal
@@ -689,39 +689,4 @@ c=pol(1+2i,3+4i,5+6i);
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "obj poly {p} defined";
|
||||
print "pol() defined";
|
||||
print "poly_print(a) defined";
|
||||
print "poly_add(a, b) defined";
|
||||
print "poly_sub(a, b) defined";
|
||||
print "poly_mul(a, b) defined";
|
||||
print "poly_div(a, b) defined";
|
||||
print "poly_quo(a,b) defined";
|
||||
print "poly_mod(a,b) defined";
|
||||
print "poly_neg(a) defined";
|
||||
print "poly_conj(a) defined";
|
||||
print "poly_cmp(a,b) defined";
|
||||
print "iszero(a) defined";
|
||||
print "plist(a) defined";
|
||||
print "listmul(a,b) defined";
|
||||
print "ev(a,t) defined";
|
||||
print "evp(s,t) defined";
|
||||
print "ispoly(a) defined";
|
||||
print "isstring(a) defined";
|
||||
print "var(name) defined";
|
||||
print "pcoeff(a) defined";
|
||||
print "pterm(a,n) defined";
|
||||
print "deg(a) defined";
|
||||
print "polydiv(a,b) defined";
|
||||
print "D(a,n) defined";
|
||||
print "Dp(a,n) defined";
|
||||
print "pgcd(a,b) defined";
|
||||
print "plcm(a,b) defined";
|
||||
print "monic(a) defined";
|
||||
print "pfgcd(a,b) defined";
|
||||
print "interp(X,Y,x) defined";
|
||||
print "makediffs(X,Y) defined";
|
||||
print "evalfd(T,x) defined";
|
||||
print "mdet(A) defined";
|
||||
print "M(A,n,I,J) defined";
|
||||
print "mprint(A) defined";
|
||||
}
|
||||
|
@@ -94,8 +94,3 @@ define showvalues(str) {
|
||||
print "\t":eval(str);
|
||||
}
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "adder() defined";
|
||||
print "showvalues(str) defined";
|
||||
}
|
||||
|
@@ -48,8 +48,3 @@ define psqrt(u, p)
|
||||
}
|
||||
return min(v, p - v);
|
||||
}
|
||||
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "psqrt(u, p) defined";
|
||||
}
|
||||
|
60
lib/qtime.cal
Normal file
60
lib/qtime.cal
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* qtime - Display time as English sentence
|
||||
*
|
||||
* usage:
|
||||
* qtime(utc_hr_offset)
|
||||
*
|
||||
* utc_hr_offset Offset from UTC in hours.
|
||||
*
|
||||
* Written by: Klaus Alexander Seistrup <kseis@magnetic-ink.dk>
|
||||
* With minor mods by: Landon Curt Noll <chongo@toad.com>
|
||||
*
|
||||
* See:
|
||||
* http://www.magnetic-ink.dk/download/qtime.html
|
||||
*
|
||||
* for examples of qtime() written on other languages.
|
||||
*/
|
||||
|
||||
/*
|
||||
* qtime - Display time as English sentence
|
||||
*/
|
||||
define qtime(utc_hr_offset)
|
||||
{
|
||||
static mat hr[12] = {
|
||||
"twelve", "one", "two", "three", "four", "five",
|
||||
"six", "seven", "eight", "nine", "ten", "eleven"
|
||||
};
|
||||
static mat mn[7] = {
|
||||
"", "five ", "ten ", "a quarter ", "twenty ", "twenty-five ", "half "
|
||||
};
|
||||
static mat ny[5] = {
|
||||
"nearly ", "almost ", "", "just after ", "after "
|
||||
};
|
||||
static mat up[3] = {
|
||||
"to ", "", "past "
|
||||
};
|
||||
local adj_mins = (((time() + utc_hr_offset*3600) % 86400) + 30) // 60 + 27;
|
||||
local hours = (adj_mins // 60) % 12;
|
||||
local minutes = adj_mins % 60;
|
||||
local almost = minutes % 5;
|
||||
local divisions = (minutes // 5) - 5;
|
||||
local to_past_idx = divisions > 0 ? 1 : 0;
|
||||
|
||||
if (divisions < 0) {
|
||||
divisions = -divisions;
|
||||
to_past_idx = -1;
|
||||
}
|
||||
++to_past_idx;
|
||||
|
||||
/*
|
||||
* Print the English sentence
|
||||
*
|
||||
* We avoid forward and back quotes just to show that the char()
|
||||
* builtin function can be used in conjunction with a printf.
|
||||
*/
|
||||
printf("It%cs %s%s%s%s",
|
||||
char(0x27), ny[almost], mn[divisions], up[to_past_idx], hr[hours]);
|
||||
if (divisions == 0)
|
||||
printf(" o%cclock", char(0x27));
|
||||
printf (".\n");
|
||||
}
|
15
lib/quat.cal
15
lib/quat.cal
@@ -197,19 +197,4 @@ define quat_shift(a, b)
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "obj quat {s, v} defined";
|
||||
print "quat(a, b, c, d) defined";
|
||||
print "quat_print(a) defined";
|
||||
print "quat_norm(a) defined";
|
||||
print "quat_abs(a, e) defined";
|
||||
print "quat_conj(a) defined";
|
||||
print "quat_add(a, e) defined";
|
||||
print "quat_sub(a, e) defined";
|
||||
print "quat_inc(a) defined";
|
||||
print "quat_dec(a) defined";
|
||||
print "quat_neg(a) defined";
|
||||
print "quat_mul(a, b) defined";
|
||||
print "quat_div(a, b) defined";
|
||||
print "quat_inv(a) defined";
|
||||
print "quat_scale(a, b) defined";
|
||||
print "quat_shift(a, b) defined";
|
||||
}
|
||||
|
@@ -112,7 +112,3 @@ define randbitrun(run_cnt)
|
||||
printf("length>%d\t\t\t\t\tcount=%d\n", MAX_RUN, long_run_cnt);
|
||||
printf("max length=%d\n", max_run);
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "randbitrun([run_length]) defined";
|
||||
}
|
||||
|
@@ -129,7 +129,3 @@ randmprime(bits, seed, dbg)
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "randmprime(bits, seed [,dbg]) defined";
|
||||
}
|
||||
|
@@ -112,7 +112,3 @@ define randombitrun(run_cnt)
|
||||
printf("length>%d\t\t\t\t\tcount=%d\n", MAX_RUN, long_run_cnt);
|
||||
printf("max length=%d\n", max_run);
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "randombitrun([run_length]) defined";
|
||||
}
|
||||
|
@@ -121,7 +121,3 @@ define randomrun(run_cnt)
|
||||
printf("length>%d\t\t\t\t\tcount=%d\n", MAX_RUN, long_run_cnt);
|
||||
printf("max length=%d\n", max_run);
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "randomrun([run_length]) defined";
|
||||
}
|
||||
|
@@ -22,13 +22,13 @@ prob = 0; /* clear problem counter */
|
||||
|
||||
global junk; /* throw away value */
|
||||
junk = errcount(0); /* clear error count */
|
||||
junk = errmax(0x7fffffff); /* set maximum error very high */
|
||||
junk = errmax(-1); /* prevent errcount from abouting */
|
||||
|
||||
global ecnt; /* expected value of errcount() */
|
||||
ecnt = 0; /* clear expected errcount() value */
|
||||
|
||||
initcfg = config("all", "oldstd"); /* set config to startup default */
|
||||
initcfg = config("lib_debug", -1); /* disable lib startup messages */
|
||||
initcfg = config("lib_debug", -4); /* disable lib startup messages */
|
||||
initcfg = config("calc_debug", 1); /* enable more internal debugging */
|
||||
initcfg = config("all"); /* save state for later use */
|
||||
|
||||
@@ -7010,7 +7010,7 @@ define test_bigcomb()
|
||||
{
|
||||
local a, b, n, i, v1, v2;
|
||||
|
||||
print '7900: Starting test_bigcomb()';
|
||||
print '7900: Starting test_bigcomb';
|
||||
a = 1234/4321;
|
||||
print '7901: a = 1234/4321';
|
||||
b = 3456/6543;
|
||||
@@ -7033,7 +7033,7 @@ define test_bigcomb()
|
||||
vrfy(f7900(-7/4,33/4,-2) == g7900(-7/4,33/4,-2),
|
||||
'7913: f7900(-7/4,33/4,-2) == g7900(-7/4,33/4,-2)');
|
||||
|
||||
print '7914: Ending test_bigcomb()';
|
||||
print '7914: Ending test_bigcomb';
|
||||
}
|
||||
print '186: parsed test_bigcomb()';
|
||||
|
||||
@@ -7048,7 +7048,7 @@ define test_natnumset()
|
||||
{
|
||||
local A, B, C, D, P, P1, L1, L2;
|
||||
|
||||
print '8000: Starting test_natnumset()';
|
||||
print '8000: Starting test_natnumset';
|
||||
|
||||
A = set(17, 2, 0, 24, 2);
|
||||
print '8101: A = set(17, 2, 0, 24, 2);';
|
||||
@@ -7105,7 +7105,7 @@ define test_natnumset()
|
||||
vrfy(polyvals2(L2,C,D) == set(12,16,21,27,45,55,77,91),
|
||||
'8135: polyvals(L2,C,D) == set(12,16,21,27,45,55,77,91)');
|
||||
|
||||
print '8136: Ending test_natnumset()';
|
||||
print '8136: Ending test_natnumset';
|
||||
}
|
||||
print '188: parsed test_natnumset()';
|
||||
|
||||
@@ -7115,7 +7115,7 @@ print '188: parsed test_natnumset()';
|
||||
*/
|
||||
define test_somenew()
|
||||
{
|
||||
print '8200: Starting test_somenew()';
|
||||
print '8200: Starting test_somenew';
|
||||
|
||||
vrfy(char(-1) == char(255), '8201: char(-1) == char(255)');
|
||||
vrfy(char(258) == char(2), '8202: char(258) == char(2)');
|
||||
@@ -7139,7 +7139,7 @@ define test_somenew()
|
||||
vrfy(1/(1/0) == 0, '8215: 1/(1/0) == 0');
|
||||
vrfy(inverse(1/0) == 0, '8216: inverse(1/0) == 0');
|
||||
|
||||
print '8217: Ending test_somenew()';
|
||||
print '8217: Ending test_somenew';
|
||||
}
|
||||
print '189: parsed test_somenew()';
|
||||
|
||||
@@ -7392,6 +7392,87 @@ return test_natnumset();
|
||||
print;
|
||||
return test_somenew();
|
||||
|
||||
|
||||
/*
|
||||
* read various calc libs
|
||||
*
|
||||
* We read most of the calc libs shipped with the distribution.
|
||||
* There are a few lib files that are not read:
|
||||
*
|
||||
* beer.cal - prints a bunch of things when loaded
|
||||
* hello.cal - designed to go into an infinite loop
|
||||
* lucal.cal - already read by this file
|
||||
* lucas_chk.cal - already read by this file
|
||||
* lucas_tbl.cal - duplicatres code already read by another file
|
||||
* regress.cal - this file
|
||||
* surd.cal - already read by this file
|
||||
* testXXXX.cal - already read by this file
|
||||
* 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
|
||||
* all of real actions of regress.cal.
|
||||
*/
|
||||
print;
|
||||
print '9800: Starting read of selected calc libs';
|
||||
read -once bernoulli;
|
||||
print '9801: read -once bernoulli';
|
||||
read -once bigprime;
|
||||
print '9802: read -once bigprime';
|
||||
read -once chrem;
|
||||
print '9803: read -once chrem';
|
||||
read -once deg;
|
||||
print '9804: read -once deg';
|
||||
read -once ellip;
|
||||
print '9805: read -once ellip';
|
||||
read -once mersenne;
|
||||
print '9806: read -once mersenne';
|
||||
read -once mfactor;
|
||||
print '9807: read -once mfactor';
|
||||
read -once mod;
|
||||
print '9808: read -once mod';
|
||||
read -once natnumset;
|
||||
print '9809: read -once natnumset';
|
||||
read -once pell;
|
||||
print '9810: read -once pell';
|
||||
read -once pi;
|
||||
print '9811: read -once pi';
|
||||
read -once pix;
|
||||
print '9812: read -once pix';
|
||||
read -once pollard;
|
||||
print '9813: read -once pollard';
|
||||
read -once poly;
|
||||
print '9814: read -once poly';
|
||||
read -once prompt;
|
||||
print '9815: read -once prompt';
|
||||
read -once psqrt;
|
||||
print '9816: read -once psqrt';
|
||||
read -once quat;
|
||||
print '9817: read -once quat';
|
||||
read -once randbitrun;
|
||||
print '9818: read -once randbitrun';
|
||||
read -once randmprime;
|
||||
print '9819: read -once randmprime';
|
||||
read -once randombitrun;
|
||||
print '9820: read -once randombitrun';
|
||||
read -once randomrun;
|
||||
print '9821: read -once randomrun';
|
||||
read -once randrun;
|
||||
print '9822: read -once randrun';
|
||||
read -once seedrandom;
|
||||
print '9823: read -once seedrandom';
|
||||
read -once solve;
|
||||
print '9824: read -once solve';
|
||||
read -once sumsq;
|
||||
print '9825: read -once sumsq';
|
||||
read -once unitfrac;
|
||||
print '9826: read -once unitfrac';
|
||||
read -once varargs;
|
||||
print '9827: read -once varargs';
|
||||
read -once qtime;
|
||||
print '9828: read -once qtime';
|
||||
print '9829: Ending read of selected calc libs';
|
||||
|
||||
|
||||
/*
|
||||
* cleanup and report the results
|
||||
*/
|
||||
|
@@ -41,7 +41,3 @@ define solve(low, high, epsilon)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "solve(low, high, epsilon) defined";
|
||||
}
|
||||
|
@@ -37,7 +37,3 @@ define ss(p)
|
||||
}
|
||||
print a : "^2 +" , b : "^2 =" , a^2 + b^2;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "ss(p) defined";
|
||||
}
|
||||
|
19
lib/surd.cal
19
lib/surd.cal
@@ -263,25 +263,6 @@ define surd_rel(a, b)
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "obj surd {a, b} defined";
|
||||
print "surd(a, b) defined";
|
||||
print "surd_print(a) defined";
|
||||
print "surd_conj(a) defined";
|
||||
print "surd_norm(a) defined";
|
||||
print "surd_value(a, xepsilon) defined";
|
||||
print "surd_add(a, b) defined";
|
||||
print "surd_sub(a, b) defined";
|
||||
print "surd_inc(a) defined";
|
||||
print "surd_dec(a) defined";
|
||||
print "surd_neg(a) defined";
|
||||
print "surd_mul(a, b) defined";
|
||||
print "surd_square(a) defined";
|
||||
print "surd_scale(a, b) defined";
|
||||
print "surd_shift(a, b) defined";
|
||||
print "surd_div(a, b) defined";
|
||||
print "surd_inv(a) defined";
|
||||
print "surd_sgn(a) defined";
|
||||
print "surd_cmp(a, b) defined";
|
||||
print "surd_rel(a, b) defined";
|
||||
print "surd_type defined";
|
||||
print "set surd_type as needed";
|
||||
}
|
||||
|
@@ -10,7 +10,3 @@
|
||||
*/
|
||||
|
||||
++value;
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
/* nothing to do */
|
||||
}
|
||||
|
@@ -95,7 +95,3 @@ define ckmat()
|
||||
/* args match the matrix in the object */
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
/* nothing to do */
|
||||
}
|
||||
|
@@ -491,25 +491,3 @@ define test2600(verbose, tnum)
|
||||
}
|
||||
return tnum;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "global defaultverbose defined";
|
||||
print "global err defined";
|
||||
print "testismult(str,n,verbose) defined";
|
||||
print "testsqrt(str,n,eps,verbose) defined";
|
||||
print "testexp(str,n,eps,verbose) defined";
|
||||
print "testln(str,n,eps,verbose) defined";
|
||||
print "testpower(str,n,b,eps,verbose) defined";
|
||||
print "testgcd(str,n,verbose) defined";
|
||||
print "cpow(x,n,eps) defined";
|
||||
print "cexp(x,eps) defined";
|
||||
print "cln(x,eps) defined";
|
||||
print "mkreal() defined";
|
||||
print "mkcomplex() defined";
|
||||
print "mkbigreal() defined";
|
||||
print "mksmallreal() defined";
|
||||
print "testappr(str,n,verbose) defined";
|
||||
print "checkappr(x,y,z,verbose) defined";
|
||||
print "checkresult(x,y,z,a) defined";
|
||||
print "test2600(verbose,tnum) defined";
|
||||
}
|
||||
|
@@ -308,23 +308,3 @@ define test2700(verbose, tnum)
|
||||
}
|
||||
return tnum;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "global defaultverbose defined";
|
||||
print "global err defined";
|
||||
print "mknonnegreal() defined";
|
||||
print "mkposreal() defined";
|
||||
print "mkreal_2700() defined";
|
||||
print "mknonzeroreal() defined";
|
||||
print "mkposfrac() defined";
|
||||
print "mkfrac() defined";
|
||||
print "mksquarereal() defined";
|
||||
print "mknonsquarereal() defined";
|
||||
print "mkcomplex_2700() defined";
|
||||
print "testcsqrt(str,n,verbose) defined";
|
||||
print "checksqrt(x,y,z,v) defined";
|
||||
print "checkavrem(A,B,X,eps) defined";
|
||||
print "checkrounding(s,n,t,u,z) defined";
|
||||
print "iscomsq(x) defined";
|
||||
print "test2700(verbose,tnum) defined";
|
||||
}
|
||||
|
@@ -17,14 +17,3 @@ define res_mul(a,b) {local obj res v = {(a.r * b.r) % md}; return v;};
|
||||
define res_neg(a) {local obj res v = {(-a.r) % md}; return v;};
|
||||
define res_inv(a) {local obj res v = {minv(a.r, md)}; return v;};
|
||||
define res(x) {local obj res v = {x % md}; return v;};
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "obj res defined";
|
||||
print "global md defined";
|
||||
print "res_test(a) defined";
|
||||
print "res_sub(a, b) defined";
|
||||
print "res_mul(a, b) defined";
|
||||
print "res_neg(a) defined";
|
||||
print "res_inv(a) defined";
|
||||
print "res(x) defined";
|
||||
}
|
||||
|
@@ -122,11 +122,3 @@ define test3300(verbose, tnum)
|
||||
}
|
||||
return tnum;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "global defaultverbose defined";
|
||||
print "global err defined";
|
||||
print "testi(str, n, N, verbose) defined";
|
||||
print "testr(str, n, N, verbose) defined";
|
||||
print "test3300(verbose, tnum) defined";
|
||||
}
|
||||
|
@@ -299,15 +299,3 @@ define test3400(verbose, tnum)
|
||||
}
|
||||
return tnum;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "global defaultverbose defined";
|
||||
print "global err defined";
|
||||
print "test3401(str, n, eps, verbose) defined";
|
||||
print "test3402(str, n, eps, verbose) defined";
|
||||
print "test3403(str, n, eps, verbose) defined";
|
||||
print "test3404(str, n, eps, verbose) defined";
|
||||
print "test3405(str, n, eps, verbose) defined";
|
||||
print "test3406(str, n, eps, verbose) defined";
|
||||
print "test3400(verbose, tnum) defined";
|
||||
}
|
||||
|
@@ -272,14 +272,3 @@ define test3500(verbose, tnum, n, N)
|
||||
}
|
||||
return tnum;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "global defaultverbose defined";
|
||||
print "global err defined";
|
||||
print "testfrem(x, y, verbose) defined";
|
||||
print "testgcdrem(x, y, verbose) defined";
|
||||
print "testf(str, n, verbose) defined";
|
||||
print "testg(str, n, verbose) defined";
|
||||
print "testh(str, n, N, verbose) defined";
|
||||
print "test3500(verbose, n, N) defined";
|
||||
}
|
||||
|
@@ -452,32 +452,3 @@ define test4000(v, tnum)
|
||||
}
|
||||
return tnum;
|
||||
}
|
||||
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "global defaultverbose";
|
||||
print "global err";
|
||||
print "global BASEB";
|
||||
print "global BASE";
|
||||
print "global COUNT";
|
||||
print "global SKIP";
|
||||
print "global RESIDUE";
|
||||
print "global MODULUS";
|
||||
print "global K1";
|
||||
print "global H1";
|
||||
print "global K2";
|
||||
print "global H2";
|
||||
print "global K3";
|
||||
print "global H3";
|
||||
print "plen(N) defined";
|
||||
print "clen(N) defined";
|
||||
print "ptimes(str, N, n, count, skip, verbose) defined";
|
||||
print "ctimes(str, N, n, count, skip, verbose) defined";
|
||||
print "crtimes(str, a, b, n, count, skip, verbose) defined";
|
||||
print "ntimes(str, N, n, count, skip, residue, mod, verbose) defined";
|
||||
print "testnextcand(str, N, n, cnt, skip, res, mod, verbose) defined";
|
||||
print "testnext1(x, y, count, skip, residue, modulus) defined";;
|
||||
print "testprevcand(str, N, n, cnt, skip, res, mod, verbose) defined";
|
||||
print "testprev1(x, y, count, skip, residue, modulus) defined";
|
||||
print "test4000(verbose, tnum) defined";
|
||||
}
|
||||
|
@@ -472,20 +472,3 @@ define test4100(v, tnum)
|
||||
}
|
||||
return tnum;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "global defaultverbose";
|
||||
print "global err";
|
||||
print "global K1";
|
||||
print "global K2";
|
||||
print "global BASEB";
|
||||
print "global BASE";
|
||||
print "rlen_4100(N) defined";
|
||||
print "olen(N) defined";
|
||||
print "test4101(x, y, m, k, z1, z2) defined";
|
||||
print "testall(str, n, N, M, verbose) defined";
|
||||
print "times(str, N, n, verbose) defined";
|
||||
print "powtimes(str, N1, N2, n, verbose) defined";
|
||||
print "inittimes(str, N, n, verbose) defined";
|
||||
print "test4100(verbose, tnum) defined";
|
||||
}
|
||||
|
@@ -304,12 +304,3 @@ define test4600(v, tnum)
|
||||
}
|
||||
return tnum;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "stest(str [, verbose]) defined";
|
||||
print "ttest([m, [n [,verbose]]]) defined";
|
||||
print "sprint(x) defined";
|
||||
print "findline(f,s) defined";
|
||||
print "findlineold(f,s) defined";
|
||||
print "test4600(verbose, tnum) defined";
|
||||
}
|
||||
|
@@ -48,9 +48,3 @@ define test5100(x)
|
||||
}
|
||||
global a5100 = a5100, b5100 = b5100;
|
||||
}
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "global a5100";
|
||||
print "global b5100";
|
||||
print "test5100(x) defined";
|
||||
}
|
||||
|
@@ -30,11 +30,3 @@ static a5200 = 20;
|
||||
define f5200(x) = a5200 + x;
|
||||
define g5200(x) {global a5200 = 30; return a5200 + x;}
|
||||
define h5200(x) = a5200 + x;
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "global a5200";
|
||||
print "static a5200";
|
||||
print "f5200(x) defined";
|
||||
print "g5200(x) defined";
|
||||
print "h5200(x) defined";
|
||||
}
|
||||
|
@@ -27,8 +27,3 @@ define unitfrac(x)
|
||||
} while ((num(x) > 1) || (x == di) || (x == 1));
|
||||
print ' [1/1]',, x;
|
||||
}
|
||||
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "unitfrac(x) defined";
|
||||
}
|
||||
|
@@ -21,7 +21,7 @@ print "global blkmax defined, assigned value 8";
|
||||
print;
|
||||
|
||||
B = blk();
|
||||
define isoctet(a) = istype(a, B[0]);
|
||||
define is_octet(a) = istype(a, B[0]);
|
||||
|
||||
define list_print(a) {
|
||||
local i;
|
||||
@@ -131,7 +131,7 @@ define strchar(a) {
|
||||
if (isstr(a))
|
||||
a = ord(a);
|
||||
|
||||
else if (isoctet(a))
|
||||
else if (is_octet(a))
|
||||
a = a; /* This converts octet to number */
|
||||
|
||||
else if (!isint(a) || a < 0 || a > 255)
|
||||
@@ -269,15 +269,3 @@ define octet_print(a) {
|
||||
print "Here is the earlier block with a new octet_print()";
|
||||
print B1;
|
||||
print;
|
||||
|
||||
if (config("lib_debug") >= 0) {
|
||||
print "isoctet(a) defined";
|
||||
print "list_print(a) defined";
|
||||
print "mat_print (a) defined";
|
||||
print "octet_print(a) defined";
|
||||
print "blk_print(a) defined";
|
||||
print "nblk_print (a) defined";
|
||||
print "strchar(a) defined";
|
||||
print "file_print(a) defined";
|
||||
print "error_print(a) defined";
|
||||
}
|
||||
|
14
lib_calc.c
14
lib_calc.c
@@ -82,6 +82,7 @@ int allow_exec = TRUE; /* FALSE => may not execute any commands */
|
||||
int p_flag = FALSE; /* TRUE => pipe mode */
|
||||
int q_flag = FALSE; /* TRUE => don't execute rc files */
|
||||
int u_flag = FALSE; /* TRUE => unbuffer stdin and stdout */
|
||||
int d_flag = FALSE; /* TRUE => disable heading, lib_debug == 0 */
|
||||
|
||||
|
||||
/*
|
||||
@@ -98,7 +99,7 @@ int interactive = FALSE; /* TRUE if interactive session (no cmd args) */
|
||||
int post_init = FALSE; /* TRUE setjmp for math_error is readready */
|
||||
|
||||
int no_env = FALSE; /* TRUE (-e) => ignore env vars on startup */
|
||||
int ign_errmax = FALSE; /* TRUE (-i) => ignore when errcount exceeds errmax */
|
||||
int errmax = ERRMAX; /* if >= 0, maximum value for errcount */
|
||||
|
||||
NUMBER *epsilon_default; /* default allowed error for float calcs */
|
||||
|
||||
@@ -155,6 +156,13 @@ libcalc_call_me_first(void)
|
||||
conf = config_copy(&oldstd);
|
||||
}
|
||||
|
||||
/*
|
||||
* -d turns off lib_debug
|
||||
*/
|
||||
if (d_flag) {
|
||||
conf->lib_debug = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*/
|
||||
@@ -229,10 +237,6 @@ reinitialize(void)
|
||||
math_setfp(stdout);
|
||||
resetscopes();
|
||||
resetinput();
|
||||
if (q_flag == FALSE && allow_read) {
|
||||
q_flag = TRUE;
|
||||
runrcfiles();
|
||||
}
|
||||
(void) openterminal();
|
||||
}
|
||||
|
||||
|
53
opcodes.c
53
opcodes.c
@@ -32,7 +32,6 @@ static VALUE oldvalue; /* previous calculation value */
|
||||
static BOOL saveval = TRUE; /* to enable or disable saving */
|
||||
static int calc_errno; /* most recent error-number */
|
||||
static int errcount; /* counts calls to error_value */
|
||||
static int errmax = ERRMAX; /* maximum for errcount without abort */
|
||||
static BOOL go;
|
||||
|
||||
/*
|
||||
@@ -2467,7 +2466,7 @@ o_return(void)
|
||||
|
||||
/*ARGSUSED*/
|
||||
static void
|
||||
o_jumpeq(FUNC *fp, BOOL *dojump)
|
||||
o_jumpz(FUNC *fp, BOOL *dojump)
|
||||
{
|
||||
VALUE *vp;
|
||||
int i; /* result of comparison */
|
||||
@@ -2491,7 +2490,7 @@ o_jumpeq(FUNC *fp, BOOL *dojump)
|
||||
|
||||
/*ARGSUSED*/
|
||||
static void
|
||||
o_jumpne(FUNC *fp, BOOL *dojump)
|
||||
o_jumpnz(FUNC *fp, BOOL *dojump)
|
||||
{
|
||||
VALUE *vp;
|
||||
int i; /* result of comparison */
|
||||
@@ -2513,6 +2512,20 @@ o_jumpne(FUNC *fp, BOOL *dojump)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* jumpnn invokes a jump if top value points to a null value
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
static void
|
||||
o_jumpnn(FUNC *fp, BOOL *dojump)
|
||||
{
|
||||
if (stack->v_addr->v_type) {
|
||||
*dojump = TRUE;
|
||||
stack--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*ARGSUSED*/
|
||||
static void
|
||||
o_condorjump(FUNC *fp, BOOL *dojump)
|
||||
@@ -3111,7 +3124,8 @@ o_quit(FUNC *fp, long index)
|
||||
s = findstring(index);
|
||||
cp = s->s_str;
|
||||
}
|
||||
if ((fp->f_name[0] == '*') && (fp->f_name[1] == '\0')) {
|
||||
if (inputisterminal() && (fp->f_name[0] == '*')
|
||||
&& (fp->f_name[1] == '\0')) {
|
||||
if (cp)
|
||||
printf("%s\n", cp);
|
||||
hist_term();
|
||||
@@ -3126,6 +3140,8 @@ o_quit(FUNC *fp, long index)
|
||||
printf("%s\n", cp);
|
||||
else
|
||||
printf("Quit statement executed\n");
|
||||
if (!inputisterminal() && fp->f_name[0] == '*')
|
||||
closeinput();
|
||||
go = FALSE;
|
||||
}
|
||||
|
||||
@@ -3243,7 +3259,7 @@ error_value(int e)
|
||||
calc_errno = e;
|
||||
if (e > 0)
|
||||
errcount++;
|
||||
if (errcount > errmax && !ign_errmax) {
|
||||
if (errmax >= 0 && errcount > errmax) {
|
||||
math_error("Error %d caused errcount to exceed errmax", e);
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
@@ -3281,21 +3297,6 @@ set_errcount(int e)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* set_errno - return and set errno
|
||||
*/
|
||||
int
|
||||
set_errmax(int e)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = errmax;
|
||||
if (e >= 0)
|
||||
errmax = e;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Fill a newly created matrix at v1 with copies of value at v2.
|
||||
*/
|
||||
@@ -3427,8 +3428,8 @@ static struct opcode opcodes[MAX_OPCODE+1] = {
|
||||
{o_duplicate, OPNUL, "DUPLICATE"}, /* duplicate top value */
|
||||
{o_pop, OPNUL, "POP"}, /* pop top value */
|
||||
{o_return, OPRET, "RETURN"}, /* return value of function */
|
||||
{o_jumpeq, OPJMP, "JUMPEQ"}, /* jump if value zero */
|
||||
{o_jumpne, OPJMP, "JUMPNE"}, /* jump if value nonzero */
|
||||
{o_jumpz, OPJMP, "JUMPZ"}, /* jump if value zero */
|
||||
{o_jumpnz, OPJMP, "JUMPNZ"}, /* jump if value nonzero */
|
||||
{o_jump, OPJMP, "JUMP"}, /* jump unconditionally */
|
||||
{o_usercall, OPTWO, "USERCALL"}, /* call a user function */
|
||||
{o_getvalue, OPNUL, "GETVALUE"}, /* convert address to value */
|
||||
@@ -3531,7 +3532,8 @@ static struct opcode opcodes[MAX_OPCODE+1] = {
|
||||
{o_hashop, OPNUL, "HASHOP"}, /* binary hash op */
|
||||
{o_backslash, OPNUL, "BACKSLASH"}, /* unary backslash op */
|
||||
{o_setminus, OPNUL, "SETMINUS"}, /* binary backslash op */
|
||||
{o_plus, OPNUL, "PLUS"} /* unary + op */
|
||||
{o_plus, OPNUL, "PLUS"}, /* unary + op */
|
||||
{o_jumpnn, OPJMP, "JUMPNN"} /* jump if non-null */
|
||||
};
|
||||
|
||||
|
||||
@@ -3695,6 +3697,7 @@ calculate(FUNC *fp, int argcount)
|
||||
freevalue(&locals[i]);
|
||||
if (locals != localtable)
|
||||
free(locals);
|
||||
if (conf->calc_debug & 2)
|
||||
printf("\t\"%s\": line %ld\n", funcname, funcline);
|
||||
while (stack > beginstack)
|
||||
freevalue(stack--);
|
||||
@@ -3751,11 +3754,11 @@ dumpop(unsigned long *pc)
|
||||
case OP_INDEXADDR:
|
||||
printf(" %ld %ld\n", pc[0], pc[1]);
|
||||
return 3;
|
||||
case OP_PRINT: case OP_JUMPEQ: case OP_JUMPNE: case OP_JUMP:
|
||||
case OP_PRINT: case OP_JUMPZ: case OP_JUMPNZ: case OP_JUMP:
|
||||
case OP_CONDORJUMP: case OP_CONDANDJUMP: case OP_CASEJUMP:
|
||||
case OP_INITSTATIC: case OP_MATCREATE: case OP_OBJCREATE:
|
||||
case OP_SHOW: case OP_ELEMINIT: case OP_ELEMADDR:
|
||||
case OP_ELEMVALUE:
|
||||
case OP_ELEMVALUE: case OP_JUMPNN:
|
||||
printf(" %ld\n", *pc);
|
||||
return 2;
|
||||
case OP_NUMBER: case OP_IMAGINARY:
|
||||
|
@@ -38,8 +38,8 @@
|
||||
#define OP_DUPLICATE 23L /* duplicate top value on stack */
|
||||
#define OP_POP 24L /* pop top value from stack */
|
||||
#define OP_RETURN 25L /* return value of function */
|
||||
#define OP_JUMPEQ 26L /* jump if top value is zero */
|
||||
#define OP_JUMPNE 27L /* jump if top value is nonzero */
|
||||
#define OP_JUMPZ 26L /* jump if top value is zero */
|
||||
#define OP_JUMPNZ 27L /* jump if top value is nonzero */
|
||||
#define OP_JUMP 28L /* jump unconditionally */
|
||||
#define OP_USERCALL 29L /* call a user-defined function */
|
||||
#define OP_GETVALUE 30L /* convert address to value */
|
||||
@@ -143,7 +143,8 @@
|
||||
#define OP_BACKSLASH 128L /* unary backslash */
|
||||
#define OP_SETMINUS 129L /* binary backslash */
|
||||
#define OP_PLUS 130L /* unary + */
|
||||
#define MAX_OPCODE 130L /* highest legal opcode */
|
||||
#define OP_JUMPNN 131L /* jump if top value is non-null */
|
||||
#define MAX_OPCODE 131L /* highest legal opcode */
|
||||
|
||||
|
||||
/*
|
||||
|
4
seed.c
4
seed.c
@@ -270,7 +270,7 @@ pseudo_seed(void)
|
||||
sdata.urandom_ret = EOF;
|
||||
}
|
||||
#endif /* __linux */
|
||||
(void) gettimeofday(&sdata.tp);
|
||||
(void) gettimeofday(&sdata.tp, NULL);
|
||||
sdata.getsid = getsid((pid_t)0);
|
||||
sdata.getpgid = getpgid((pid_t)0);
|
||||
sdata.getpid = getpid();
|
||||
@@ -295,7 +295,7 @@ pseudo_seed(void)
|
||||
(void) ustat(sdata.fstat_stderr.st_dev, &sdata.ustat_stderr);
|
||||
(void) getrusage(RUSAGE_SELF, &sdata.rusage);
|
||||
(void) getrusage(RUSAGE_CHILDREN, &sdata.rusage_chld);
|
||||
(void) gettimeofday(&sdata.tp2);
|
||||
(void) gettimeofday(&sdata.tp2, NULL);
|
||||
sdata.size = sizeof(sdata);
|
||||
(void) setjmp(sdata.env);
|
||||
sdata.sdata_p = (char *)&sdata;
|
||||
|
1
value.h
1
value.h
@@ -213,7 +213,6 @@ extern BOOL precvalue(VALUE *v1, VALUE *v2);
|
||||
extern VALUE error_value(int e);
|
||||
extern int set_errno(int e);
|
||||
extern int set_errcount(int e);
|
||||
extern int set_errmax(int e);
|
||||
extern long countlistitems(LIST *lp);
|
||||
extern void addlistitems(LIST *lp, VALUE *vres);
|
||||
extern void addlistinv(LIST *lp, VALUE *vres);
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997 David I. Bell
|
||||
* Copyright (c) 1999 David I. Bell
|
||||
* Permission is granted to use, distribute, or modify this source,
|
||||
* provided that this copyright notice remains intact.
|
||||
*
|
||||
@@ -12,7 +12,7 @@
|
||||
#define MAJOR_VER 2 /* major version */
|
||||
#define MINOR_VER 11 /* minor version */
|
||||
#define MAJOR_PATCH 0 /* patch level or 0 if no patch */
|
||||
#define MINOR_PATCH "5" /* test number or empty string if no patch */
|
||||
#define MINOR_PATCH "7" /* test number or empty string if no patch */
|
||||
|
||||
/*
|
||||
* calc version constants
|
||||
|
18
zrandom.c
18
zrandom.c
@@ -1598,6 +1598,7 @@ zsrandom1(CONST ZVALUE seed, BOOL need_ret)
|
||||
*/
|
||||
if (!blum.seeded) {
|
||||
p_blum = randomcopy(&init_blum);
|
||||
randomfree(&blum);
|
||||
blum = *p_blum;
|
||||
free(p_blum);
|
||||
}
|
||||
@@ -1621,9 +1622,8 @@ zsrandom1(CONST ZVALUE seed, BOOL need_ret)
|
||||
if (ziszero(seed)) {
|
||||
|
||||
/* set to the default generator state */
|
||||
zfree(blum.n);
|
||||
zfree(blum.r);
|
||||
p_blum = randomcopy(&init_blum);
|
||||
randomfree(&blum);
|
||||
blum = *p_blum;
|
||||
free(p_blum);
|
||||
|
||||
@@ -1710,6 +1710,7 @@ zsrandom2(CONST ZVALUE seed, CONST ZVALUE newn)
|
||||
*/
|
||||
if (!blum.seeded) {
|
||||
p_blum = randomcopy(&init_blum);
|
||||
randomfree(&blum);
|
||||
blum = *p_blum;
|
||||
free(p_blum);
|
||||
}
|
||||
@@ -1868,6 +1869,7 @@ zsrandom4(CONST ZVALUE seed, CONST ZVALUE ip, CONST ZVALUE iq, long trials)
|
||||
*/
|
||||
if (!blum.seeded) {
|
||||
p_blum = randomcopy(&init_blum);
|
||||
randomfree(&blum);
|
||||
blum = *p_blum;
|
||||
free(p_blum);
|
||||
}
|
||||
@@ -1962,6 +1964,7 @@ zsetrandom(CONST RANDOM *state)
|
||||
*/
|
||||
if (!blum.seeded) {
|
||||
p_blum = randomcopy(&init_blum);
|
||||
randomfree(&blum);
|
||||
blum = *p_blum;
|
||||
free(p_blum);
|
||||
}
|
||||
@@ -2005,6 +2008,7 @@ zrandomskip(long cnt)
|
||||
*/
|
||||
if (!blum.seeded) {
|
||||
p_blum = randomcopy(&init_blum);
|
||||
randomfree(&blum);
|
||||
blum = *p_blum;
|
||||
free(p_blum);
|
||||
}
|
||||
@@ -2109,6 +2113,7 @@ zrandom(long cnt, ZVALUE *res)
|
||||
*/
|
||||
if (!blum.seeded) {
|
||||
p_blum = randomcopy(&init_blum);
|
||||
randomfree(&blum);
|
||||
blum = *p_blum;
|
||||
free(p_blum);
|
||||
}
|
||||
@@ -2390,6 +2395,9 @@ randomcopy(CONST RANDOM *state)
|
||||
/*
|
||||
* randomfree - free a Blum state
|
||||
*
|
||||
* We avoid freeing the pre-compiled states as they were
|
||||
* never malloced in the first place.
|
||||
*
|
||||
* given:
|
||||
* state - the state to free
|
||||
*/
|
||||
@@ -2406,11 +2414,15 @@ randomfree(RANDOM *state)
|
||||
}
|
||||
|
||||
/* free the values */
|
||||
state->seeded = 0;
|
||||
if (state->n.v != h_ndefvec) {
|
||||
zfree(state->n);
|
||||
}
|
||||
if (state->r.v != h_rdefvec) {
|
||||
zfree(state->r);
|
||||
}
|
||||
|
||||
/* free it if it is not pre-defined */
|
||||
state->seeded = 0;
|
||||
if (state != &blum) {
|
||||
free(state);
|
||||
}
|
||||
|
Reference in New Issue
Block a user