Compare commits

...

8 Commits

Author SHA1 Message Date
Landon Curt Noll
9d62873a02 Release calc version 2.12.0.2 2017-05-21 15:38:46 -07:00
Landon Curt Noll
23a5fc3ede Release calc version 2.12.0.1 2017-05-21 15:38:46 -07:00
Landon Curt Noll
58d94b08d8 Release calc version 2.12.0 2017-05-21 15:38:45 -07:00
Landon Curt Noll
7165fa17c7 Release calc version 2.11.11 2017-05-21 15:38:45 -07:00
Landon Curt Noll
64a732b678 Release calc version 2.11.10.1 2017-05-21 15:38:45 -07:00
Landon Curt Noll
a6a37f9cad Release calc version 2.11.10 2017-05-21 15:38:45 -07:00
Landon Curt Noll
42b089a87c Release calc version 2.11.9.3 2017-05-21 15:38:44 -07:00
Landon Curt Noll
8c5e9e62fa Release calc version 2.11.9.2 2017-05-21 15:38:44 -07:00
381 changed files with 12368 additions and 8072 deletions

160
BUGS
View File

@@ -47,7 +47,7 @@ When you send your report, please include the following information:
* a description of the problem * a description of the problem
* the version of calc you are using (if you cannot get calc * the version of calc you are using (if you cannot get calc
it to run, then send us the 4 #define lines from version.c) to run, then send us the 4 #define lines from version.c)
* if you modified calc from an official patch, send me the mods you made * if you modified calc from an official patch, send me the mods you made
* the type of system you were using * the type of system you were using
* the type of compiler you were using * the type of compiler you were using
@@ -68,58 +68,47 @@ of a context diff patch).
Known bugs: Known bugs:
The stoponerror() facility does not seem to work, or perhaps
the stoponerror help file is incorrect. The stoponerror help file
lacks examples because of this problem.
We are sure some more bugs exist. When you find them, please let We are sure some more bugs exist. When you find them, please let
us know! See the above for details on how to report and were to us know! See the above for details on how to report and were to
EMail your bug reports and hopefully patches to fix them. EMail your bug reports and hopefully patches to fix them.
Problems with known work-a-rounds: =-=
* The gcc as shipped with Redhat 7 perhaps other Linux distributions mis-features in calc:
has a bug causes calc to dump core on startup when calc is:
compiled optimized (-O, -O1, -O2 or -O3) Some problems are not bugs but rarther mis-features / things that could
work better. The following is a list of mis-features that should be
addressed and improved someday.
AND * The chi.cal resource file does not work well with odd degrees
of freedom. Can someone improve this algorithm?
compiled with debugging (-g or -g3) * The intfile.cal resource file reads and writes big or little Endian
integers to/from files the hard way. It does NOT use blkcpy. The
following code:
AND i = (ord("\n") << 16) | (ord("i") << 8) | ord("H")
b = blk()
copy(i, b)
fd = fopen("file", "w")
copy(b, fd);
fclose(fd)
when calc is compiled with readline (see USE_READLINE, will write an extra NUL octet to the file. Where as:
READLINE_LIB and READLINE_INCLUDE in the Makefile)
On Redhat, the gcc -v which has this problem is: read intfile
i = (ord("\n") << 16) | (ord("i") << 8) | ord("H")
be2file(i, "file2")
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-85) will not.
there may be other gcc versions that also suffer this fate. =-=
The readlines associated with problem are: Problems with old systems that have known work-a-rounds:
readline-4.1-5
readline2.2.1-2.2.1-2
readline-devel-4.1-5
One work-a-round is to compile calc WITHOUT readline. In the
Makefile be sure that:
USE_READLINE=
READLINE_LIB=
READLINE_INCLUDE=
i.e., these Makefile vars are empty.
If you must use readline, then an alternate work-a-round is to
change the DEBUG Makefile variable to either:
compile for speed: -O3 (or -O2 if you do not have -O3)
compile to debug: -g3 (or -g if you do not have -g3)
but not both.
See RH bug #57889 for details:
http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=57889
* There is a bug in gcc-2.95 that causes calc, when compiled with -O2, * There is a bug in gcc-2.95 that causes calc, when compiled with -O2,
to fail the regression test. The work-a-round is to compile with -O to fail the regression test. The work-a-round is to compile with -O
@@ -170,59 +159,6 @@ Problems with known work-a-rounds:
if (n < 0) n = 0; if (n < 0) n = 0;
z.sign = 0; z.sign = 0;
* Solaris cc somtimes barfs while compiling zrand.c. In particular, calc
barfs on on the SVAL macro. The work-a-round is to use the Solaric cc
Makefile set sets -DFORCE_STDC. I.e,:
CCWARN=
CCOPT= ${DEBUG} ${NO_SHARED}
CCMISC= -DFORCE_STDC
#
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
ICFLAGS= ${CCWARN} ${CCMISC}
#
LCFLAGS=
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
ILDFLAGS=
#
LCC= cc
CC= ${PURIFY} ${LCC}
* There is a bug in some versions of the Dec/Compaq cc for the Alpha
where the following:
#include <stdio.h>
#define SVAL(a,b) (unsigned long)(0x ## a ## b ## ULL)
main(){SVAL(b8a8aeb0,8168eadc);}
fails because it puts a space inside the concatenated hex. Calc
has code that is affected by this bug. This bug has been reported
to Compaq and may be fixed in the future. A work-a-round is to
compile with cc -std0 or to use a later version of their compiler.
* On a Digital UNIX V4.0F (Rev. 1229) on a 500 Mhz 21264, make check
dies a horrible death starting in test 600 and 622 gives 100s of
messages for calc version 2.11.0t9.4 using the Dec's cc with -O2:
600: Beginning test_bignums
601: muldivcheck 1
**** abc != acb: 602: muldivcheck 2
**** acb != bac: 602: muldivcheck 2
...
**** t4 != a4: 622: algcheck 1
**** t5 != a5: 622: algcheck 1
**** t6 != a6: 622: algcheck 1
**** t4 != a4: 622: algcheck 1
...
it finally hangs at test 2000.
The work-a-round is to compile calc without the optimizer. If this
happens to you, try compiling without -O and without -O2. I.e., in
the Makefile, set:
DEBUG= -g
* There are problems compiling calc on the sparcv9 under 64 bit * There are problems compiling calc on the sparcv9 under 64 bit
Solaris. On that platform, gcc-2.96 is able to compile calc, but Solaris. On that platform, gcc-2.96 is able to compile calc, but
calc dumps core very early on in startup. It is said that sparcv9 calc dumps core very early on in startup. It is said that sparcv9
@@ -238,41 +174,7 @@ Problems with known work-a-rounds:
CCWARN="-DFORCE_STDC -w" CCWARN="-DFORCE_STDC -w"
DEBUG="-fast -xarch=v9" DEBUG="-fast -xarch=v9"
* Under BSDI v4, the warnings of the form: ## Copyright (C) 1999-2006 Landon Curt Noll
/usr/include/ctype.h:147: warning: `__runetype' defined but not used
/usr/include/ctype.h:161: warning: `__isctype' defined but not used
/usr/include/ctype.h:170: warning: `toupper' defined but not used
/usr/include/ctype.h:177: warning: `tolower' defined but not used
are seen. These warnings are the result of mis-features in BSDI
include files. They do not have an impact on the operation
or performance. The work-a-round is to ignore these warnings
under BSDI.
* The chi.cal resource file does not work well with odd degrees
of freedom. Can someone improve this algorithm?
* The intfile.cal resource file reads and writes big or little Endian
integers to/from files the hard way. It does NOT use blkcpy. The
following code:
i = (ord("\n") << 16) | (ord("i") << 8) | ord("H")
b = blk()
copy(i, b)
fd = fopen("file", "w")
copy(b, fd);
fclose(fd)
will write an extra NUL octet to the file. Where as:
read intfile
i = (ord("\n") << 16) | (ord("i") << 8) | ord("H")
be2file(i, "file2")
will not.
## Copyright (C) 1999 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -288,8 +190,8 @@ Problems with known work-a-rounds:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.17 $ ## @(#) $Revision: 29.24 $
## @(#) $Id: BUGS,v 29.17 2001/12/31 22:12:35 chongo Exp $ ## @(#) $Id: BUGS,v 29.24 2006/05/21 07:54:13 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/BUGS,v $ ## @(#) $Source: /usr/local/src/cmd/calc/RCS/BUGS,v $
## ##
## Under source code control: 1994/03/18 14:06:13 ## Under source code control: 1994/03/18 14:06:13

339
CHANGES
View File

@@ -1,4 +1,332 @@
The following are the changes from calc version 2.11.9 to date: The following are the changes from calc version 2.12.0 to date:
Fixed ellip.cal to deal with a calc syntax change that happened
many ages ago but was never applied to this file until now.
This bug was fixed by Ernest Bowen <ebowen at une dot edu dot au>.
Fixed a problem where comments using # followed by a !, newline or
another # works. This bug was fixed by Ernest Bowen <ebowen at une
dot edu dot au>.
The show builtins display for functions with long descriptions
is now broken into multi-line descriptions.
The str functions, such as strcpy(s1, s2), will now copy as many
characters as possible from s2 to s1, treating '\0' like any other
character until the end of s2 is reached. If s2 is shorter than s1,
a '\0' is inserted.
The strcmp(s1, s2) builtin, for strings s1, s2: strcmp(s1, s2) == 0 now
means the same as s1 == s2.
The str(s) builtin has been changed so that it will return only the
string formed by the characters of 's' up to the first '\0'.
The substr(s, start, num) builtin has been changed so that '\0' characters
are treated like any other.
Fixed a bug where strcpy("", "a") used to cause a segmentation fault.
This bug was fixed by Ernest Bowen <ebowen at une dot edu dot au>.
Make minor change to natnumset.cal in how the tail variable is initialized.
Fixed bugs in the strcmp, strncmp, strcpy, and strncpy help files.
This bug was fixed by Ernest Bowen <ebowen at une dot edu dot au>.
Added cal/screen.cal which Defines ANSI control sequences providing
(i.e., cursor movement, changing foreground or background color,
etc.) for VT100 terminals and terminal window emulators (i.e., xterm,
Apple OS/X Terminal, etc.) that support them. For example:
read screen
print green:"This is green. ":red:"This is red.":black
Fixed a bug where too many open files returned E_FOPEN3. Now
a new error symbol F_MANYOPEN is used for too many open files.
Added the builtin function fpathopen() to open a file while
searching along a path:
; fd2 = fpathopen("tmp/date", "r", ".:~:~sc:/tmp:/var/tmp:/var")
; print fd2
"/var/tmp/date"
By default, fpathopen() searches along CALCPATH.
Added the calcpath() builtin function to return the current value
of CALCPATH.
Fixed prompt characters in the EXAMPLE section of help files.
Fixed problems related to the protect function and its documentation.
This bug was reported by David Gilham <davidgilham at gmail dot com>.
This bug was fixed by Ernest Bowen <ebowen at une dot edu dot au>.
Raised the limit of exponent in exponential notation. It was set to
arbitrary 1000000 (making 1e1000001 in invalid exponential notation
value). The exponent for exponential notation is now int(MAXLONG/10).
On 32 bit machines, this means a limit of 214748364. On 64 bit
machines, this means 922337203685477580. Of course, you may not
have enough memory to hold such huge values, but if you did you can
now express such values in exponential notation.
Added log() builtin for base 10 logarithm.
Fixed problems where internal use of libc strcpy() might have caused
a buffer overflow. Calc now only uses libc strcpy() when the source
string is a constant.
The calc STRING and STRINGHEAD now use the standard size_t (an unsigned
type) length. Calc mostly uses size_t in dealing with string lengths
and object sizes when possible.
Added ${CCWERR} make variable to allow one to force compiler warnings
to be treated as errors. The ${CC} make variable now uses ${CCWERR}
however the ${LCC} (used by the Makefile test code for building hsrc
files) does not use ${CCWERR}. By default, ${CCWERR} is empty.
In development Makefiles, we set CCWERR= -Werror to force us to
address compiler warnings before the next release.
The calc make variable, CALCPAGER, now defaults to CALCPAGER= less
because the less utility is now very common. Set CALCPAGER= more
if you do not have less.
Calc source had two styles of switch indentation. Converted the
style where case statements were indented with respect to the switch
statement into the style where the case statements are at the same
level. When comparing with older source, one may use the -b argument
of the diff command to ignore changes in amount of white space:
diff -b -r -u calc-2.11.11 calc-2.12.0
The read, write, and help commands use the value of global string
variable if the symbol name starts with a $. For example:
global x = "lucas.cal";
read $x; /* same as read lucas.cal or read "lucas.cal" */
Added dotest.cal resource. Based on a design by Ernest Bowen
<ebowen at une dot edu dot au>, the dotest evaluates individual
lines from a file. The dotest() function takes 1 to 3 arguments:
dotest(dotest_file [,dotest_code [,dotest_maxcond]])
dotest_file
Search along CALCPATH for dotest_file, which contains lines that
should evaluate to 1. Comment lines and empty lines are ignored.
Comment lines should use ## instead of the multi like /* ... */
because lines are evaluated one line at a time.
dotest_code
Assign the code number that is to be printed at the start of
each non-error line and after **** in each error line.
The default code number is 999.
dotest_maxcond
The maximum number of error conditions that may be detected.
An error condition is not a sign of a problem, in some cases
a line deliberately forces an error condition. A value of -1,
the default, implies a maximum of 2147483647.
Global variables and functions must be declared ahead of time because
the dotest scope of evaluation is a line at a time. For example:
read dotest.cal
read set8700.cal
dotest("set8700.line");
Updated the todo / wish list items. The top priority now is to
convert calc to GNU autoconf / configure to build the calc.
help todo
Added missing help file for the stoponerror() builtin.
Corrected and improved the help documentation for factor and lfactor.
Fixed a problem where some error messages that should have been
written to a file or string, went to stderr instead. This bug was
fixed by Ernest Bowen <ebowen at une dot edu dot au>.
Corrected the documentation relating to the calc -c command line option.
The -c relates to scan/parse errors only, not execution errors.
Corrected a stack overflow problem where the math_fmt() in zio.c
could be induced to overflow the stack. This problem was independently
reported by Chew Keong Tan of Secunia Research <vuln at secunia dot com>.
Corrected a stack overflow problem where the scanerror() in token.c
could be induced to overflow the stack by a malformed token.
Made math_error() in math_error.c more robust against a error
message constant that is too long.
Made read_bindings() in hist.c more robust against very line bindings
config lines.
Made listsort() in listfunc.c and matsort() matfunc.c more robust
against sorting of impossibly huge lists and matrices.
Warnings about an undefining a builtin or undefined function, a
constant before the comma operator, and an unterminated comment is
now processed by scanerrors (not simply written directly to stderr).
These warnings file and line number in which the "error" occurred
as well as a more precise message than before. If using -c on the
calc command line or if stoponerror(-1), then assuming there are
no other compile errors, only the unterminated comment will stop
completion of the function being defined.
The following are the changes from calc version 2.11.10.1 to 2.11.11:
Fixed a bug reported by the sourceforge user: cedars where:
ln(exp(6)) == 3 /* WRONG!!! */
incorrectly returned 1. This bug was fixed by Ernest Bowen
<ebowen at une dot edu dot au>. The regression test
was expanded to cover this issue.
Added minor improvements to hash regression testing of pi().
Fixed "help script" and the calc man page regarding the requirement
of -f to be the last -flag in shell script mode. Further clarified
the meaning and placement of the -f flag.
Moved issues with chi.cal intfile.cal into a "mis-features" section
of the BUGS file. See "help bugs" or the BUGS source file for details.
Added the bug about:
calc 'read ellip; efactor(13*17*19)'
to the BUGS file. See "help bugs" or the BUGS source file for details.
Anyone want to track down and fix this bug?
Fixed typo in the "help mat" example and improved the mat_print example.
Renamed most COMPLEX C function names to start with c_ to avoid
conflicts with new C standard functions. Note that the calc
builtin function names remain the same. The C function names
inside the C source that calc is written in changed. This means
that code that linked to libcalc.a will need to change in order
to call calc's functions instead of the C standard functions.
See cmath.h, comfunc.c, and commath.c for details. See also
http://www.opengroup.org/onlinepubs/009695399/basedefs/complex.h.html
for names of the new C standard functions.
Changed the calc man page to note that using -- in the command will
separate calc options from arguments as in:
calc -p -- -1 - -7
Noted how Apple OS X can make use of readline in the Makefile.
In particular:
# For Apple OS X: install fink from http://fink.sourceforge.net
# and then do a 'fink install readline' and then use:
#
READLINE_LIB= -L/sw/lib -lreadline -lhistory -lncurses
Added linear.cal as a calc standard resource file.
The following are the changes from calc version 2.11.10 to 2.11.10:
The cygwin config value is correctly tested while doing comparisons
between config states.
Added config("compile_custom") to determine if calc was compiled
with -DCUSTOM. By default, the Makefile uses ALLOW_CUSTOM= -DCUSTOM
so by default, config("compile_custom") is TRUE. If, however,
calc is compiled without -DCUSTOM, then config("compile_custom")
will be FALSE. NOTE: The config("compile_custom") value is only
affected by compile flags. The calc -D runtime command line option
does not change the config("compile_custom") value. This is a
read-only configuration value.
Added config("allow_custom") to determine if the use of custom
functions are allowed. To allow the use of custom functions, calc
must be compiled with -DCUSTOM (which it is by default) AND calc run
be run with the -D runtime command line option (which it is not by
default). If config("allow_custom") is TRUE, then custom functions
are allowed. If config("allow_custom") is FALSE, then custom
functions are not allowed. This is a read-only configuration value.
Correctly hash config state for windows and cygwin values. The value
of config("compile_custom") and config("allow_custom") also affect
the hash of the config state.
Fixed the custom/argv.cal test code to avoid use of a reserved
builtin function name.
Fixed custom/*.cal scripts to conform better with the cal/*.cal
resource files.
Removed the Makefile variables ${LONGLONG_BITS}, ${HAVE_LONGLONG},
and ${L64_FORMAT}. Removed longlong.c and longlong.h. The use
of HAVE_LONGLONG=0 was problematic. The lack of complaints about
the HAVE_LONGLONG=0 shows that the 'long long' type is wide spread
enough warrent not trying to support compilers without 'long long'.
Removed the SVAL and SHVAL macros from zrand.c, zrand.h, and zmath.h
as they were causing too many broken C pre-processors and C checkers
to become confused.
Added a 'make splint' rule to use the splint statically checking
tool on the calc source.
Removed support of the BSDI platform. The BSDI platform is no longer
directly supported and we lost our last BSDI machine on which we
could test calc. Best wishes to the former BSDI folk and thanks
for breaking important ground in the Open Source Movement!
Fixed several typos found in the documentation and buildin
function output by C Smith <smichr at hotmail dot com>.
Fixed -d so that:
calc -d 2/3
will print 0.66666666666666666667 without the leading tilde as
advertised in the man page.
Added a missing help file for the display builtin function as
requested by Igor Furlan <primorec at sbcglobal dot net>.
Changed the "help environment" file to reflect modern default
values of CALCPATH and CALCRC.
Added missing variables for printing by the "make env" rule.
Added EXT Makefile variable so that Cygwin can install calc as
calc.exe. By default, EXT is empty so that calc is calc on most
modern operating systems. Thanks goes to Ullal Devappa Kini <wmbfqj
at vsnl dot net> for helping identify this problem and testing our fix.
Added custom function:
custom("pmodm127", q)
to compute 2^(2^127-1) mod q. While currently slower than just
doing pmod(2,2^127-1,q), it is added to give an example of a
more complex custom function. Call calc with the -C flag to
use custom functions.
Made slight changes to the custom/HOW_TO_ADD documentation.
Fixed some \ formatting man page problems as reported by Keh-Cheng
Chu <kehcheng at quake dot Stanford dot edu>.
Fixed some comparison between signed and unsigned in md5.c
that was reported for the PowerMac G5 2GHz MacOS 10.3 by
Guillaume VERGNAUD <vergnaud at via dot ecp dot fr>.
The following are the changes from calc version 2.11.9 to 2.11.9.3:
Fixed calc man page examples to move -f to the end of the line. Fixed calc man page examples to move -f to the end of the line.
Thanks goes to Michael Somos <somos at grail dot cba dot csuohio Thanks goes to Michael Somos <somos at grail dot cba dot csuohio
@@ -47,6 +375,9 @@ The following are the changes from calc version 2.11.9 to date:
Fixed some typos in this file. Fixed some typos in this file.
By default, compile with -O3 -g3. The Makefile comments on how some
distributions might need to use -O2 -g or -O -g.
The following are the changes from calc version 2.11.8.0 to 2.11.8.1: The following are the changes from calc version 2.11.8.0 to 2.11.8.1:
@@ -2030,6 +2361,8 @@ The following are the changes from calc version 2.10.3t5.38 to 2.11.3t5.46:
into a single section. into a single section.
The following are the changes from calc version 2.10.3t5.34 to 2.10.3t5.37: The following are the changes from calc version 2.10.3t5.34 to 2.10.3t5.37:
Per request from David I Bell, the README line: Per request from David I Bell, the README line:
@@ -5663,8 +5996,8 @@ Following is a list of visible changes to calc from version 1.24.7 to 1.26.1:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.63 $ ## @(#) $Revision: 29.78 $
## @(#) $Id: CHANGES,v 29.63 2004/02/23 09:23:39 chongo Exp $ ## @(#) $Id: CHANGES,v 29.78 2006/06/03 22:52:39 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/CHANGES,v $ ## @(#) $Source: /usr/local/src/cmd/calc/RCS/CHANGES,v $
## ##
## Under source code control: 1993/06/02 18:12:57 ## Under source code control: 1993/06/02 18:12:57

View File

@@ -12,8 +12,8 @@ This file is Copyrighted
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
# @(#) $Revision: 29.7 $ # @(#) $Revision: 29.8 $
# @(#) $Id: COPYING,v 29.7 2003/02/26 16:54:59 chongo Exp $ # @(#) $Id: COPYING,v 29.8 2006/05/01 19:16:57 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/COPYING,v $ # @(#) $Source: /usr/local/src/cmd/calc/RCS/COPYING,v $
=-= =-=
@@ -170,7 +170,7 @@ Calc copyrights and exception files
shs1.c shs1.h shs.c shs.h shs1.c shs1.h shs.c shs.h
md5.c md5.h COPYING COPYING-LGPL md5.c md5.h COPYING COPYING-LGPL
cal/qtime.cal cal/qtime.cal cal/screen.cal
The file COPYING-LGPL, which contains a copy of the version 2.1 The file COPYING-LGPL, which contains a copy of the version 2.1
GNU Lesser General Public License, is itself Copyrighted by the GNU Lesser General Public License, is itself Copyrighted by the

521
Makefile

File diff suppressed because it is too large Load Diff

View File

@@ -27,7 +27,6 @@ recommends the following settings:
TERMCONTROL= -DUSE_TERMIOS TERMCONTROL= -DUSE_TERMIOS
BYTE_ORDER= -DLITTLE_ENDIAN BYTE_ORDER= -DLITTLE_ENDIAN
LONG_BITS= 32 LONG_BITS= 32
LONGLONG_BITS= 64
HAVE_FPOS_POS= -DHAVE_NO_FPOS_POS HAVE_FPOS_POS= -DHAVE_NO_FPOS_POS
FPOS_BITS= 32 FPOS_BITS= 32
OFF_T_BITS= 32 OFF_T_BITS= 32
@@ -93,25 +92,29 @@ The major porting work was performed by Thomas Jones-Low
tools. The make file provided with Calc is not compatible with tools. The make file provided with Calc is not compatible with
NMAKE, so I used the Visual Studio tools to generate another one NMAKE, so I used the Visual Studio tools to generate another one
(not included). Calc is built in two parts, calc.dll, which is the (not included). Calc is built in two parts, calc.dll, which is the
library, and calcexe.exe which is the command line interface. library, and calc.exe which is the command line interface.
He recommends that you generate by hand all of the header files generated He recommended that you generate by hand all of the header files that
by the make file: by the Makefile. This has been done for you via the makefile rule:
align32.h args.h calcerr.h conf.h endian_calc.h make win32_hsrc
fposval.h have_const.h have_fpos.h have_fpos_pos.h have_malloc.h
have_memmv.h have_newstr.h have_offscl.h have_posscl.h which uses the Makefile variables in win32.mkdef to form these header
have_stdlib.h have_string.h have_times.h have_uid_t.h files under win32 directory.
have_unistd.h longbits.h longlong.h terminal.h
have_ustat.h have_getsid.h have_getpgid.h
have_gettime.h have_getprid.h have_urandom.h have_rusage.h
have_strdup.h
You will find generated versions of these files located in the win32 You will find generated versions of these files located in the win32
sub-directory. These files may be appropriate for your Cygwin building sub-directory. These files may be appropriate for your Cygwin building
needs. Just copy the win32/*.[ch] files up into the top level calc needs.
source directory, edited (if needed) and build using the Cygwin GCC
compiler. In particular:
Just copy the win32/*.[ch] files up into the top level calc
source directory, edit them (if needed) and build using the
Cygwin GCC compiler and Cygwin build environment.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-= calc maintenance folk =-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
People who maintain calc need to keep in mind the following: People who maintain calc need to keep in mind the following:
@@ -155,8 +158,8 @@ was changed to:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.8 $ ## @(#) $Revision: 29.12 $
## @(#) $Id: README.WINDOWS,v 29.8 2002/03/14 00:28:28 chongo Exp $ ## @(#) $Id: README.WINDOWS,v 29.12 2004/07/28 12:52:01 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/README.WINDOWS,v $ ## @(#) $Source: /usr/local/src/cmd/calc/RCS/README.WINDOWS,v $
## ##
## Under source code control: 2001/02/25 14:00:05 ## Under source code control: 2001/02/25 14:00:05

234
addop.c
View File

@@ -1,7 +1,7 @@
/* /*
* addop - add opcodes to a function being compiled * addop - add opcodes to a function being compiled
* *
* Copyright (C) 1999 David I. Bell and Ernest Bowen * Copyright (C) 1999-2006 David I. Bell and Ernest Bowen
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.4 $ * @(#) $Revision: 29.12 $
* @(#) $Id: addop.c,v 29.4 2004/02/23 07:25:16 chongo Exp $ * @(#) $Id: addop.c,v 29.12 2006/06/03 22:47:28 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/addop.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/addop.c,v $
* *
* Under source code control: 1990/02/15 01:48:10 * Under source code control: 1990/02/15 01:48:10
@@ -184,7 +184,7 @@ void
endfunc(void) endfunc(void)
{ {
register FUNC *fp; /* function just finished */ register FUNC *fp; /* function just finished */
unsigned long size; /* size of just created function */ size_t size; /* size of just created function */
unsigned long index; unsigned long index;
if (oldop != OP_RETURN) { if (oldop != OP_RETURN) {
@@ -195,8 +195,8 @@ endfunc(void)
checklabels(); checklabels();
if (errorcount) { if (errorcount) {
printf("\"%s\": %ld error%s\n", newname, errorcount, scanerror(T_NULL,"Compilation of \"%s\" failed: %ld error(s)",
((errorcount == 1) ? "" : "s")); newname, errorcount);
return; return;
} }
size = funcsize(curfunc->f_opcodecount); size = funcsize(curfunc->f_opcodecount);
@@ -211,7 +211,7 @@ endfunc(void)
if (newname[0] != '*' && (conf->traceflags & TRACE_FNCODES)) { if (newname[0] != '*' && (conf->traceflags & TRACE_FNCODES)) {
dumpnames = TRUE; dumpnames = TRUE;
for (size = 0; size < fp->f_opcodecount; ) { for (size = 0; size < fp->f_opcodecount; ) {
printf("%ld: ", (long)size); printf("%ld: ", (unsigned long)size);
size += dumpop(&fp->f_opcodes[size]); size += dumpop(&fp->f_opcodes[size]);
} }
} }
@@ -280,8 +280,9 @@ rmuserfunc(char *name)
index = findstr(&funcnames, name); index = findstr(&funcnames, name);
if (index < 0) { if (index < 0) {
fprintf(stderr, "%s() has never been defined\n", errorcount--;
name); scanerror(T_NULL,
"Attempt to undefine an undefined function\n\t\"%s\"", name);
return; return;
} }
if (functions[index] == NULL) if (functions[index] == NULL)
@@ -451,124 +452,123 @@ addop(long op)
* slightly optimize the code depending on the various combinations. * slightly optimize the code depending on the various combinations.
*/ */
switch (op) { switch (op) {
case OP_GETVALUE: case OP_GETVALUE:
switch (oldop) { switch (oldop) {
case OP_NUMBER: case OP_NUMBER:
case OP_ZERO: case OP_ZERO:
case OP_ONE: case OP_ONE:
case OP_IMAGINARY: case OP_IMAGINARY:
case OP_GETEPSILON: case OP_GETEPSILON:
case OP_SETEPSILON: case OP_SETEPSILON:
case OP_STRING: case OP_STRING:
case OP_UNDEF: case OP_UNDEF:
case OP_GETCONFIG: case OP_GETCONFIG:
case OP_SETCONFIG: case OP_SETCONFIG:
return; return;
case OP_DUPLICATE: case OP_DUPLICATE:
diff = 1; diff = 1;
oldop = OP_DUPVALUE; oldop = OP_DUPVALUE;
break; break;
case OP_FIADDR: case OP_FIADDR:
diff = 1; diff = 1;
oldop = OP_FIVALUE; oldop = OP_FIVALUE;
break; break;
case OP_GLOBALADDR: case OP_GLOBALADDR:
diff = 1 + PTR_SIZE; diff = 1 + PTR_SIZE;
oldop = OP_GLOBALVALUE; oldop = OP_GLOBALVALUE;
break; break;
case OP_LOCALADDR: case OP_LOCALADDR:
oldop = OP_LOCALVALUE; oldop = OP_LOCALVALUE;
break; break;
case OP_PARAMADDR: case OP_PARAMADDR:
oldop = OP_PARAMVALUE; oldop = OP_PARAMVALUE;
break; break;
case OP_ELEMADDR: case OP_ELEMADDR:
oldop = OP_ELEMVALUE; oldop = OP_ELEMVALUE;
break; break;
default: default:
cut = FALSE; cut = FALSE;
} }
if (cut) { if (cut) {
fp->f_opcodes[count - diff] = oldop; fp->f_opcodes[count - diff] = oldop;
return; return;
} }
break;
case OP_POP:
switch (oldop) {
case OP_ASSIGN:
fp->f_opcodes[count-1] = OP_ASSIGNPOP;
oldop = OP_ASSIGNPOP;
return;
case OP_NUMBER:
case OP_IMAGINARY:
q = constvalue(fp->f_opcodes[count-1]);
qfree(q);
break; break;
case OP_POP: case OP_STRING:
switch (oldop) { sfree(findstring((long)fp->f_opcodes[count-1]));
case OP_ASSIGN:
fp->f_opcodes[count-1] = OP_ASSIGNPOP;
oldop = OP_ASSIGNPOP;
return;
case OP_NUMBER:
case OP_IMAGINARY:
q = constvalue(fp->f_opcodes[count-1]);
qfree(q);
break;
case OP_STRING:
sfree(findstring((long)fp->f_opcodes[count-1]));
break;
case OP_LOCALADDR:
case OP_PARAMADDR:
break;
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;
}
if (cut) {
fp->f_opcodecount -= diff;
oldop = OP_NOP;
oldoldop = OP_NOP;
fprintf(stderr,
"Line %ld: unused value ignored\n",
linenumber());
return;
}
break; break;
case OP_NEGATE: case OP_LOCALADDR:
if (oldop == OP_NUMBER) { case OP_PARAMADDR:
q = constvalue(fp->f_opcodes[count-1]); break;
fp->f_opcodes[count-1] = addqconstant(qneg(q)); case OP_GLOBALADDR:
qfree(q); diff = 1 + PTR_SIZE;
return; break;
} case OP_UNDEF:
fp->f_opcodecount -= 1;
oldop = OP_NOP;
oldoldop = OP_NOP;
return;
default:
cut = FALSE;
}
if (cut) {
fp->f_opcodecount -= diff;
oldop = OP_NOP;
oldoldop = OP_NOP;
errorcount--;
scanerror(T_NULL, "Constant before comma operator");
return;
}
break;
case OP_NEGATE:
if (oldop == OP_NUMBER) {
q = constvalue(fp->f_opcodes[count-1]);
fp->f_opcodes[count-1] = addqconstant(qneg(q));
qfree(q);
return;
}
} }
if (oldop == OP_NUMBER) { if (oldop == OP_NUMBER) {
if (oldoldop == OP_NUMBER) { if (oldoldop == OP_NUMBER) {
q1 = constvalue(fp->f_opcodes[count - 3]); q1 = constvalue(fp->f_opcodes[count - 3]);
q2 = constvalue(fp->f_opcodes[count - 1]); q2 = constvalue(fp->f_opcodes[count - 1]);
switch (op) { switch (op) {
case OP_DIV: case OP_DIV:
if (qiszero(q2)) { if (qiszero(q2)) {
cut = FALSE;
break;
}
q = qqdiv(q1,q2);
break;
case OP_MUL:
q = qmul(q1,q2);
break;
case OP_ADD:
q = qqadd(q1,q2);
break;
case OP_SUB:
q = qsub(q1,q2);
break;
case OP_POWER:
if (qisfrac(q2) || qisneg(q2))
cut = FALSE;
else
q = qpowi(q1,q2);
break;
default:
cut = FALSE; cut = FALSE;
break;
}
q = qqdiv(q1,q2);
break;
case OP_MUL:
q = qmul(q1,q2);
break;
case OP_ADD:
q = qqadd(q1,q2);
break;
case OP_SUB:
q = qsub(q1,q2);
break;
case OP_POWER:
if (qisfrac(q2) || qisneg(q2))
cut = FALSE;
else
q = qpowi(q1,q2);
break;
default:
cut = FALSE;
} }
if (cut) { if (cut) {
qfree(q1); qfree(q1);

144
blkcpy.c
View File

@@ -1,7 +1,7 @@
/* /*
* blkcpy - general values and related routines used by the calculator * blkcpy - general values and related routines used by the calculator
* *
* Copyright (C) 1999 Landon Curt Noll and Ernest Bowen * Copyright (C) 1999-2006 Landon Curt Noll and Ernest Bowen
* *
* Primary author: Landon Curt Noll * Primary author: Landon Curt Noll
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.4 $ * @(#) $Revision: 29.9 $
* @(#) $Id: blkcpy.c,v 29.4 2004/02/23 07:47:31 chongo Exp $ * @(#) $Id: blkcpy.c,v 29.9 2006/05/20 08:43:55 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/blkcpy.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/blkcpy.c,v $
* *
* Under source code control: 1997/04/18 20:41:26 * Under source code control: 1997/04/18 20:41:26
@@ -73,51 +73,51 @@ copystod(VALUE *svp, long ssi, long num, VALUE *dvp, long dsi)
* determine/check source type * determine/check source type
*/ */
switch(svp->v_type) { switch(svp->v_type) {
case V_NBLOCK: case V_NBLOCK:
if (svp->v_nblock->subtype & V_NOCOPYFROM) if (svp->v_nblock->subtype & V_NOCOPYFROM)
return E_COPY15; return E_COPY15;
sblk = svp->v_nblock->blk; sblk = svp->v_nblock->blk;
if (sblk->data == NULL) if (sblk->data == NULL)
return E_COPY8; return E_COPY8;
break; break;
case V_BLOCK: case V_BLOCK:
sblk = svp->v_block; sblk = svp->v_block;
break; break;
case V_STR: case V_STR:
case V_OCTET: case V_OCTET:
case V_NUM: case V_NUM:
case V_FILE: case V_FILE:
case V_MAT: case V_MAT:
case V_LIST: case V_LIST:
break; break;
default: default:
return E_COPY9; return E_COPY9;
} }
/* /*
* determine/check destination type * determine/check destination type
*/ */
switch(dvp->v_type) { switch(dvp->v_type) {
case V_NBLOCK: case V_NBLOCK:
if (dvp->v_nblock->subtype & V_NOCOPYTO) if (dvp->v_nblock->subtype & V_NOCOPYTO)
return E_COPY16; return E_COPY16;
noreloc |=((dvp->v_nblock->subtype & V_NOREALLOC) != 0); noreloc |=((dvp->v_nblock->subtype & V_NOREALLOC) != 0);
dblk = dvp->v_nblock->blk; dblk = dvp->v_nblock->blk;
if (dblk->data == NULL) if (dblk->data == NULL)
return E_COPY10; return E_COPY10;
break; break;
case V_BLOCK: case V_BLOCK:
noreloc = ((dvp->v_subtype & V_NOREALLOC) != 0); noreloc = ((dvp->v_subtype & V_NOREALLOC) != 0);
dblk = dvp->v_block; dblk = dvp->v_block;
break; break;
case V_STR: case V_STR:
case V_NUM: case V_NUM:
case V_FILE: case V_FILE:
case V_MAT: case V_MAT:
case V_LIST: case V_LIST:
break; break;
default: default:
return E_COPY11; return E_COPY11;
} }
/* /*
@@ -280,7 +280,7 @@ copymat2mat(MATRIX *smat, long ssi, long num, MATRIX *dmat, long dsi)
VALUE *vp; VALUE *vp;
VALUE *vq; VALUE *vq;
VALUE *vtemp; VALUE *vtemp;
short subtype; unsigned short subtype;
if (ssi > smat->m_size) if (ssi > smat->m_size)
return E_COPY2; return E_COPY2;
@@ -311,7 +311,7 @@ copymat2mat(MATRIX *smat, long ssi, long num, MATRIX *dmat, long dsi)
subtype = vq->v_subtype; subtype = vq->v_subtype;
freevalue(vq); freevalue(vq);
*vq = *vp; *vq = *vp;
vq->v_subtype = subtype; vq->v_subtype |= subtype;
} }
free(vtemp); free(vtemp);
return 0; return 0;
@@ -329,7 +329,7 @@ copyblk2mat(BLOCK *blk, long ssi, long num, MATRIX *dmat, long dsi)
VALUE *vq; VALUE *vq;
VALUE *vtemp; VALUE *vtemp;
long i; long i;
short subtype; unsigned short subtype;
if (ssi > blk->datalen) if (ssi > blk->datalen)
return E_COPY2; return E_COPY2;
@@ -363,7 +363,7 @@ copyblk2mat(BLOCK *blk, long ssi, long num, MATRIX *dmat, long dsi)
subtype = vq->v_subtype; subtype = vq->v_subtype;
freevalue(vq); freevalue(vq);
*vq = *vp; *vq = *vp;
vq->v_subtype = subtype; vq->v_subtype |= subtype;
} }
free(vtemp); free(vtemp);
return 0; return 0;
@@ -429,6 +429,7 @@ copymat2list(MATRIX *smat, long ssi, long num, LIST *lp, long dsi)
LISTELEM *ep; LISTELEM *ep;
VALUE *vtemp; VALUE *vtemp;
long i; long i;
unsigned short subtype;
if (ssi > smat->m_size) if (ssi > smat->m_size)
return E_COPY2; return E_COPY2;
@@ -456,8 +457,10 @@ copymat2list(MATRIX *smat, long ssi, long num, LIST *lp, long dsi)
ep = listelement(lp, (long) dsi); ep = listelement(lp, (long) dsi);
i = num; i = num;
while (i-- > 0) { while (i-- > 0) {
subtype = ep->e_value.v_subtype;
freevalue(&ep->e_value); freevalue(&ep->e_value);
ep->e_value = *vq++; ep->e_value = *vq++;
ep->e_value.v_subtype |= subtype;
ep = ep->e_next; ep = ep->e_next;
} }
free(vtemp); free(vtemp);
@@ -476,7 +479,7 @@ copylist2mat(LIST *lp, long ssi, long num, MATRIX *dmat, long dsi)
LISTELEM *ep; LISTELEM *ep;
VALUE *vtemp; VALUE *vtemp;
long i; long i;
short subtype; unsigned short subtype;
if (ssi > lp->l_count) if (ssi > lp->l_count)
return E_COPY2; return E_COPY2;
@@ -508,7 +511,7 @@ copylist2mat(LIST *lp, long ssi, long num, MATRIX *dmat, long dsi)
subtype = vq->v_subtype; subtype = vq->v_subtype;
freevalue(vq); freevalue(vq);
*vq = *vp; *vq = *vp;
vq->v_subtype = subtype; vq->v_subtype |= subtype;
} }
free(vtemp); free(vtemp);
return 0; return 0;
@@ -526,6 +529,7 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
LISTELEM *dep; LISTELEM *dep;
VALUE *vtemp; VALUE *vtemp;
VALUE *vp; VALUE *vp;
unsigned short subtype;
if (ssi > slp->l_count) if (ssi > slp->l_count)
return E_COPY2; return E_COPY2;
@@ -555,8 +559,10 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
vp = vtemp; vp = vtemp;
i = num; i = num;
while (i-- > 0) { while (i-- > 0) {
subtype = dep->e_value.v_subtype;
freevalue(&dep->e_value); freevalue(&dep->e_value);
dep->e_value = *vp++; dep->e_value = *vp++;
dep->e_value.v_subtype |= subtype;
dep = dep->e_next; dep = dep->e_next;
} }
free(vtemp); free(vtemp);
@@ -806,13 +812,13 @@ copystr2str(STRING *sstr, long ssi, long num, STRING *dstr, long dsi)
{ {
char *c, *c1; char *c, *c1;
if (num < 0 || ssi + num > sstr->s_len) if (num < 0 || (size_t)(ssi + num) > sstr->s_len)
num = sstr->s_len - ssi; num = sstr->s_len - ssi;
if (num <= 0) if (num <= 0)
return 0; /* Nothing to be copied */ return 0; /* Nothing to be copied */
if (dsi < 0) /* default destination index */ if (dsi < 0) /* default destination index */
dsi = 0; dsi = 0;
if (dsi + num > dstr->s_len) if ((size_t)(dsi + num) > dstr->s_len)
num = dstr->s_len - dsi; num = dstr->s_len - dsi;
c1 = sstr->s_str + ssi; c1 = sstr->s_str + ssi;
c = dstr->s_str + dsi; c = dstr->s_str + dsi;
@@ -838,7 +844,7 @@ copyblk2str(BLOCK *sblk, long ssi, long num, STRING *dstr, long dsi)
return 0; /* Nothing to be copied */ return 0; /* Nothing to be copied */
if (dsi < 0) /* default destination index */ if (dsi < 0) /* default destination index */
dsi = 0; dsi = 0;
if (dsi + num > dstr->s_len) if ((size_t)(dsi + num) > dstr->s_len)
num = dstr->s_len - dsi; num = dstr->s_len - dsi;
c1 = sblk->data + ssi; c1 = sblk->data + ssi;
c = (USB8 *)dstr->s_str + dsi; c = (USB8 *)dstr->s_str + dsi;
@@ -852,18 +858,18 @@ copyblk2str(BLOCK *sblk, long ssi, long num, STRING *dstr, long dsi)
int int
copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi) copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi)
{ {
long len; size_t len;
char *c, *c1; char *c, *c1;
len = (long)strlen(sstr); len = strlen(sstr);
if (num < 0 || ssi + num > len) if (num < 0 || (size_t)(ssi + num) > len)
num = len - ssi; num = len - ssi;
if (num <= 0) /* Nothing to be copied */ if (num <= 0) /* Nothing to be copied */
return 0; return 0;
if (dsi < 0) if (dsi < 0)
dsi = 0; /* Default destination index */ dsi = 0; /* Default destination index */
if (dsi + num > dstr->s_len) if ((size_t)(dsi + num) > dstr->s_len)
num = dstr->s_len - dsi; num = dstr->s_len - dsi;
c1 = sstr + ssi; c1 = sstr + ssi;
c = dstr->s_str + dsi; c = dstr->s_str + dsi;
@@ -879,16 +885,16 @@ copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi)
int int
copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc) copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
{ {
int len; size_t len;
int newlen; size_t newlen;
int newsize; size_t newsize;
USB8 *newdata; USB8 *newdata;
len = strlen(str) + 1; len = strlen(str) + 1;
if (ssi > len) if (ssi > 0 && (size_t)ssi > len)
return E_COPY2; return E_COPY2;
if (num < 0 || ssi + num > len) if (num < 0 || (size_t)(ssi + num) > len)
num = len - ssi; num = len - ssi;
if (num <= 0) /* Nothing to be copied */ if (num <= 0) /* Nothing to be copied */
return 0; return 0;
@@ -897,7 +903,7 @@ copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
newlen = dsi + num; newlen = dsi + num;
if (newlen <= 0) if (newlen <= 0)
return E_COPY7; return E_COPY7;
if (newlen >= dblk->maxsize) { if (newlen >= (size_t)dblk->maxsize) {
if (noreloc) if (noreloc)
return E_COPY17; return E_COPY17;
newsize = (1 + newlen/dblk->blkchunk) * dblk->blkchunk; newsize = (1 + newlen/dblk->blkchunk) * dblk->blkchunk;
@@ -910,7 +916,7 @@ copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
dblk->maxsize = newsize; dblk->maxsize = newsize;
} }
memmove(dblk->data + dsi, str + ssi, num); memmove(dblk->data + dsi, str + ssi, num);
if (newlen > dblk->datalen) if (newlen > (size_t)dblk->datalen)
dblk->datalen = newlen; dblk->datalen = newlen;
return 0; return 0;
} }
@@ -978,8 +984,8 @@ memmove(void *s1, const void *s2, CALC_SIZE_T n)
int int
copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc) copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
{ {
long newlen; size_t newlen;
long newsize; size_t newsize;
USB8 *newdata; USB8 *newdata;
#if CALC_BYTE_ORDER == BIG_ENDIAN #if CALC_BYTE_ORDER == BIG_ENDIAN
ZVALUE *swnum; /* byte swapped numerator */ ZVALUE *swnum; /* byte swapped numerator */
@@ -995,10 +1001,10 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
return E_COPY5; return E_COPY5;
if (dsi < 0) if (dsi < 0)
dsi = dblk->datalen; dsi = dblk->datalen;
newlen = dsi + (long)(num*sizeof(HALF)); newlen = dsi + (num*sizeof(HALF));
if (newlen <= 0) if (newlen <= 0)
return E_COPY7; return E_COPY7;
if (newlen >= dblk->maxsize) { if (newlen >= (size_t)dblk->maxsize) {
if (noreloc) if (noreloc)
return E_COPY17; return E_COPY17;
newsize = (1 + newlen/dblk->blkchunk) * dblk->blkchunk; newsize = (1 + newlen/dblk->blkchunk) * dblk->blkchunk;
@@ -1017,7 +1023,7 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
memmove(dblk->data+dsi, (char *)(swnum->v+ssi), num*sizeof(HALF)); memmove(dblk->data+dsi, (char *)(swnum->v+ssi), num*sizeof(HALF));
zfree(*swnum); zfree(*swnum);
#endif #endif
if (newlen > dblk->datalen) if (newlen > (size_t)dblk->datalen)
dblk->datalen = newlen; dblk->datalen = newlen;
return 0; return 0;
} }
@@ -1029,7 +1035,7 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
int int
copyblk2num(BLOCK *sblk, long ssi, long num, NUMBER *dnum, long dsi, NUMBER **res) copyblk2num(BLOCK *sblk, long ssi, long num, NUMBER *dnum, long dsi, NUMBER **res)
{ {
long newlen; size_t newlen;
NUMBER *ret; /* cloned and modified numerator */ NUMBER *ret; /* cloned and modified numerator */
#if CALC_BYTE_ORDER == BIG_ENDIAN #if CALC_BYTE_ORDER == BIG_ENDIAN
HALF *swapped; /* byte swapped input data */ HALF *swapped; /* byte swapped input data */
@@ -1048,7 +1054,7 @@ copyblk2num(BLOCK *sblk, long ssi, long num, NUMBER *dnum, long dsi, NUMBER **re
return E_COPY5; return E_COPY5;
if (dsi < 0) if (dsi < 0)
dsi = dnum->num.len; dsi = dnum->num.len;
newlen = dsi + (long)((num+sizeof(HALF)-1)/sizeof(HALF)); newlen = dsi + ((num+sizeof(HALF)-1)/sizeof(HALF));
if (newlen <= 0) if (newlen <= 0)
return E_COPY7; return E_COPY7;

View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: block.c,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: block.c,v 29.3 2006/05/01 19:16:57 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/block.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/block.c,v $
* *
* Under source code control: 1997/02/27 00:29:40 * Under source code control: 1997/02/27 00:29:40
@@ -57,7 +57,7 @@ static void blkchk(BLOCK*);
* *
* given: * given:
* len - initial memory length of the block * len - initial memory length of the block
* type - BLK_TYPE_XXX * type - BLK_TYPE_XYZ
* chunk - allocation chunk size * chunk - allocation chunk size
* *
* returns: * returns:

View File

@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.15 $ # @(#) $Revision: 29.18 $
# @(#) $Id: Makefile,v 29.15 2003/01/05 08:10:56 chongo Exp $ # @(#) $Id: Makefile,v 29.18 2006/05/20 19:32:40 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/Makefile,v $
# #
# Under source code control: 1991/07/21 05:00:54 # Under source code control: 1991/07/21 05:00:54
@@ -170,13 +170,14 @@ CALC_FILES= README bigprime.cal deg.cal ellip.cal lucas.cal lucas_chk.cal \
lucas_tbl.cal mersenne.cal mod.cal pell.cal pi.cal pix.cal \ lucas_tbl.cal mersenne.cal mod.cal pell.cal pi.cal pix.cal \
pollard.cal poly.cal psqrt.cal quat.cal regress.cal solve.cal \ pollard.cal poly.cal psqrt.cal quat.cal regress.cal solve.cal \
sumsq.cal surd.cal unitfrac.cal varargs.cal chrem.cal mfactor.cal \ sumsq.cal surd.cal unitfrac.cal varargs.cal chrem.cal mfactor.cal \
bindings randmprime.cal test1700.cal randrun.cal \ bindings randmprime.cal test1700.cal randrun.cal linear.cal \
randbitrun.cal bernoulli.cal test2300.cal test2600.cal \ randbitrun.cal bernoulli.cal test2300.cal test2600.cal \
test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \ test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \
test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \ test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \
beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \ beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \
randomrun.cal repeat.cal xx_print.cal natnumset.cal qtime.cal \ randomrun.cal repeat.cal xx_print.cal natnumset.cal qtime.cal \
test8400.cal test8500.cal test8600.cal chi.cal intfile.cal test8400.cal test8500.cal test8600.cal chi.cal intfile.cal screen.cal \
dotest.cal set8700.cal set8700.line
# These files are found (but not built) in the distribution # These files are found (but not built) in the distribution
# #

View File

@@ -12,7 +12,7 @@ Normally a resource file will simply define some functions. By default,
most resource files will print out a short message when they are read. most resource files will print out a short message when they are read.
For example: For example:
> read lucas ; read lucas
lucas(h,n) defined lucas(h,n) defined
gen_u0(h,n,v1) defined gen_u0(h,n,v1) defined
gen_v1(h,n) defined gen_v1(h,n) defined
@@ -22,9 +22,9 @@ will cause calc to load and execute the 'lucas.cal' resource file.
Executing the resource file will cause several functions to be defined. Executing the resource file will cause several functions to be defined.
Executing the lucas function: Executing the lucas function:
> lucas(149,60) ; lucas(149,60)
1 1
> lucas(146,61) ; lucas(146,61)
0 0
shows that 149*2^60-1 is prime whereas 146*2^61-1 is not. shows that 149*2^60-1 is prime whereas 146*2^61-1 is not.
@@ -180,6 +180,38 @@ deg.cal
Calculate in degrees, minutes, and seconds. Calculate in degrees, minutes, and seconds.
dotest.cal
dotest(dotest_file [,dotest_code [,dotest_maxcond]])
dotest_file
Search along CALCPATH for dotest_file, which contains lines that
should evaluate to 1. Comment lines and empty lines are ignored.
Comment lines should use ## instead of the multi like /* ... */
because lines are evaluated one line at a time.
dotest_code
Assign the code number that is to be printed at the start of
each non-error line and after **** in each error line.
The default code number is 999.
dotest_maxcond
The maximum number of error conditions that may be detected.
An error condition is not a sign of a problem, in some cases
a line deliberately forces an error condition. A value of -1,
the default, implies a maximum of 2147483647.
Global variables and functions must be declared ahead of time because
the dotest scope of evaluation is a line at a time. For example:
read dotest.cal
read set8700.cal
dotest("set8700.line");
ellip.cal ellip.cal
efactor(iN, ia, B, force) efactor(iN, ia, B, force)
@@ -222,6 +254,14 @@ intfile.cal
of the integer become the last octets of the file. of the integer become the last octets of the file.
linear.cal
linear(x0, y0, x1, y1, x)
Returns the value y such that (x,y) in on the line (x0,y0), (x1,y1).
Requires x0 != y0.
lucas.cal lucas.cal
lucas(h, n) lucas(h, n)
@@ -497,6 +537,58 @@ regress.cal
Errors are reported with '****' messages, or worse. :-) Errors are reported with '****' messages, or worse. :-)
screen.cal
up
CUU /* same as up */
down = CUD
CUD /* same as down */
forward
CUF /* same as forward */
back = CUB
CUB /* same as back */
save
SCP /* same as save */
restore
RCP /* same as restore */
cls
home
eraseline
off
bold
faint
italic
blink
rapidblink
reverse
concealed
/* Lowercase indicates foreground, uppercase background */
black
red
green
yellow
blue
magenta
cyan
white
Black
Red
Green
Yellow
Blue
Magenta
Cyan
White
Define ANSI control sequences providing (i.e., cursor movement, changing
foreground or background color, etc.) for VT100 terminals and terminal
window emulators (i.e., xterm, Apple OS/X Terminal, etc.) that support them.
For example:
read screen
print green:"This is green. ":red:"This is red.":black
seedrandom.cal seedrandom.cal
seedrandom(seed1, seed2, bitsize [,trials]) seedrandom(seed1, seed2, bitsize [,trials])
@@ -515,6 +607,24 @@ seedrandom.cal
Blum primes for the modulus. Blum primes for the modulus.
set8700.cal
set8700_getA1() defined
set8700_getA2() defined
set8700_getvar() defined
set8700_f(set8700_x) defined
set8700_g(set8700_x) defined
Declare globals and define functions needed by dotest() (see
dotest.cal) to evaluate set8700.line a line at a time.
set8700.line
A line-by-line evaluation file for dotest() (see dotest.cal).
The set8700.cal file (and dotest.cal) should be read first.
solve.cal solve.cal
solve(low, high, epsilon) solve(low, high, epsilon)
@@ -825,8 +935,8 @@ xx_print.cal
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.9 $ ## @(#) $Revision: 29.12 $
## @(#) $Id: README,v 29.9 2003/01/05 08:10:56 chongo Exp $ ## @(#) $Id: README,v 29.12 2006/05/21 04:41:09 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/README,v $ ## @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/README,v $
## ##
## Under source code control: 1990/02/15 01:50:32 ## Under source code control: 1990/02/15 01:50:32

193
cal/dotest.cal Normal file
View File

@@ -0,0 +1,193 @@
/*
* dotest - test truth statements found in line tests of dotest_testline file
*
* This file was created by Ernest Bowen <ebowen at une dot edu dot au>
* and modified by Landon Curt Noll.
*
* This dotest_code has been placed in the public domain. Please do not
* copyright this dotest_code.
*
* ERNEST BOWEN AND LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER-
* CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT
* NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* @(#) $Revision: 29.2 $
* @(#) $Id: dotest.cal,v 29.2 2006/05/21 00:55:27 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/dotest.cal,v $
*
* This file is not covered under version 2.1 of the GNU LGPL.
*
* Under source dotest_code control: 2006/03/08 05:54:09
* File existed as early as: 2006
*/
/*
* dotest - perform tests from dotest_testline file
*
* given:
* dotest_file filename containing single test lines
* dotest_code regress.cal test number to use (def: 0)
* dotest_maxcond max error conditions allowed (def: <0 ==> 2^31-1)
*
* returns:
* number of line test failures
*
* NOTE: All variables used by the dotest() function start with "dotest_".
* The dotest_file and dotest_read should not use any variable
* that starts with "dotest_".
*/
define dotest(dotest_file, dotest_code = 0, dotest_maxcond = -1)
{
local dotest_f_file; /* open file containing test lines */
local dotest_testline; /* test line */
local dotest_testeval; /* eval value from dotest_testline test line */
local dotest_tmperrcnt; /* temp error count after line test */
local dotest_errcnt; /* total number of errors */
local dotest_failcnt; /* number of line tests failed */
local dotest_testnum; /* number of test lines evaluated */
local dotest_linenum; /* test line number */
local dotest_old_errmax; /* value of errmax() prior to calling */
local dotest_old_errcount; /* value of errcount() prior to calling */
/*
* preserve calling stats
*/
dotest_old_errmax = errmax();
dotest_old_errcount = errcount(0);
/*
* initialize test accounting
*/
dotest_errcnt = errcount();
dotest_failcnt = 0;
dotest_testnum = 0;
dotest_linenum = 0;
/*
* setup error accounting for dotest
*/
if (dotest_maxcond >= 0 && dotest_maxcond < 2147483647) {
errmax(dotest_maxcond + dotest_old_errcount + 1),;
} else {
errmax(2147483647),;
}
/*
* open the test line file
*/
printf("%d-: opening line file: %d", dotest_code, dotest_file);
dotest_f_file = fpathopen(dotest_file, "r");
if (!isfile(dotest_f_file)) {
printf("**** Unable to file or open file \"%s\"\n",
dotest_file);
quit;
}
printf('%d: testing "%s"\n', dotest_code, dotest_file);
/*
* perform dotest_testline test on each line of the file
*/
for (;;) {
/* get the next test line */
dotest_testline = fgets(dotest_f_file);
++dotest_linenum;
if (iserror(dotest_testline)) {
quit "**** Error while reading file";
} else if (isnull(dotest_testline)) {
/* EOF - end of test file */
break;
}
/* skip empty lines */
if (dotest_testline == "\n") {
continue;
}
/* evaluate the test line */
dotest_testeval = eval(dotest_testline);
/* ignore white space or comment lines */
if (isnull(dotest_testeval)) {
continue;
}
/* look for test line parse errors */
if (iserror(dotest_testeval)) {
printf("**** evaluation error: ");
++dotest_failcnt;
/* look for test line dotest_failcnt */
} else if (dotest_testeval != 1) {
printf("**** did not return 1: ");
++dotest_failcnt;
}
/* show the test line we just performed */
printf("%d-%d: %s", dotest_code, dotest_linenum, dotest_testline);
/* error accounting */
dotest_tmperrcnt = errcount() - dotest_errcnt;
if (dotest_tmperrcnt > 0) {
/* report any other errors */
if (dotest_tmperrcnt > 1) {
printf("%d-%d: NOTE: %d error conditions(s): %s\n",
dotest_code, dotest_linenum, dotest_tmperrcnt);
}
/* report the calc error string */
printf("%d-%d: NOTE: last error string: %s\n",
dotest_code, dotest_linenum, strerror());
/* new error count level */
dotest_errcnt = errcount();
if (dotest_maxcond >= 0 &&
dotest_old_errcount-dotest_errcnt > dotest_maxcond) {
printf("%d-%d: total error conditions: %d > %d\n",
dotest_code, dotest_linenum,
dotest_maxcond, dotest_old_errcount-dotest_errcnt);
}
}
}
/*
* test the close of the line file
*/
printf("%d-: detected %d error condition(s), many of which may be OK\n",
dotest_code, dotest_old_errcount-dotest_errcnt);
printf("%d-: closing line file: %d\n", dotest_code, dotest_file);
fclose(dotest_f_file);
/*
* test line file accounting
*/
if (dotest_failcnt > 0) {
printf("**** %d-: %d test failure(s) in %d line(s)\n",
dotest_code, dotest_failcnt, dotest_linenum);
} else {
printf("%d-: no failure(s) in %d line(s)\n",
dotest_code, dotest_linenum);
}
/*
* preppare to return to the caller environment
*
* We increase the caller's error count by the number
* of line tests that failed, not the number of internal
* errors that were noted.
*/
errmax(dotest_old_errmax),;
errcount(dotest_old_errcount + dotest_failcnt),;
/*
* All Done!!! -- Jessica Noll, Age 2
*/
return dotest_failcnt;
}

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: ellip.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $ * @(#) $Id: ellip.cal,v 29.3 2006/03/07 22:16:25 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/ellip.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/ellip.cal,v $
* *
* Under source code control: 1990/02/15 01:50:33 * Under source code control: 1990/02/15 01:50:33
@@ -141,7 +141,7 @@ define point_mul(p1, p2)
if (p2 == 1) if (p2 == 1)
return p1; return p1;
if (p1 == p2) if (p1 == p2)
return point_square(&p1); return point_square(`p1);
obj point r; obj point r;
m = (minv(p2.x - p1.x, N) * (p2.y - p1.y)) % N; m = (minv(p2.x - p1.x, N) * (p2.y - p1.y)) % N;
if (m == 0) { if (m == 0) {
@@ -185,9 +185,9 @@ define point_pow(p, pow)
r = p; r = p;
t = p; t = p;
for (bit = 2; ((bit <= pow) && (f == 0)); bit <<= 1) { for (bit = 2; ((bit <= pow) && (f == 0)); bit <<= 1) {
t = point_square(&t); t = point_square(`t);
if (bit & pow) if (bit & pow)
r = point_mul(&t, &r); r = point_mul(`t, `r);
} }
return r; return r;
} }

26
cal/linear.cal Normal file
View File

@@ -0,0 +1,26 @@
/*
* linear - perform a simple two point 2D linear interpolation
*
* given:
* x0, y0 first known point on the line
* x1, y1 second knonw point on the line
* x a given point to interpolate on
*
* returns:
* y such that (x,y) is on the line defined by (x0,y0) and (x1,y1)
*
* NOTE: The line cannot be vertical. So x0 != y0.
*/
define linear(x0, y0, x1, y1, x)
{
/* firewall */
if (!isnum(x0) || ! isnum(y0) || !isnum(x1) || ! isnum(y1) || !isnum(x)) {
quit "non-numeric argument passed to linear";
}
if (x0 == x1) {
quit "linear given a line with an infinite slope";
}
/* return y = y0 + (delta_Y/delta_X) * (x - x0) */
return y0 + (((y1-y0)/(x1-x0)) * (x - x0));
}

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: natnumset.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $ * @(#) $Id: natnumset.cal,v 29.3 2006/05/01 19:19:46 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/natnumset.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/natnumset.cal,v $
* *
* Under source code control: 1997/09/07 23:53:51 * Under source code control: 1997/09/07 23:53:51
@@ -471,7 +471,7 @@ define set_plus(a) = set_sum(a);
define interval(a, b) define interval(a, b)
{ {
local i, j, s; local i, j, s;
static tail = str("\0\1\3\7\17\37\77\177\377"); static tail = "\0\1\3\7\17\37\77\177\377";
if (!isint(a) || !isint(b)) if (!isint(a) || !isint(b))
quit "Non-integer argument for interval"; quit "Non-integer argument for interval";

View File

@@ -1,7 +1,7 @@
/* /*
* pi - various routines to calculate pi * pi - various routines to calculate pi
* *
* Copyright (C) 1999 David I. Bell * Copyright (C) 1999-2004 David I. Bell
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.5 $
* @(#) $Id: pi.cal,v 29.3 2004/02/23 06:06:38 chongo Exp $ * @(#) $Id: pi.cal,v 29.5 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/pi.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/pi.cal,v $
* *
* Under source code control: 1991/05/22 21:56:37 * Under source code control: 1991/05/22 21:56:37
@@ -104,8 +104,7 @@ define piforever()
* Next approximation * Next approximation
*/ */
p = k * k; p = k * k;
q = k << 1; q = k + ++k;
++k;
a2 = a; a2 = a;
b2 = b; b2 = b;

View File

@@ -1,7 +1,7 @@
/* /*
* regress - calc regression and correctness test suite * regress - calc regression and correctness test suite
* *
* Copyright (C) 1999-2003 David I. Bell and Landon Curt Noll * Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.18 $ * @(#) $Revision: 29.26 $
* @(#) $Id: regress.cal,v 29.18 2004/02/23 05:58:45 chongo Exp $ * @(#) $Id: regress.cal,v 29.26 2006/06/02 09:49:13 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/regress.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/regress.cal,v $
* *
* Under source code control: 1990/02/15 01:50:36 * Under source code control: 1990/02/15 01:50:36
@@ -1310,9 +1310,14 @@ define test_functions()
* verify sleep * verify sleep
*/ */
vrfy(sleep(1/5) == null(), '1153: sleep(1/5) == null()'); vrfy(sleep(1/5) == null(), '1153: sleep(1/5) == null()');
vrfy(sleep(1) == null(), '1154: sleep(1) == null()'); vrfy(sleep(1/100) == null(), '1154: sleep(1/100) == null()');
print '1155: Ending test_functions'; /*
* verify calcpath
*/
vrfy(isstr(calcpath()), '1155: isstr(calcpath())');
print '1156: Ending test_functions';
} }
print '017: parsed test_functions()'; print '017: parsed test_functions()';
@@ -2571,6 +2576,49 @@ define test_2600()
i = config("sqrt", i); i = config("sqrt", i);
print tnum++: ': i = config("sqrt", i)'; print tnum++: ': i = config("sqrt", i)';
i = epsilon(1e-100),;
print tnum++: ': i = epsilon(1e-100),;';
vrfy(ln(exp(6)) == 6,
strcat(str(tnum++), ': ln(exp(6)) == 6'));
vrfy(ln(exp(4)^4) == 16,
strcat(str(tnum++), ': ln(exp(4)^4) == 16'));
vrfy(ln(exp(6.5)^8) == 52,
strcat(str(tnum++), ': ln(exp(6.5)^8) == 52'));
vrfy(ln(exp(5)^16) == 80,
strcat(str(tnum++), ': ln(exp(5)^16) == 80'));
vrfy(ln(exp(4.5)^4) == 18,
strcat(str(tnum++), ': ln(exp(4.5)^4) == 18'));
vrfy(ln(exp(4)^8) == 32,
strcat(str(tnum++), ': ln(exp(4)^8) == 32'));
vrfy(ln(exp(60/11)^11) == 60,
strcat(str(tnum++), ': ln(exp(60/11)^11) == 60'));
vrfy(ln(exp(6)^15) == 90,
strcat(str(tnum++), ': ln(exp(6)^11) == 90'));
vrfy(ln(exp(80/17)^17) == 80,
strcat(str(tnum++), ': ln(exp(80/17)^17) == 80'));
vrfy(ln(exp(6)^15) == 90,
strcat(str(tnum++), ': ln(exp(6)^15) == 90'));
vrfy(ln(exp(5)^18) == 90,
strcat(str(tnum++), ': ln(exp(5)^18) == 90'));
vrfy(log(1e6) == 6,
strcat(str(tnum++), ': log(1e6)) == 6'));
vrfy(log(1) == 0,
strcat(str(tnum++), ': log(1)) == 0'));
vrfy(log(100) == 2,
strcat(str(tnum++), ': log(100)) == 2'));
vrfy(log(1e66) == 66,
strcat(str(tnum++), ': log(1e66)) == 66'));
vrfy(log(1e127) == 127,
strcat(str(tnum++), ': log(1e127)) == 127'));
vrfy(round(log(17^47),10) == 57.8310993048,
strcat(str(tnum++),
': round(log(17^47),10) == 57.8310993048'));
vrfy(round(log(127),10) == 2.103803721,
strcat(str(tnum++),
': round(log(127),10) == 2.103803721'));
epsilon(i),;
print tnum++: ': epsilon(i),;';
print tnum: ': Ending extensive numeric function test'; print tnum: ': Ending extensive numeric function test';
} }
print '037: parsed test_2600()'; print '037: parsed test_2600()';
@@ -3356,11 +3404,12 @@ print '070: parsed test_redc()';
*/ */
define test_fileops() define test_fileops()
{ {
local a, b, c, f, m, n, x, y, z; local a, b, c, f, m, n, p, r, x, y, z;
local L = "Landon"; local L = "Landon";
local C = "Curt"; local C = "Curt";
local N = "Noll"; local N = "Noll";
local LCN = "Landon\nCurt\nNoll\n"; local LCN = "Landon\nCurt\nNoll\n";
local long = "0123456789abcdef0123456789abcdef";
print '4200: Beginning test_fileops'; print '4200: Beginning test_fileops';
@@ -3458,13 +3507,37 @@ define test_fileops()
vrfy(y == "Noll", '4258: y == "Noll"'); vrfy(y == "Noll", '4258: y == "Noll"');
vrfy(isnull(fclose(f)), '4259: isnull(fclose(f))'); vrfy(isnull(fclose(f)), '4259: isnull(fclose(f))');
/*
* fpathopen tests
*/
vrfy(!iserror(p=fpathopen("junk4200","r",".")),
'4260: !iserror(p=fparhopen("junk4200","r","."))');
vrfy(!iserror(fclose(p)), '4261: !iserror(fclose(p))');
vrfy(!iserror(r=fpathopen("regress.cal","r")),
'4262: !iserror(r=fparhopen("regress.cal","r","."))');
vrfy(!iserror(fclose(r)), '4263: !iserror(fclose(r))');
/*
* verify non-stack overflow on long filenames
*/
long = long + long + long + long;
print '4264: long = long + long + long + long;';
long = long + long + long + long;
print '4265: long = long + long + long + long;';
vrfy(strlen(long) == 512, '4266: strlen(long) == 512');
/* bump ecnt up by 1 */
++ecnt;
print '4267: ++ecnt;';
vrfy(isfile(p=fopen(long,"r")) == 0,
'4268: isfile(p=fopen(long,"r")) == 0');
/* /*
* cleanup * cleanup
*/ */
x = rm("junk4200"); x = rm("junk4200");
print '4260: x = rm("junk4200")'; print '4269: x = rm("junk4200")';
print '4261: Ending test_fileops'; print '4270: Ending test_fileops';
} }
print '071: parsed test_fileops()'; print '071: parsed test_fileops()';
@@ -5088,7 +5161,7 @@ define test_assign(base, work)
Y5800 = base+4; Y5800 = base+4;
print base+4: ': Y5800 = base+4'; print base+4: ': Y5800 = base+4';
obj xy5800 A={1,2}, obj xy5800 B={3,4}; obj xy5800 A={1,2}, obj xy5800 B={3,4};
print base+5: ': obj xy5800 A={1,2}, obj xy5000 B={3,4}'; print base+5: ': obj xy5800 A={1,2}, obj xy5800 B={3,4}';
/* /*
* test assignment * test assignment
@@ -5211,7 +5284,7 @@ define test_is()
prime = 3217; prime = 3217;
print '5922: prime = 3217'; print '5922: prime = 3217';
square = prime^2; square = prime^2;
print '5923: square = prine^2'; print '5923: square = prime^2';
string = "a string"; string = "a string";
print '5924: string = "a string"'; print '5924: string = "a string"';
com = 3+4i; com = 3+4i;
@@ -6210,7 +6283,7 @@ define test_blk()
/* A second named block */ /* A second named block */
B1 = blk("+++6700", 15, 10) = {1,2,3,4,5}; B1 = blk("+++6700", 15, 10) = {1,2,3,4,5};
print '6746: B1 = blk("+++6700", , 10);'; print '6746: B1 = blk("+++6700", 15 , 10) = {1,2,3,4,5};';
vrfy(size(B1) == 15, '6747: size(B1) == 15'); vrfy(size(B1) == 15, '6747: size(B1) == 15');
vrfy(sizeof(B1) == 20, '6748: sizeof(B1) == 20'); vrfy(sizeof(B1) == 20, '6748: sizeof(B1) == 20');
vrfy(test(B1) == 1, '6749: test(B1) == 1'); vrfy(test(B1) == 1, '6749: test(B1) == 1');
@@ -6605,10 +6678,10 @@ define test_sha()
0x21e42319a26787046c2b28b7ae70f1b54bf0ba2a, 0x21e42319a26787046c2b28b7ae70f1b54bf0ba2a,
'7122: sha(sha("this is", 7^19-8, ..., "hash")) == 0x21e4...'); '7122: sha(sha("this is", 7^19-8, ..., "hash")) == 0x21e4...');
z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi()); z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));
print '7123: z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi());'; print '7123: z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));';
vrfy(sha(z) == 0x36dcca3e51865c30a2cf738023cda446f1368340, vrfy(sha(z) == 257075527903934749824451356785709876382198951165,
'7124: sha(z) == 0x36dcca3e51865c30a2cf738023cda446f1368340'); '7124: sha(z) == 257075527903934749824451356785709876382198951165');
y = sha(); y = sha();
print '7125: y = sha()'; print '7125: y = sha()';
@@ -6616,8 +6689,8 @@ define test_sha()
print '7126: y = sha(y, list(1,2,3), "curds and whey")'; print '7126: y = sha(y, list(1,2,3), "curds and whey")';
y = sha(y, 2^21701-1); y = sha(y, 2^21701-1);
print '7127: y = sha(y, 2^21701-1)'; print '7127: y = sha(y, 2^21701-1)';
y = sha(y, pi()); y = sha(y, pi(1e-100));
print '7128: y = sha(y, pi())'; print '7128: y = sha(y, pi(1e-100))';
vrfy(y == z, '7129: y == z'); vrfy(y == z, '7129: y == z');
B = blk() = {"a", "b", "c"}; B = blk() = {"a", "b", "c"};
@@ -6676,10 +6749,10 @@ define test_sha1()
'7209: sha1(sha1("this is",7^19-8,"a composit",3i+4.5,"hash")) == ...'); '7209: sha1(sha1("this is",7^19-8,"a composit",3i+4.5,"hash")) == ...');
z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi()); z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));
print '7210: z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi());'; print '7210: z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));';
vrfy(sha1(z) == 0xc19e7317675dbf71e293b4c41e117169e9da5b6f, vrfy(sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83,
'7211: sha1(z) == 0xc19e7317675dbf71e293b4c41e117169e9da5b6f'); '7211: sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83');
y = sha1(); y = sha1();
print '7212: y = sha1();'; print '7212: y = sha1();';
@@ -6687,8 +6760,8 @@ define test_sha1()
print '7213: y = sha1(y, list(1,2,3), "curds and whey");'; print '7213: y = sha1(y, list(1,2,3), "curds and whey");';
y = sha1(y, 2^21701-1); y = sha1(y, 2^21701-1);
print '7214: y = sha1(y, 2^21701-1);'; print '7214: y = sha1(y, 2^21701-1);';
y = sha1(y, pi()); y = sha1(y, pi(1e-100));
print '7215: y = sha1(y, pi());'; print '7215: y = sha1(y, pi(1e-100));';
vrfy(y == z, '7216: y == z'); vrfy(y == z, '7216: y == z');
vrfy(sha1(sha1("a"))==0x86f7e437faa5a7fce15d1ddcb9eaeaea377667b8, vrfy(sha1(sha1("a"))==0x86f7e437faa5a7fce15d1ddcb9eaeaea377667b8,
@@ -6764,18 +6837,18 @@ define test_md5()
'7310: md5(md5("this is", 7^19-8, "a composit", 3i+4.5, "hash")) == ...'); '7310: md5(md5("this is", 7^19-8, "a composit", 3i+4.5, "hash")) == ...');
z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi()); z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));
print '7311: z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi());'; print '7311: z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));';
vrfy(md5(z) == 0x63d2b2fccae2de265227c30b05abb6b5, vrfy(md5(z) == 0x487462e577eabef0302dd13af6632546,
'7312: md5(z) == 0x63d2b2fccae2de265227c30b05abb6b5'); '7312: md5(z) == 0x487462e577eabef0302dd13af6632546');
y = md5(); y = md5();
print '7313: y = md5();'; print '7313: y = md5();';
y = md5(y, list(1,2,3), "curds and whey"); y = md5(y, list(1,2,3), "curds and whey");
print '7314: y = md5(y, list(1,2,3), "curds and whey")'; print '7314: y = md5(y, list(1,2,3), "curds and whey")';
y = md5(y, 2^21701-1); y = md5(y, 2^21701-1);
print '7315: y = md5(y, 2^21701-1);'; print '7315: y = md5(y, 2^21701-1);';
y = md5(y, pi()); y = md5(y, pi(1e-100));
print '7316: y = md5(y, pi());'; print '7316: y = md5(y, pi(1e-100));';
vrfy(y == z, '7317: y == z'); vrfy(y == z, '7317: y == z');
vrfy(md5(md5("a")) == 0x0cc175b9c0f1b6a831c399e269772661, vrfy(md5(md5("a")) == 0x0cc175b9c0f1b6a831c399e269772661,
@@ -7312,7 +7385,7 @@ define test_somenew()
vrfy(size(char(0)) == 1, '8203: size(char(0)) == 1'); vrfy(size(char(0)) == 1, '8203: size(char(0)) == 1');
vrfy(strlen(char(0)) == 0, '8204: strlen(char(0)) == 0'); vrfy(strlen(char(0)) == 0, '8204: strlen(char(0)) == 0');
vrfy(char(0) != "", '8205: char(0) != ""'); vrfy(char(0) != "", '8205: char(0) != ""');
vrfy(strcmp(char(0),"") == 0, '8206: strcmp(char(0),"") == 0'); vrfy(str(char(0)) == "", '8206: str(char(0)) == ""');
vrfy(str("abc") == "abc", '8207: str("abc") == "abc"'); vrfy(str("abc") == "abc", '8207: str("abc") == "abc"');
@@ -7669,20 +7742,34 @@ print '8406: Ending test_quit';
* test_divmod - psuedo-random tests on the // and % with various rounding modes * test_divmod - psuedo-random tests on the // and % with various rounding modes
*/ */
print; print;
print '8500: Starting test_divmod' print '8500: Starting test of divmod'
read -once "test8500"; read -once "test8500";
/* 85xx: Ending test_divmod is printed by test8500.cal */ /* 85xx: Ending test of divmod is printed by test8500.cal */
/* /*
* test_maxargs - test up to 1024 args being passed to a builtin function * test_maxargs - test up to 1024 args being passed to a builtin function
*/ */
print; print;
print '8600: Starting test_1024args' print '8600: Starting test of up to 1024 args'
read -once "test8600"; read -once "test8600";
/* 86xx: Ending test_1024args is printed by test8600.cal */ /* 86xx: Ending test of up to 1024 args is printed by test8600.cal */
/*
* dotest scripts
*
* We use the dotest driver to evaluate test-97xx data files.
*/
print '8700: Starting dotest runs'
print '8701: read -once "dotest"';
read -once "dotest";
print '8702: read -once "set8700"';
read -once "set8700";
vrfy(dotest("set8700.line", 8703) == 0,
'8703: dotest("set8700.line", 8703) == 0');
/* 87xx: Ending dotest runs is printed by set8700.test */
/* /*
* read various calc resource files * read various calc resource files
* *

61
cal/screen.cal Normal file
View File

@@ -0,0 +1,61 @@
/*
* screen - ANSI control sequences
*
* This file was created by Ernest Bowen <ebowen at une dot edu dot au>.
*
* This code has been placed in the public domain. Please do not
* copyright this code.
*
* ERNEST BOWEN DISCLAIMS ALL WARRANTIES WITH REGARD TO
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER-
* CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT
* NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* @(#) $Revision: 29.2 $
* @(#) $Id: screen.cal,v 29.2 2006/05/01 19:21:18 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/screen.cal,v $
*
* This file is not covered under version 2.1 of the GNU LGPL.
*
* Under source code control: 2006/03/08 05:54:09
* File existed as early as: 2006
*/
up = CUU ="\e[A";
down = CUD = "\e[B}";
forward = CUF = "\e[C";
back = CUB = "\e[D";
save = SCP = "\e[s";
restore = RCP = "\e[u";
cls = "\e[2J";
home = "\e[F";
eraseline = "\e[K";
off = "\e[0m";
bold = "\e[1m";
faint = "\e[2m";
italic = "\e[3m";
blink = "\e[5m";
rapidblink = "\e[6m";
reverse = "\e[7m";
concealed = "\e[8m";
/* Lowercase indicates foreground, uppercase background" */
black = "\e[30m";
red = "\e[31m";
green = "\e[32m";
yellow = "\e[33m";
blue = "\e[34m";
magenta = "\e[35m";
cyan = "\e[36m";
white = "\e[37m";
Black = "\e[40m";
Red = "\e[41m";
Green = "\e[42m";
Yellow = "\e[43m";
Blue = "\e[44m";
Magenta = "\e[45m";
Cyan = "\e[46m";
White = "\e[47m";

72
cal/set8700.cal Normal file
View File

@@ -0,0 +1,72 @@
/*
* set8700 - environment for dotest line tests for the 8700 set of regress.cal
*
* Copyright (C) 2006 Ernest Bowen and Landon Curt Noll
*
* Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* @(#) $Revision: 29.1 $
* @(#) $Id: set8700.cal,v 29.1 2006/05/20 19:35:33 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/set8700.cal,v $
*
* Under source code control: 2006/05/20 14:10:11
* File existed as early as: 2006
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* setup global variables for dotest() to use with set8700.set
*/
global set8700_A;
global set8700_B;
global set8700_M;
global set8700_M1;
global set8700_M2;
global set8700_L;
global set8700_L1;
global set8700_L2;
global set8700_O;
global set8700_P;
global set8700_P1;
global set8700_P2;
global set8700_Q;
global set8700_R;
global set8700_S;
global set8700_X;
global set8700_Y;
global set8700_x;
global set8700_y;
define set8700_getA1() = set8700_A;
define set8700_getA2() { return set8700_A; }
define set8700_getvar() {local a = 42; protect(a,256); return a;}
define set8700_f(set8700_x) = set8700_x^2;
define set8700_g(set8700_x)
{
if (isodd(set8700_x)) protect(set8700_x, 256);
return set8700_x;
}
obj set8700_point {
set8700_x, set8700_y, set8700_z
}

405
cal/set8700.line Normal file
View File

@@ -0,0 +1,405 @@
##
## set8700 - dotest line tests for the 8700 set of regress.cal
##
## Copyright (C) 2006 Ernest Bowen and Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 29.1 $
## @(#) $Id: set8700.line,v 29.1 2006/05/20 19:35:33 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/set8700.line,v $
##
## Under source code control: 2006/05/20 14:10:11
## File existed as early as: 2006
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
strcpy("", "") == ""
strcpy("", "xyz") == ""
strcpy("a", "xyz") == "x"
strcpy("ab", "xyz") == "xy"
strcpy("abc", "xyz") == "xyz"
strcpy("abcd", "xyz") == "xyz\0" ## Result will print as "xyz"
strcpy("abcde", "xyz") == "xyz\0e"
strcpy("abcdef", "xyz") == "xyz\0ef"
strcpy("abcdef", "x\0z") == "x\0z\0ef" ## Note z is copied
strcpy("abc", "") == "\0bc"
strncpy("abcdef", "xyz", 0) == "abcdef" ## No characters copied
strncpy("abcdef", "xyz", 1) == "xbcdef" ## One character copied, no '\0'
strncpy("abcdef", "xyz", 2) == "xycdef"
strncpy("abcdef", "xyz", 3) == "xyzdef"
strncpy("abcdef", "xyz", 4) == "xyz\0ef"
strncpy("abcdef", "xyz", 5) == "xyz\0\0f" ## Two nulls as in C
strncpy("abcdef", "xyz", 6) == "xyz\0\0\0"
strncpy("abcdef", "xyz", 7) == "xyz\0\0\0" ## Size of first string unchanged
strncpy("a\0cdef", "\0yz", 4) == "\0yz\0ef"
strncpy("ab", "xyz", 3) == "xy"
strcmp("", "") == 0
strcmp("", "a") == -1
strcmp("\n", "\n") == 0
strcmp("\0", "") == 1 ## '\0' treated like other characters
strcmp("ab", "") == 1
strcmp("ab", "a") == 1
strcmp("ab", "ab") == 0
strcmp("ab", "abc") == -1
strcmp("abc", "abb") == 1
strcmp("abc", "abc") == 0
strcmp("abc", "abd") == -1
strcmp("abc\0", "abc") == 1
strncmp("abc", "xyz", 0) == 0
strncmp("abc", "xyz", 1) == -1
strncmp("abc", "", 1) == 1
strncmp("abc", "a", 1) == 0
strncmp("", "", 2) == 0
strncmp("a", "a", 2) == 0
strncmp("a", "b", 2) == -1
strncmp("ab", "ab", 2) == 0
strncmp("ab", "ac", 2) == -1
strncmp("\0ac", "\0b", 2) == -1
strncmp("ab", "abc", 2) == 0
strncmp("abc", "abd", 2) == 0
strncmp("a", "a\0", 2) == -1
strncmp("a", "a", 3) == 0
strncmp("abc", "abd", 3) == -1
strncmp("\0\0\n", "\0\0\t", 3) == 1
str("abc") == "abc"
str("ab\0") == "ab"
str("a\0c") == "a"
str("\0bc") == ""
size("") == 0
size("a") == 1
size("\0") == 1
size("a\0") == 2
size("a\0b") == 3
strlen("\0") == 0
strlen("a\0") == 1
strlen("a\0b") == 1
0 * "abc" == ""
1 * "abc" == "abc"
2 * "abc" == "abcabc"
3 * "abc" == "abcabcabc"
1 * "" == ""
-1 * "abc" == "cba"
-2 * "abc" == "cbacba"
"abc" + "xyz" == "abcxyz"
"abc" - "xyz" == "abczyx"
substr("abcd",0,0) == ""
substr("abcd",0,1) == "a"
substr("abcd",0,2) == "ab"
substr("abcd",1,0) == ""
substr("abcd",1,1) == "a"
substr("abcd",1,2) == "ab"
substr("abcd",2,0) == ""
substr("abcd",2,1) == "b"
substr("abcd",2,2) == "bc";
substr("abcd",2,3) == "bcd";
substr("abcd",2,4) == "bcd";
substr("abcd",2,5) == "bcd"; ## substr stops at end of string
substr("abcd",4,0) == ""
substr("abcd",4,1) == "d"
substr("abcd",4,2) == "d"
substr("abcd",4,3) == "d"
substr("abcd",5,0) == ""
substr("abcd",5,1) == ""
substr("a\0c\0",2,2) == "\0c" ## '\0' treated like other characters
substr("a\0c\0",2,3) == "\0c\0"
#"" == 0 ## # operator counts number of bits
#"\0" == 0
# "a" == 3
# "ab" == 6 ## white space ignored
# "abc" == 10
# 27 == 4
# 0b1010111011 == 7
7 # 9 == 2 ## 7 # 9 = abs(7 - 9)
3/4 # 2/3 == 1/12
a = 5, a #= 2, a == 3
a #= 4, a == 1
## Binary # operator not defined for strings
global set8700_A; protect(set8700_A) == 0
## Testing with one lvalue
isnull(protect(set8700_A,65))
protect(set8700_A) == 65
isnull(protect(set8700_A, -1))
protect(set8700_A) == 64
protect(set8700_A,-2), protect(set8700_A) == 64
protect(set8700_A,5), protect(set8700_A) == 69
protect(set8700_A,-4), protect(set8700_A) == 65
protect(set8700_A,0), protect(set8700_A) == 0
protect(set8700_A,1234), protect(set8700_A) == 1234
protect(set8700_A,-1234), protect(set8700_A) == 0
protect(set8700_A,65535), protect(set8700_A) == 65535
protect(set8700_A,-65535), protect(set8700_A) == 0
## Simple assignments
set8700_A = 42, protect(set8700_A,1024), set8700_B = set8700_A, protect(set8700_B) == 1024
set8700_A = 6 * 7, protect(set8700_A) == 1024
set8700_A == set8700_B
## Testing matrix protectioon
set8700_A = mat [3] = {1, 2, list(3,4)}; 1
protect(set8700_A, 65, 1), protect(set8700_A) == 1089
protect(set8700_A[0]) == 65
protect(set8700_A[2]) == 65
protect(set8700_A[2][1]) == 0
protect(set8700_A, 65, 2), protect(set8700_A[2][1]) == 65
protect(set8700_A,-1024), protect(set8700_A) == 65
protect(set8700_A, -1, 1), protect(set8700_A) == 64
protect(set8700_A[1]) == 64
protect(set8700_A[2]) == 64
protect(set8700_A[2][0]) == 65
protect(set8700_A,0), protect(set8700_A) == 0
protect(set8700_A[1]) == 64
protect(set8700_A, 0, 2), protect(set8700_A) == 0
protect(set8700_A[1]) == 0
protect(set8700_A[2][1]) == 0
protect(set8700_A,1024, 2), protect(set8700_A) == 1024
protect(set8700_A[2]) == 1024
protect(set8700_A[2][0], 512), protect(set8700_A[2][0]) == 1536
## Testing simple assignment of matrix
set8700_B = set8700_A, protect(set8700_B) == 1024 ## protect(set8700_A) copied
protect(set8700_B[2]) == 1024 ## protect(set8700_A[2]) copied
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
## copying matrix to list
set8700_B = list(5,6,7), protect(set8700_B) == 1024
protect(set8700_B[0]) == 0
protect(set8700_B[2]) == 0
protect(set8700_A,0), protect(set8700_A) == 0
copy(set8700_A,set8700_B), set8700_B[0] == 1 && set8700_B[1] == 2
set8700_B[2] == list(3,4)
protect(set8700_B) == 1024 ## protect(set8700_A) not copied
protect(set8700_B[0]) == 1024 ## protect(set8700_A[0]) copied
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
## copying matrix to matrix
set8700_B = mat[3], protect(set8700_B) == 1024
protect(set8700_B[2]) == 0
copy(set8700_A,set8700_B), set8700_B[0] == 1 && set8700_B[1] == 2
set8700_B[2] == list(3,4)
protect(set8700_B) == 1024 ## protect(set8700_A) not copied
protect(set8700_B[0]) == 1024 ## protect(set8700_A[0]) copied
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
## Testing list protection
set8700_A = list(1, 2, list(3,4)), 1
protect(set8700_A,1024, 2), protect(set8700_A) == 1024
protect(set8700_A[2]) == 1024
protect(set8700_A[2][0], 512), protect(set8700_A[2][0]) == 1536
## Simple assignment of list
set8700_B = set8700_A, protect(set8700_B) == 1024 ## protect(set8700_A) copied
protect(set8700_B[2]) == 1024 ## protect(set8700_A[2]) copied
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
## Copying list to list
set8700_B = list(5,6,7), protect(set8700_B) == 1024
protect(set8700_B[2]) == 0
copy(set8700_A,set8700_B), set8700_B[0] == 1 && set8700_B[1] == 2
set8700_B[2] == list(3,4)
protect(set8700_B) == 1024 ## protect(set8700_A) not copied
protect(set8700_B[0]) == 1024 ## protect(set8700_A[0]) copied
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
## Copying list to matrix
set8700_B = mat[3], protect(set8700_B) == 1024
protect(set8700_B[2]) == 0
copy(set8700_A,set8700_B), set8700_B[0] == 1 && set8700_B[1] == 2
set8700_B[2] == list(3,4)
protect(set8700_B) == 1024
protect(set8700_B[0]) == 1024 ## protect(set8700_A[0]) copied
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
## Protecting one element of a list
set8700_A = list(1,4,3,2), protect(set8700_A[1]) == 0
protect(set8700_A[1], 1024), protect(set8700_A[1]) == 1024
## Testing sort
set8700_A = sort(set8700_A), set8700_A == list(1,2,3,4)
protect(set8700_A[1]) == 0
protect(set8700_A[3]) == 1024 ## status of 4
## Testings reverse
set8700_A = reverse(set8700_A), set8700_A == list(4,3,2,1)
protect(set8700_A[0]) == 1024 ## status of 4
## Testing swap
swap(set8700_A[0], set8700_A[1]), set8700_A == list(3,4,2,1)
protect(set8700_A[0]) == 0 ## status moved
protect(set8700_A[1]) == 1024 ## 4 retains protection
## Testing list with protected list argument
protect(set8700_A, 0), protect(set8700_A) == 0
protect(set8700_A, 512), protect(set8700_A) == 512
protect(set8700_A[1]) == 1024
set8700_L = list(1,set8700_A,3), protect(set8700_L) == 0
protect(set8700_L[0]) == 0
protect(set8700_L[1]) == 512 ## protect(set8700_A) copied
protect(set8700_L[1][1]) == 1024 ## protect(set8700_A[1]) copied
## Testing list with "intialization"
set8700_L = list(1,2,3), protect(set8700_L) == 0
protect(set8700_L[0]) | protect(set8700_L[1]) | protect(set8700_L[2]) == 0 ## All zero
set8700_L = {1,set8700_A}, set8700_L[1] == set8700_A
protect(set8700_L[1]) == 512 ## protect(set8700_A) copied
protect(set8700_L[1][1]) == 1024 ## protect(set8700_A[1]) copied
set8700_L[1] = 2, protect(set8700_L[1]) == 512 ## Not changed
## Testing matrix with "initialization"
set8700_M = mat[3] = {1,set8700_A}, protect(set8700_M) == 0
protect(set8700_M[0]) == 0
protect(set8700_M[1]) == 512 ## protect(set8700_A) copied
protect(set8700_M[2]) == 0
protect(set8700_M[1][1]) == 1024 ## protect(set8700_A[1]) copied
## Testing push, pop, append, remove
set8700_A = list(1,2), protect(set8700_A,0,1), protect(set8700_A[0]) == 0
protect(set8700_A[0], 256), protect(set8700_A[0]) == 256
protect(set8700_A[1]) == 0
append(set8700_A, pop(set8700_A)), protect(set8700_A[0]) == 0
protect(set8700_A[1]) == 256
push(set8700_A, remove(set8700_A)), protect(set8700_A[0]) == 256
protect(set8700_A[1]) == 0
## Testing operation-assignments
set8700_A = 5, protect(set8700_A,1024), protect(set8700_A) == 1024
protect(set8700_A, 1024), set8700_A = 7, protect(set8700_A) == 1024
protect(set8700_A,1024), set8700_A += 2, protect(set8700_A) == 1024
protect(set8700_A,1024), set8700_A *= 2, protect(set8700_A) == 1024
protect(set8700_A,1024), set8700_A |= 2, protect(set8700_A) == 1024
protect(set8700_A,1024), set8700_A &= 2, protect(set8700_A) == 1024
protect(set8700_A,1024), set8700_A ^= 2, protect(set8700_A) == 1024
protect(set8700_B,0), set8700_B = set8700_getA1(), protect(set8700_B) == 1024
protect(set8700_B,0), set8700_B = set8700_getA2(), protect(set8700_B) == 1024
set8700_B = set8700_getvar(), protect(set8700_B) == 1024 + 256
global set8700_x, set8700_y; set8700_x = 7, protect(set8700_x) == 0
protect(7,2) == error(10234)
protect(set8700_x,2.5) == error(10235)
protect(set8700_x,"abc") == error(10235)
protect(set8700_x, 1e6) == error(10235)
protect(set8700_x,1), (set8700_x = 2) == error(10366)
(set8700_x = 3 + 4) == error(10366)
protect(set8700_x,2), protect(set8700_x) == 3
protect(set8700_x,-1), protect(set8700_x) == 2
(set8700_x = 2) == error(10368)
(set8700_x = 3 + 4) == 7
protect(set8700_x,2), ++set8700_x == error(10379)
set8700_x == 7
--set8700_x == error(10382)
set8700_x == 7
set8700_x++ == error(10385)
set8700_x == 7
set8700_x-- == error(10388)
global set8700_A, set8700_B; 1
protect(set8700_A,0), protect(set8700_A,16), 1
set8700_A = "abcdef", protect(set8700_A) == 16 ## No copy to set8700_A
protect(set8700_B,0), set8700_B = "xyz", protect(set8700_B) == 0
copy(set8700_B, set8700_A) == error(10226)
set8700_A == "abcdef" ## set8700_A not changed
protect(set8700_A,0), copy(set8700_B,set8700_A), set8700_A == "xyzdef"
protect(set8700_B,128), protect(set8700_B) == 128 ## No copy from set8700_B
copy(set8700_B,set8700_A,,,3) == error(10225)
set8700_A == "xyzdef"
protect(set8700_B,0), copy(set8700_B,set8700_A,,,3), set8700_A == "xyzxyz"
set8700_A = "abcdef", protect(set8700_A, 16), swap(set8700_A[0], set8700_A[5]) == error(10371)
set8700_A == "abcdef"
protect(set8700_A,0), isnull(swap(set8700_A[0], set8700_A[5]))
set8700_A == "fbcdea"
protect(set8700_A,2), ++set8700_A[0] == error(10377)
--set8700_A[1] == error(10380)
set8700_A[2]++ == error(10383)
set8700_A[3]-- == error(10386)
set8700_A == "fbcdea"
protect(set8700_A,0), ++set8700_A[0] == 'g'
--set8700_A[1] == 'a'
set8700_A[2]++ == ord('c')
set8700_A[3]-- == ord('d')
set8700_A == "gadcea"
protect(set8700_x,0), protect(set8700_y,0), protect(set8700_x,256), protect(set8700_y,512),1
quomod(11,4,set8700_x,set8700_y), set8700_x == 2 && set8700_y == 3
protect(set8700_x) == 256
protect(set8700_y) == 512
set8700_A = mat[3]; protect(set8700_A[0], 1024); protect(set8700_A[0]) == 1024
set8700_x = 7, protect(set8700_x,0), protect(set8700_x, 512), 1
set8700_A = {set8700_x,,set8700_x}, protect(set8700_A[0]) == 1536
protect(set8700_A[1]) == 0
protect(set8700_A[2]) == 512
protect(set8700_A,16), protect(set8700_A) == 16 ## No copy to
set8700_A == (mat[3] = {7,0,7})
set8700_A = {1,2,3}, errno() == 10390;
set8700_A == (mat[3] = {7,0,7})
protect(set8700_A,0), set8700_A = {1,2,3}, set8700_A == (mat[3] = {1,2,3})
protect(set8700_A[1],1), protect(set8700_A[1]) == 1
set8700_A = {4,5,6}, errno() == 10394
set8700_A == (mat[3] = {4,2,6})
modify(7, "set8700_f") == error(10405)
set8700_A = list(2,3,5), modify(set8700_A, 7) == error(10406)
protect(set8700_A,2), modify(set8700_A, "set8700_f") == error(10407)
protect(set8700_A,0), modify(set8700_A, "h") == error(10408)
set8700_B = 42, protect(set8700_B,0), modify(set8700_B, "set8700_f") == error(10409)
set8700_A == list(2,3,5) ## set8700_A not affected by failures
protect(set8700_A,0,1), modify(set8700_A, "set8700_f") == null()
set8700_A == list(4,9,25)
modify(set8700_A,"set8700_g") == null()
protect(set8700_A[0]) == 0
protect(set8700_A[1]) == 256 && protect(set8700_A[2]) == 256
set8700_A = 0, protect(set8700_A,0), set8700_A = pop(2), set8700_A == error(10181)
set8700_A = pop(list(1,2,3)), set8700_A == error(10181)
set8700_B = set8700_A = pop(2), set8700_B == error(10181)
set8700_A = 32, protect(set8700_A,8), (set8700_A = pop(2)) == error(10370)
set8700_A == 32
set8700_B = set8700_A = pop(2), set8700_B == error(10370)
## Testing copying of protected elements and initialization
set8700_M1 = mat[3], protect(set8700_M1,0), protect(set8700_M1[1],1), protect(set8700_M1[1]) == 1
set8700_M2 = mat[3], protect(set8700_M2,0), protect(set8700_M2[2],4), protect(set8700_M2[2]) == 4
set8700_L = list(set8700_M1, set8700_M2), protect(set8700_L[0][1]) == 1 && protect(set8700_L[1][2]) == 4
set8700_L = {{1,2,3},{'a','b','c'}}, set8700_L[0] == (mat[3] = {1,0,3})
set8700_L[1] == (mat[3] = {'a','b',0})
set8700_M = mat[2], protect(set8700_M,0), set8700_M = {1,2,3,4}, set8700_M == (mat[2] = {1,2})
set8700_x = 5, set8700_M = {set8700_x++, set8700_x++, set8700_x++, set8700_x++, set8700_x++}, set8700_M == (mat[2] = {5,6})
set8700_x == 10 ## All initialization terms evaluated
set8700_S = " ", set8700_S = {'a','b','c','d'}, set8700_S == "abc"
set8700_P = obj set8700_point = {1,2,3,4}, set8700_P.set8700_x == 1 && set8700_P.set8700_y == 2 && set8700_P.set8700_z == 3
protect(set8700_P,16), set8700_Q = set8700_P, set8700_Q = {5,6,7}, set8700_Q == set8700_P
set8700_P == (obj set8700_point = {1,2,3})
set8700_L = list(mat[1] = {set8700_P}), protect(set8700_L[0][0]) == 16
set8700_L = {{{4,5,6}}}, set8700_L[0][0] == set8700_P
protect(set8700_L,0,2), set8700_L = {{{4,5,6}}}, set8700_L[0][0] == (obj set8700_point = {4,5,6})

19
calc.c
View File

@@ -1,7 +1,7 @@
/* /*
* calc - arbitrary precision calculator * calc - arbitrary precision calculator
* *
* Copyright (C) 1999 David I. Bell, Landon Curt Noll and Ernest Bowen * Copyright (C) 1999-2006 David I. Bell, Landon Curt Noll and Ernest Bowen
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.10 $ * @(#) $Revision: 29.13 $
* @(#) $Id: calc.c,v 29.10 2004/02/23 09:21:35 chongo Exp $ * @(#) $Id: calc.c,v 29.13 2006/05/19 15:26:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.c,v $
* *
* Under source code control: 1990/02/15 01:48:11 * Under source code control: 1990/02/15 01:48:11
@@ -111,7 +111,7 @@ main(int argc, char **argv)
BOOL done = FALSE; BOOL done = FALSE;
BOOL havearg; BOOL havearg;
BOOL haveendstr; BOOL haveendstr;
int len; size_t len;
/* /*
* parse args * parse args
@@ -393,7 +393,7 @@ main(int argc, char **argv)
} }
/* XXX What if *cp = '\''? */ /* XXX What if *cp = '\''? */
*bp++ = '\''; *bp++ = '\'';
strcpy(bp, cp); strncpy(bp, cp, len+1);
bp += len; bp += len;
*bp++ = '\''; *bp++ = '\'';
cp += len; cp += len;
@@ -452,16 +452,19 @@ main(int argc, char **argv)
} }
while (index < maxindex) { while (index < maxindex) {
size_t cplen;
if (cmdlen > 0) if (cmdlen > 0)
cmdbuf[cmdlen++] = ' '; cmdbuf[cmdlen++] = ' ';
newcmdlen = cmdlen + strlen(cp); cplen = strlen(cp);
newcmdlen = cmdlen + cplen;
if (newcmdlen > MAXCMD) { if (newcmdlen > MAXCMD) {
fprintf(stderr, fprintf(stderr,
"%s: commands too long\n", "%s: commands too long\n",
program); program);
exit(1); exit(1);
} }
strcpy(cmdbuf + cmdlen, cp); strncpy(cmdbuf + cmdlen, cp, cplen+1);
cmdlen = newcmdlen; cmdlen = newcmdlen;
index++; index++;
if (index < maxindex) if (index < maxindex)
@@ -579,7 +582,7 @@ main(int argc, char **argv)
if (run_state == RUN_PRE_CMD_ARGS) { if (run_state == RUN_PRE_CMD_ARGS) {
if (havecommands) { if (havecommands) {
set_run_state(RUN_CMD_ARGS); set_run_state(RUN_CMD_ARGS);
(void) openstring(cmdbuf, (long) strlen(cmdbuf)); (void) openstring(cmdbuf, strlen(cmdbuf));
getcommands(FALSE); getcommands(FALSE);
closeinput(); closeinput();
} }

15
calc.h
View File

@@ -1,7 +1,7 @@
/* /*
* calc - definitions for calculator program * calc - definitions for calculator program
* *
* Copyright (C) 1999 David I. Bell * Copyright (C) 1999-2006 David I. Bell
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.11 $ * @(#) $Revision: 29.18 $
* @(#) $Id: calc.h,v 29.11 2003/08/26 04:36:10 chongo Exp $ * @(#) $Id: calc.h,v 29.18 2006/05/21 07:28:54 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.h,v $
* *
* Under source code control: 1990/02/15 01:48:31 * Under source code control: 1990/02/15 01:48:31
@@ -98,12 +98,13 @@
#define FILEID_STDIN ((FILEID) 0) #define FILEID_STDIN ((FILEID) 0)
#define FILEID_STDOUT ((FILEID) 1) #define FILEID_STDOUT ((FILEID) 1)
#define FILEID_STDERR ((FILEID) 2) #define FILEID_STDERR ((FILEID) 2)
#define FILEID_NONE ((FILEID) -1) #define FILEID_NONE ((FILEID) -1) /* must be < 0 */
/* /*
* File I/O routines. * File I/O routines.
*/ */
extern DLL FILEID openid(char *name, char *mode); extern DLL FILEID openid(char *name, char *mode);
extern DLL FILEID openpathid(char *name, char *mode, char *pathlist);
extern DLL FILEID indexid(long index); extern DLL FILEID indexid(long index);
extern DLL BOOL validid(FILEID id); extern DLL BOOL validid(FILEID id);
extern DLL BOOL errorid(FILEID id); extern DLL BOOL errorid(FILEID id);
@@ -148,7 +149,7 @@ extern DLL void trimconstants(void);
/* /*
* Input routines. * Input routines.
*/ */
extern DLL int openstring(char *str, long num); extern DLL int openstring(char *str, size_t num);
extern DLL int openterminal(void); extern DLL int openterminal(void);
extern DLL int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok); extern DLL int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok);
extern DLL char *nextline(void); extern DLL char *nextline(void);
@@ -205,7 +206,7 @@ extern DLL int d_flag; /* TRUE => disable heading, resource_debug */
extern DLL int c_flag; /* TRUE => continue after error if permitted */ extern DLL int c_flag; /* TRUE => continue after error if permitted */
extern DLL int i_flag; /* TRUE => try to go interactive after error */ extern DLL int i_flag; /* TRUE => try to go interactive after error */
extern DLL int s_flag; /* TRUE => keep args as strings for argv() */ extern DLL int s_flag; /* TRUE => keep args as strings for argv() */
extern DLL int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */ extern DLL long stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */
extern DLL BOOL abort_now; /* TRUE => try to go interactive */ extern DLL BOOL abort_now; /* TRUE => try to go interactive */
extern DLL int argc_value; /* count of argv[] strings for argv() builtin */ extern DLL int argc_value; /* count of argv[] strings for argv() builtin */
@@ -231,7 +232,7 @@ extern DLL char *shell; /* $SHELL or default */
extern DLL char *program; /* our name (argv[0]) */ extern DLL char *program; /* our name (argv[0]) */
extern DLL int no_env; /* TRUE (-e) => ignore env vars on startup */ extern DLL int no_env; /* TRUE (-e) => ignore env vars on startup */
extern DLL int errmax; /* if >= 0, error when errcount exceeds errmax */ extern DLL long errmax; /* if >= 0, error when errcount exceeds errmax */
extern DLL int use_old_std; /* TRUE (-O) => use classic configuration */ extern DLL int use_old_std; /* TRUE (-O) => use classic configuration */
extern DLL int allow_read; /* FALSE => dont open any files for reading */ extern DLL int allow_read; /* FALSE => dont open any files for reading */

158
calc.man
View File

@@ -1,5 +1,5 @@
.\" .\"
.\" Copyright (C) 1999 Landon Curt Noll .\" Copyright (C) 1999-2004 Landon Curt Noll
.\" .\"
.\" Calc is open software; you can redistribute it and/or modify it under .\" Calc is open software; you can redistribute it and/or modify it under
.\" the terms of the version 2.1 of the GNU Lesser General Public License .\" the terms of the version 2.1 of the GNU Lesser General Public License
@@ -15,8 +15,8 @@
.\" received a copy with calc; if not, write to Free Software Foundation, Inc. .\" received a copy with calc; if not, write to Free Software Foundation, Inc.
.\" 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. .\" 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
.\" .\"
.\" @(#) $Revision: 29.12 $ .\" @(#) $Revision: 29.20 $
.\" @(#) $Id: calc.man,v 29.12 2004/02/23 05:21:24 chongo Exp $ .\" @(#) $Id: calc.man,v 29.20 2006/06/01 12:04:16 chongo Exp $
.\" @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.man,v $ .\" @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.man,v $
.\" .\"
.\" Under source code control: 1991/07/23 05:48:26 .\" Under source code control: 1991/07/23 05:48:26
@@ -51,10 +51,10 @@ calc \- arbitrary precision calculator
.RB [ \-s ] .RB [ \-s ]
.RB [ \-u ] .RB [ \-u ]
.RB [ \-v ] .RB [ \-v ]
.RB [ calc_cmd\ \&.\|.\|. ] .RB [ [\-\-]\ calc_cmd\ \&.\|.\|. ]
.in -5n .in -5n
.sp .sp
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP\ \fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
.SH DESCRIPTION .SH DESCRIPTION
\& \&
.br .br
@@ -63,8 +63,11 @@ CALC OPTIONS
.TP .TP
.B \-c .B \-c
Continue reading command lines even after an execution Continue reading command lines even after an scan/parse
error has caused the abandonment of a line. error has caused the abandonment of a line.
Note that this option only deals with scanning and
parsing of the calc language.
It does not deal with execution or run-time errors.
.sp 1 .sp 1
For example: For example:
.sp 1 .sp 1
@@ -76,7 +79,7 @@ calc read many_errors.cal
.sp 1 .sp 1
will cause will cause
.B calc .B calc
to abort on the first error, whereas: to abort on the first syntax error, whereas:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
@@ -88,7 +91,7 @@ will
cause cause
.B calc .B calc
to try to process each line being read to try to process each line being read
despite the errors that it encounters. despite the scan/parse errors that it encounters.
.sp 1 .sp 1
By default, calc startup resource files are silently By default, calc startup resource files are silently
ignored if not found. ignored if not found.
@@ -119,7 +122,7 @@ as if \fBconfig("resource_debug", 0)\fP had been executed.
For example: For example:
.sp 1 .sp 1
.in +5n .in +5n
calc 'read qtime; qtime(2)' calc "read qtime; qtime(2)"
.in -5n .in -5n
.sp 1 .sp 1
will output something like: will output something like:
@@ -135,7 +138,7 @@ whereas:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
calc -d 'read qtime; qtime(2)' calc -d "read qtime; qtime(2)"
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
@@ -183,6 +186,80 @@ help config
Ignore any environment variables on startup. Ignore any environment variables on startup.
The getenv() builtin will still return values, however. The getenv() builtin will still return values, however.
.TP
.B \-f
This flag is required when using calc in
.BR "shell script mode" .
It must be at the end of the initial
.B #!
line of the script.
.sp 1
This flag is normally only at the end of a calc shell script.
If the first line of an executable file begins
.B #!
followed by the absolute pathname of the
.B calc
program and the flag
.B \-f
as in:
.sp 1
.in +5n
.nf
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
.fi
.in -5n
.sp 1
the rest of the file will be processed in
.BR "shell script mode" .
See
.B "SHELL SCRIPT MODE"
section of this man page
below for details.
.sp 1
The actual form of this flag is:
.sp 1
.in +5n
.B \-f
filename
.in -5n
.sp 1
On systems that treat an executable that begins with
.B #!
as a script, the path of the execurable is appended by the kernel
as the final argument to the exec() system call.
This is why the
.B \-f
flag at the very end of the
.B #!
line.
.sp 1
It is possible use
.B \-f\ filename
on the command line:
.sp 1
.in +5n
.nf
\fIcalc\fP\ [other_flags\ \&...] \fB\-f\fP filename
.fi
.in -5n
.sp 1
This will cause calc to process lines in
.B filename
in
.BR "shell script mode" .
.sp 1
Use of
.B \-f
implies
.BR \-s .
In addition,
.B \-d
and
.B \-p
are implied if
.B \-i
is not given.
.TP .TP
.B \-h .B \-h
Print a help message. This option implies Print a help message. This option implies
@@ -327,7 +404,7 @@ For example:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
calc -p '2^21701-1' | fizzbin calc -p "2^21701-1" | fizzbin
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
@@ -361,6 +438,21 @@ Disable buffering of stdin and stdout.
Print the Print the
.B calc .B calc
version number and exit. version number and exit.
.TP
.B \-\-
The double dash indicates to calc that no more option follow.
Thus calc will ignore a later argument on the command line
even if it starts with a dash.
This is useful when entering negative values on the command line as in:
.sp 1
.in +5n
.nf
calc \-p \-\- \-1 - -7
.sp 1
.fi
.in -5n
.PP .PP
\& \&
@@ -403,32 +495,50 @@ calc 23 + 47
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
should respond with display of 70, but will print 70.
However, command lines will have problems:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
calc 23 * 47 calc 23 * 47
.sp 1
calc -23 + 47
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
may fail. The first example above fails because the shell interprets the '*'
Such cases can usually be made to work as expected by as a file glob.
enclosing the command between single marks as in: The second example fails because '\-23' is viewed as a calc option
(which it is not) and do calc objects to that it thinks of as an unknown option.
These cases can usually be made to work as expected by
enclosing the command between quotes:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
calc '23 * 47' calc '23 * 47'
.sp 1
calc "print sqrt(2), exp(1)"
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
and or in parentheses and quotes to avoid leading \-'s as in:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
calc 'print sqrt(2), exp(1)' calc '(-23 + 47)'
.fi .fi
.in -5n .in -5n
.sp .sp 1
One may also use a double dash to denote that calc options have ended as in:
.sp 1
.in +5n
.nf
calc -- -23 + 47
.sp 1
calc -q -- -23 + 47
.fi
.in -5n
.sp 1
If '!' is to be used to indicate the factorial function, for If '!' is to be used to indicate the factorial function, for
shells like shells like
.BI csh (1) .BI csh (1)
@@ -578,7 +688,7 @@ help config
.br .br
SHELL SCRIPT MODE SHELL SCRIPT MODE
.PP .PP
If first line of an executable file begins If the first line of an executable file begins
.B #! .B #!
followed by the absolute pathname of the followed by the absolute pathname of the
.B calc .B calc
@@ -588,7 +698,7 @@ as in:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP\ \fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
@@ -596,10 +706,10 @@ the rest of the file will be processed in
.BR "shell script mode" . .BR "shell script mode" .
Note that Note that
.B \-f .B \-f
must be the first \-flag on the ``#!'' line. must at the end of the intiial ``#!'' line.
Any other optional Any other optional
.B "other_flags" .B "other_flags"
must come after must come before
the the
.BR \-f . .BR \-f .
.sp 1 .sp 1
@@ -617,8 +727,6 @@ the later lines within the script itself.
In In
.BR "shell script mode" , .BR "shell script mode" ,
.B \-s .B \-s
(lower case
.BR \-s )
is always assumed. is always assumed.
In addition, In addition,
.B \-d .B \-d
@@ -634,7 +742,7 @@ the file
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
\fI#!${BINDIR}/calc\fP\ \&\fB\-q\fP \fB\-f\fP\ \fI#!${BINDIR}/calc\fP\ \&\fB\-q\fP \fB\-f\fP
# #
# mersenne - an example of a calc \fBshell script file\fP # mersenne - an example of a calc \fBshell script file\fP

View File

@@ -2,7 +2,7 @@
# #
# calc.spec.in - template specfile for calc # calc.spec.in - template specfile for calc
# #
# Copyright (C) 2003 Petteri Kettunen and Landon Curt Noll # Copyright (C) 2003-2005 Petteri Kettunen and Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.12 $ # @(#) $Revision: 29.15 $
# @(#) $Id: calc.spec.in,v 29.12 2003/04/15 03:37:59 chongo Exp $ # @(#) $Id: calc.spec.in,v 29.15 2006/05/21 06:26:00 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.spec.in,v $ # @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.spec.in,v $
# #
# Under source code control: 2003/02/16 20:21:39 # Under source code control: 2003/02/16 20:21:39
@@ -30,7 +30,7 @@
# BUGS # BUGS
# - Uninstalling calc and calc-devel leaves empty dirs /usr/include/calc # - Uninstalling calc and calc-devel leaves empty dirs /usr/include/calc
# and /usr/share/calc and its subdird. In case e.g. %{_includedir}/calc # and /usr/share/calc and its subdirs. In case e.g. %{_includedir}/calc
# is defined in `%files devel' section, then rpmbuild complains that # is defined in `%files devel' section, then rpmbuild complains that
# header files are defined twice - rpmbuild bug or bug in specfile conf??? # header files are defined twice - rpmbuild bug or bug in specfile conf???
@@ -48,11 +48,11 @@ BuildRoot: %{_tmppath}/%{name}-root
%description %description
Calc is arbitrary precision C-like arithmetic system that is a Calc is arbitrary precision C-like arithmetic system that is a
calculator, an algorithm prototyper and mathematical research calculator, an algorithm prototype and mathematical research
tool. Calc comes with a rich set of builtin mathematical and tool. Calc comes with a rich set of builtin mathematical and
programmatic functions. programmatic functions.
For the latest calc release, see the project home page: For the latest calc release, see the calc project home page:
http://www.isthe.com/chongo/tech/comp/calc/index.html http://www.isthe.com/chongo/tech/comp/calc/index.html
@@ -92,6 +92,7 @@ rm -rf %{buildroot}
%{_datadir}/%{name}/bindings %{_datadir}/%{name}/bindings
%{_datadir}/%{name}/README %{_datadir}/%{name}/README
%{_datadir}/%{name}/*.cal %{_datadir}/%{name}/*.cal
%{_datadir}/%{name}/*.line
%files devel %files devel
%defattr(-, root, root) %defattr(-, root, root)
@@ -100,6 +101,12 @@ rm -rf %{buildroot}
%attr(644, root, root) %{_libdir}/*.a %attr(644, root, root) %{_libdir}/*.a
%changelog %changelog
* Sun May 20 2006 Landon Curt Noll http://www.isthe.com/chongo
- Release of calc-2.12.0
- Added *.line set files to the list of packaged files
* Sun Dec 11 2005 Landon Curt Noll http://www.isthe.com/chongo
- Release of calc-2.11.11
- Fixed description in spec file
* Wed Feb 26 2003 Landon Curt Noll http://www.isthe.com/chongo * Wed Feb 26 2003 Landon Curt Noll http://www.isthe.com/chongo
- Release of calc-2.11.7-2 - Release of calc-2.11.7-2
- Fixed attributes on include and lib calc-devel files - Fixed attributes on include and lib calc-devel files

View File

@@ -17,8 +17,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.4 $ # @(#) $Revision: 29.8 $
# @(#) $Id: calcerr.tbl,v 29.4 2001/04/10 22:06:46 chongo Exp $ # @(#) $Id: calcerr.tbl,v 29.8 2006/05/19 15:12:57 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/calcerr.tbl,v $ # @(#) $Source: /usr/local/src/cmd/calc/RCS/calcerr.tbl,v $
# #
# Under source code control: 1996/05/23 17:38:44 # Under source code control: 1996/05/23 17:38:44
@@ -164,7 +164,7 @@ E_RSEARCH3 Bad third argument for rsearch
E_RSEARCH4 Bad fourth argument for rsearch E_RSEARCH4 Bad fourth argument for rsearch
E_RSEARCH5 Cannot find fsize or fpos for rsearch E_RSEARCH5 Cannot find fsize or fpos for rsearch
E_RSEARCH6 File not readable for rsearch E_RSEARCH6 File not readable for rsearch
E_FOPEN3 Too many open files E_MANYOPEN Too many open files
E_REWIND2 Attempt to rewind a file that is not open E_REWIND2 Attempt to rewind a file that is not open
E_STRERROR1 Bad argument type for strerror E_STRERROR1 Bad argument type for strerror
E_STRERROR2 Index out of range for strerror E_STRERROR2 Index out of range for strerror
@@ -260,14 +260,14 @@ E_COPY13 No-copy-from source variable
E_COPY14 No-copy-to destination variable E_COPY14 No-copy-to destination variable
E_COPY15 No-copy-from source named block E_COPY15 No-copy-from source named block
E_COPY16 No-copy-to destination named block E_COPY16 No-copy-to destination named block
E_COPY17 No-relocation destination for copy E_COPY17 No-relocate destination for copy
E_COPYF1 File not open for copy E_COPYF1 File not open for copy
E_COPYF2 fseek or fsize failure for copy E_COPYF2 fseek or fsize failure for copy
E_COPYF3 fwrite error for copy E_COPYF3 fwrite error for copy
E_COPYF4 fread error for copy E_COPYF4 fread error for copy
E_PROTECT1 Non-variable first argument for protect E_PROTECT1 Non-variable first argument for protect
E_PROTECT2 Non-integer second argument for protect E_PROTECT2 Bad second argument for protect
E_PROTECT3 Out-of-range second argument for protect E_PROTECT3 Bad third argument for protect
E_MATFILL3 No-copy-to destination for matfill E_MATFILL3 No-copy-to destination for matfill
E_MATFILL4 No-assign-from source for matfill E_MATFILL4 No-assign-from source for matfill
E_MATTRACE1 Non-matrix argument for mattrace E_MATTRACE1 Non-matrix argument for mattrace
@@ -393,3 +393,55 @@ E_BERN Bad argument for bern
E_EULER Bad argument for euler E_EULER Bad argument for euler
E_SLEEP Bad argument for sleep E_SLEEP Bad argument for sleep
E_TTY calc_tty failure E_TTY calc_tty failure
E_ASSIGN1 No-copy-to destination for octet assign
E_ASSIGN2 No-copy-from source for octet assign
E_ASSIGN3 No-change destination for octet assign
E_ASSIGN4 Non-variable destination for assign
E_ASSIGN5 No-assign-to destination for assign
E_ASSIGN6 No-assign-from source for assign
E_ASSIGN7 No-change destination for assign
E_ASSIGN8 No-type-change destination for assign
E_ASSIGN9 No-error-value destination for assign
E_SWAP1 No-copy argument for octet swap
E_SWAP2 No-assign-to-or-from argument for swap
E_SWAP3 Non-variable argument for swap
E_QUOMOD1 Non-variable argument 4 or 4 for quomod
E_QUOMOD2 Non-real-number argument 1 or 2 for quomod
E_QUOMOD3 No-assign-to argument 3 or 4 for quomod
E_PREINC1 No-copy-to or no-change argument for octet preinc
E_PREINC2 Non-variable argument for preinc
E_PREINC3 No-assign-to or no-change argument for preinc
E_PREDEC1 No-copy-to or no-change argument for octet predec
E_PREDEC2 Non-variable argument for predec
E_PREDEC3 No-assign-to or no-change argument for predec
E_POSTINC1 No-copy-to or no-change argument for octet postinc
E_POSTINC2 Non-variable argument for postinc
E_POSTINC3 No-assign-to or no-change argument for postinc
E_POSTDEC1 No-copy-to or no-change argument for octet postdec
E_POSTDEC2 Non-variable argument for postdec
E_POSTDEC3 No-assign-to or no-change argument for postdec
E_INIT1 Error-type structure for initialization
E_INIT2 No-copy-to structure for initialization
E_INIT3 Too many initializer values
E_INIT4 Attempt to initialize freed named block
E_INIT5 Bad structure type for initialization
E_INIT6 No-assign-to element for initialization
E_INIT7 No-change element for initialization
E_INIT8 No-type-change element for initialization
E_INIT9 No-error-value element for initialization
E_INIT10 No-assign-or-copy-from source for initialization
E_LIST1 No-relocate for list insert
E_LIST2 No-relocate for list delete
E_LIST3 No-relocate for list push
E_LIST4 No-relocate for list append
E_LIST5 No-relocate for list pop
E_LIST6 No-relocate for list remove
E_MODIFY1 Non-variable first argument for modify
E_MODIFY2 Non-string second argument for modify
E_MODIFY3 No-change first argument for modify
E_MODIFY4 Undefined function for modify
E_MODIFY5 Unacceptable type first argument for modify
E_FPATHOPEN1 Non-string arguments for fpathopen
E_FPATHOPEN2 Unrecognized mode for fpathopen
E_LOG1 Bad epsilon argument for log
E_LOG2 Non-numeric first argument for log

View File

@@ -2,7 +2,7 @@
# #
# check - check the regression output for problems # check - check the regression output for problems
# #
# Copyright (C) 1999 Landon Curt Noll # Copyright (C) 1999-2006 Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.2 $ # @(#) $Revision: 29.3 $
# @(#) $Id: check.awk,v 29.2 2000/06/07 14:02:13 chongo Exp $ # @(#) $Id: check.awk,v 29.3 2006/05/20 19:43:39 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/check.awk,v $ # @(#) $Source: /usr/local/src/cmd/calc/RCS/check.awk,v $
# #
# Under source code control: 1996/05/25 22:07:58 # Under source code control: 1996/05/25 22:07:58
@@ -64,7 +64,7 @@ NF == 0 {
end_seen = 1; end_seen = 1;
} }
$1 ~ /^[0-9]+:/ { $1 ~ /^[0-9]+:/ || $1 ~ /^[0-9]+-[0-9]*:/ {
if (error > 0) { if (error > 0) {
if (havebuf2) { if (havebuf2) {
print buf2; print buf2;

93
cmath.h
View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.6 $ * @(#) $Revision: 29.7 $
* @(#) $Id: cmath.h,v 29.6 2002/03/12 09:38:26 chongo Exp $ * @(#) $Id: cmath.h,v 29.7 2005/10/18 10:43:49 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/cmath.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/cmath.h,v $
* *
* Under source code control: 1993/07/30 19:42:45 * Under source code control: 1993/07/30 19:42:45
@@ -63,63 +63,64 @@ extern void cprintfr(COMPLEX *c);
* Basic numeric routines. * Basic numeric routines.
*/ */
extern COMPLEX *cadd(COMPLEX *c1, COMPLEX *c2); extern COMPLEX *c_add(COMPLEX *c1, COMPLEX *c2);
extern COMPLEX *csub(COMPLEX *c1, COMPLEX *c2); extern COMPLEX *c_sub(COMPLEX *c1, COMPLEX *c2);
extern COMPLEX *cmul(COMPLEX *c1, COMPLEX *c2); extern COMPLEX *c_mul(COMPLEX *c1, COMPLEX *c2);
extern COMPLEX *cdiv(COMPLEX *c1, COMPLEX *c2); extern COMPLEX *c_div(COMPLEX *c1, COMPLEX *c2);
extern COMPLEX *caddq(COMPLEX *c, NUMBER *q); extern COMPLEX *c_addq(COMPLEX *c, NUMBER *q);
extern COMPLEX *csubq(COMPLEX *c, NUMBER *q); extern COMPLEX *c_subq(COMPLEX *c, NUMBER *q);
extern COMPLEX *cmulq(COMPLEX *c, NUMBER *q); extern COMPLEX *c_mulq(COMPLEX *c, NUMBER *q);
extern COMPLEX *cdivq(COMPLEX *c, NUMBER *q); extern COMPLEX *c_divq(COMPLEX *c, NUMBER *q);
extern COMPLEX *cscale(COMPLEX *c, long i); extern COMPLEX *c_scale(COMPLEX *c, long i);
extern COMPLEX *cshift(COMPLEX *c, long i); extern COMPLEX *c_shift(COMPLEX *c, long i);
extern COMPLEX *csquare(COMPLEX *c); extern COMPLEX *c_square(COMPLEX *c);
extern COMPLEX *cconj(COMPLEX *c); extern COMPLEX *c_conj(COMPLEX *c);
extern COMPLEX *c_real(COMPLEX *c); extern COMPLEX *c_real(COMPLEX *c);
extern COMPLEX *c_imag(COMPLEX *c); extern COMPLEX *c_imag(COMPLEX *c);
extern COMPLEX *cneg(COMPLEX *c); extern COMPLEX *c_neg(COMPLEX *c);
extern COMPLEX *cinv(COMPLEX *c); extern COMPLEX *c_inv(COMPLEX *c);
extern COMPLEX *cint(COMPLEX *c); extern COMPLEX *c_int(COMPLEX *c);
extern COMPLEX *cfrac(COMPLEX *c); extern COMPLEX *c_frac(COMPLEX *c);
extern BOOL ccmp(COMPLEX *c1, COMPLEX *c2); extern BOOL c_cmp(COMPLEX *c1, COMPLEX *c2);
/* /*
* More complicated functions. * More complicated functions.
*/ */
extern COMPLEX *cpowi(COMPLEX *c, NUMBER *q); extern COMPLEX *c_powi(COMPLEX *c, NUMBER *q);
extern NUMBER *cilog(COMPLEX *c, ZVALUE base); extern NUMBER *c_ilog(COMPLEX *c, ZVALUE base);
/* /*
* Transcendental routines. These all take an epsilon argument to * Transcendental routines. These all take an epsilon argument to
* specify how accurately these are to be calculated. * specify how accurately these are to be calculated.
*/ */
extern COMPLEX *cpower(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon); extern COMPLEX *c_power(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon);
extern COMPLEX *csqrt(COMPLEX *c, NUMBER *epsilon, long R); extern COMPLEX *c_sqrt(COMPLEX *c, NUMBER *epsilon, long R);
extern COMPLEX *croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon); extern COMPLEX *c_root(COMPLEX *c, NUMBER *q, NUMBER *epsilon);
extern COMPLEX *cexp(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_exp(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *cln(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_ln(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *ccos(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_log(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *csin(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_cos(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *ccosh(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_sin(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *csinh(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_cosh(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *cpolar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon); extern COMPLEX *c_sinh(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *crel(COMPLEX *c1, COMPLEX *c2); extern COMPLEX *c_polar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon);
extern COMPLEX *casin(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_rel(COMPLEX *c1, COMPLEX *c2);
extern COMPLEX *cacos(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_asin(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *catan(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_acos(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *cacot(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_atan(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *casec(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_acot(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *cacsc(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_asec(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *casinh(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_acsc(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *cacosh(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_asinh(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *catanh(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_acosh(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *cacoth(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_atanh(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *casech(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_acoth(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *cacsch(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_asech(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *cgd(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_acsch(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *cagd(COMPLEX *c, NUMBER *epsilon); extern COMPLEX *c_gd(COMPLEX *c, NUMBER *epsilon);
extern COMPLEX *c_agd(COMPLEX *c, NUMBER *epsilon);

1387
codegen.c

File diff suppressed because it is too large Load Diff

356
comfunc.c
View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.6 $
* @(#) $Id: comfunc.c,v 29.3 2000/07/17 15:35:49 chongo Exp $ * @(#) $Id: comfunc.c,v 29.6 2006/05/20 08:43:55 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/comfunc.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/comfunc.c,v $
* *
* Under source code control: 1990/02/15 01:48:13 * Under source code control: 1990/02/15 01:48:13
@@ -33,6 +33,16 @@
#include "config.h" #include "config.h"
#include "cmath.h" #include "cmath.h"
/*
* cache the natural logarithm of 10
*/
static COMPLEX *cln_10 = NULL;
static NUMBER *cln_10_epsilon = NULL;
static NUMBER _q10_ = { { _tenval_, 1, 0 }, { _oneval_, 1, 0 }, 1, NULL };
static NUMBER _q0_ = { { _zeroval_, 1, 0 }, { _oneval_, 1, 0 }, 1, NULL };
COMPLEX _cten_ = { &_q10_, &_q0_, 1 };
/* /*
* Compute the result of raising a complex number to an integer power. * Compute the result of raising a complex number to an integer power.
* *
@@ -41,7 +51,7 @@
* q power to raise it to * q power to raise it to
*/ */
COMPLEX * COMPLEX *
cpowi(COMPLEX *c, NUMBER *q) c_powi(COMPLEX *c, NUMBER *q)
{ {
COMPLEX *tmp, *res; /* temporary values */ COMPLEX *tmp, *res; /* temporary values */
long power; /* power to raise to */ long power; /* power to raise to */
@@ -69,29 +79,29 @@ cpowi(COMPLEX *c, NUMBER *q)
*/ */
if (power <= 4) { if (power <= 4) {
switch ((int) (power * sign)) { switch ((int) (power * sign)) {
case 0: case 0:
return clink(&_cone_); return clink(&_cone_);
case 1: case 1:
return clink(c); return clink(c);
case -1: case -1:
return cinv(c); return c_inv(c);
case 2: case 2:
return csquare(c); return c_square(c);
case -2: case -2:
tmp = csquare(c); tmp = c_square(c);
res = cinv(tmp); res = c_inv(tmp);
comfree(tmp); comfree(tmp);
return res; return res;
case 3: case 3:
tmp = csquare(c); tmp = c_square(c);
res = cmul(c, tmp); res = c_mul(c, tmp);
comfree(tmp); comfree(tmp);
return res; return res;
case 4: case 4:
tmp = csquare(c); tmp = c_square(c);
res = csquare(tmp); res = c_square(tmp);
comfree(tmp); comfree(tmp);
return res; return res;
} }
} }
/* /*
@@ -102,26 +112,26 @@ cpowi(COMPLEX *c, NUMBER *q)
while ((bit & power) == 0) while ((bit & power) == 0)
bit >>= 1L; bit >>= 1L;
bit >>= 1L; bit >>= 1L;
res = csquare(c); res = c_square(c);
if (bit & power) { if (bit & power) {
tmp = cmul(res, c); tmp = c_mul(res, c);
comfree(res); comfree(res);
res = tmp; res = tmp;
} }
bit >>= 1L; bit >>= 1L;
while (bit) { while (bit) {
tmp = csquare(res); tmp = c_square(res);
comfree(res); comfree(res);
res = tmp; res = tmp;
if (bit & power) { if (bit & power) {
tmp = cmul(res, c); tmp = c_mul(res, c);
comfree(res); comfree(res);
res = tmp; res = tmp;
} }
bit >>= 1L; bit >>= 1L;
} }
if (sign < 0) { if (sign < 0) {
tmp = cinv(res); tmp = c_inv(res);
comfree(res); comfree(res);
res = tmp; res = tmp;
} }
@@ -134,7 +144,7 @@ cpowi(COMPLEX *c, NUMBER *q)
* Type of rounding of each component specified by R as for qsqrt(). * Type of rounding of each component specified by R as for qsqrt().
*/ */
COMPLEX * COMPLEX *
csqrt(COMPLEX *c, NUMBER *epsilon, long R) c_sqrt(COMPLEX *c, NUMBER *epsilon, long R)
{ {
COMPLEX *r; COMPLEX *r;
NUMBER *es, *aes, *bes, *u, *v, qtemp; NUMBER *es, *aes, *bes, *u, *v, qtemp;
@@ -363,7 +373,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
* Each component of the result is within the specified error. * Each component of the result is within the specified error.
*/ */
COMPLEX * COMPLEX *
croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon) c_root(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
{ {
COMPLEX *r; COMPLEX *r;
NUMBER *a2pb2, *root, *tmp1, *tmp2, *epsilon2; NUMBER *a2pb2, *root, *tmp1, *tmp2, *epsilon2;
@@ -376,7 +386,7 @@ croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
if (cisone(c) || qisone(q)) if (cisone(c) || qisone(q))
return clink(c); return clink(c);
if (qistwo(q)) if (qistwo(q))
return csqrt(c, epsilon, 24L); return c_sqrt(c, epsilon, 24L);
if (cisreal(c) && !qisneg(c->real)) { if (cisreal(c) && !qisneg(c->real)) {
tmp1 = qroot(c->real, q, epsilon); tmp1 = qroot(c->real, q, epsilon);
if (tmp1 == NULL) if (tmp1 == NULL)
@@ -388,8 +398,8 @@ croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
} }
/* /*
* Calculate the root using the formula: * Calculate the root using the formula:
* croot(a + bi, n) = * c_root(a + bi, n) =
* cpolar(qroot(a^2 + b^2, 2 * n), qatan2(b, a) / n). * c_polar(qroot(a^2 + b^2, 2 * n), qatan2(b, a) / n).
*/ */
n = qilog2(epsilon); n = qilog2(epsilon);
epsilon2 = qbitvalue(n - 4); epsilon2 = qbitvalue(n - 4);
@@ -415,7 +425,7 @@ croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
qfree(epsilon2); qfree(epsilon2);
tmp2 = qqdiv(tmp1, q); tmp2 = qqdiv(tmp1, q);
qfree(tmp1); qfree(tmp1);
r = cpolar(root, tmp2, epsilon); r = c_polar(root, tmp2, epsilon);
qfree(root); qfree(root);
qfree(tmp2); qfree(tmp2);
return r; return r;
@@ -428,7 +438,7 @@ croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
* exp(a + bi) = exp(a) * (cos(b) + i * sin(b)). * exp(a + bi) = exp(a) * (cos(b) + i * sin(b)).
*/ */
COMPLEX * COMPLEX *
cexp(COMPLEX *c, NUMBER *epsilon) c_exp(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *r; COMPLEX *r;
NUMBER *sin, *cos, *tmp1, *tmp2, *epsilon1; NUMBER *sin, *cos, *tmp1, *tmp2, *epsilon1;
@@ -485,13 +495,13 @@ cexp(COMPLEX *c, NUMBER *epsilon)
* ln(a + bi) = ln(a^2 + b^2) / 2 + i * atan2(b, a). * ln(a + bi) = ln(a^2 + b^2) / 2 + i * atan2(b, a).
*/ */
COMPLEX * COMPLEX *
cln(COMPLEX *c, NUMBER *epsilon) c_ln(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *r; COMPLEX *r;
NUMBER *a2b2, *tmp1, *tmp2, *epsilon1; NUMBER *a2b2, *tmp1, *tmp2, *epsilon1;
if (ciszero(c)) { if (ciszero(c)) {
math_error("Logarithm of zero"); math_error("logarithm of zero");
/*NOTREACHED*/ /*NOTREACHED*/
} }
if (cisone(c)) if (cisone(c))
@@ -519,6 +529,60 @@ cln(COMPLEX *c, NUMBER *epsilon)
return r; return r;
} }
/*
* Calculate base 10 logarithm by:
*
* log(c) = ln(c) / ln(10)
*/
COMPLEX *
c_log(COMPLEX *c, NUMBER *epsilon)
{
int need_new_cln_10 = TRUE; /* FALSE => use cached cln_10 value */
COMPLEX *ln_c; /* ln(x) */
COMPLEX *ret; /* base 10 logarithm of x */
/*
* compute ln(c) first
*/
ln_c = c_ln(c, epsilon);
/* log(1) == 0 */
if (ciszero(ln_c)) {
return ln_c;
}
/*
* save epsilon for ln(10) if needed
*/
if (cln_10_epsilon == NULL) {
/* first time call */
cln_10_epsilon = qcopy(epsilon);
} else if (qcmp(cln_10_epsilon, epsilon) == FALSE) {
/* replaced cacheed value with epsilon arg */
qfree(cln_10_epsilon);
cln_10_epsilon = qcopy(epsilon);
} else if (cln_10 != NULL) {
/* the previously computed ln(2) is OK to use */
need_new_cln_10 = FALSE;
}
/*
* compute ln(10) if needed
*/
if (need_new_cln_10 == TRUE) {
if (cln_10 != NULL) {
comfree(cln_10);
}
cln_10 = c_ln(&_cten_, cln_10_epsilon);
}
/*
* return ln(c) / ln(10)
*/
ret = c_div(ln_c, cln_10);
comfree(ln_c);
return ret;
}
/* /*
* Calculate the complex cosine within the specified accuracy. * Calculate the complex cosine within the specified accuracy.
@@ -526,7 +590,7 @@ cln(COMPLEX *c, NUMBER *epsilon)
* cos(x) = (exp(1i * x) + exp(-1i * x))/2; * cos(x) = (exp(1i * x) + exp(-1i * x))/2;
*/ */
COMPLEX * COMPLEX *
ccos(COMPLEX *c, NUMBER *epsilon) c_cos(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *r, *ctmp1, *ctmp2, *ctmp3; COMPLEX *r, *ctmp1, *ctmp2, *ctmp3;
NUMBER *epsilon1; NUMBER *epsilon1;
@@ -545,7 +609,7 @@ ccos(COMPLEX *c, NUMBER *epsilon)
ctmp1->real = neg ? qneg(c->imag) : qlink(c->imag); ctmp1->real = neg ? qneg(c->imag) : qlink(c->imag);
ctmp1->imag = neg ? qlink(c->real) : qneg(c->real); ctmp1->imag = neg ? qlink(c->real) : qneg(c->real);
epsilon1 = qbitvalue(n - 2); epsilon1 = qbitvalue(n - 2);
ctmp2 = cexp(ctmp1, epsilon1); ctmp2 = c_exp(ctmp1, epsilon1);
comfree(ctmp1); comfree(ctmp1);
qfree(epsilon1); qfree(epsilon1);
if (ctmp2 == NULL) if (ctmp2 == NULL)
@@ -554,11 +618,11 @@ ccos(COMPLEX *c, NUMBER *epsilon)
comfree(ctmp2); comfree(ctmp2);
return clink(&_czero_); return clink(&_czero_);
} }
ctmp1 = cinv(ctmp2); ctmp1 = c_inv(ctmp2);
ctmp3 = cadd(ctmp2, ctmp1); ctmp3 = c_add(ctmp2, ctmp1);
comfree(ctmp1); comfree(ctmp1);
comfree(ctmp2); comfree(ctmp2);
ctmp1 = cscale(ctmp3, -1); ctmp1 = c_scale(ctmp3, -1);
comfree(ctmp3); comfree(ctmp3);
r = comalloc(); r = comalloc();
qfree(r->real); qfree(r->real);
@@ -576,7 +640,7 @@ ccos(COMPLEX *c, NUMBER *epsilon)
* sin(x) = (exp(1i * x) - exp(-i1*x))/(2i). * sin(x) = (exp(1i * x) - exp(-i1*x))/(2i).
*/ */
COMPLEX * COMPLEX *
csin(COMPLEX *c, NUMBER *epsilon) c_sin(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *r, *ctmp1, *ctmp2, *ctmp3; COMPLEX *r, *ctmp1, *ctmp2, *ctmp3;
NUMBER *qtmp, *epsilon1; NUMBER *qtmp, *epsilon1;
@@ -597,7 +661,7 @@ csin(COMPLEX *c, NUMBER *epsilon)
ctmp1->real = neg ? qneg(c->imag) : qlink(c->imag); ctmp1->real = neg ? qneg(c->imag) : qlink(c->imag);
ctmp1->imag = neg ? qlink(c->real) : qneg(c->real); ctmp1->imag = neg ? qlink(c->real) : qneg(c->real);
epsilon1 = qbitvalue(n - 2); epsilon1 = qbitvalue(n - 2);
ctmp2 = cexp(ctmp1, epsilon1); ctmp2 = c_exp(ctmp1, epsilon1);
comfree(ctmp1); comfree(ctmp1);
qfree(epsilon1); qfree(epsilon1);
if (ctmp2 == NULL) if (ctmp2 == NULL)
@@ -606,11 +670,11 @@ csin(COMPLEX *c, NUMBER *epsilon)
comfree(ctmp2); comfree(ctmp2);
return clink(&_czero_); return clink(&_czero_);
} }
ctmp1 = cinv(ctmp2); ctmp1 = c_inv(ctmp2);
ctmp3 = csub(ctmp2, ctmp1); ctmp3 = c_sub(ctmp2, ctmp1);
comfree(ctmp1); comfree(ctmp1);
comfree(ctmp2); comfree(ctmp2);
ctmp1 = cscale(ctmp3, -1); ctmp1 = c_scale(ctmp3, -1);
comfree(ctmp3); comfree(ctmp3);
r = comalloc(); r = comalloc();
qtmp = neg ? qlink(ctmp1->imag) : qneg(ctmp1->imag); qtmp = neg ? qlink(ctmp1->imag) : qneg(ctmp1->imag);
@@ -627,105 +691,105 @@ csin(COMPLEX *c, NUMBER *epsilon)
COMPLEX * COMPLEX *
ccosh(COMPLEX *c, NUMBER *epsilon) c_cosh(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2, *tmp3; COMPLEX *tmp1, *tmp2, *tmp3;
tmp1 = cexp(c, epsilon); tmp1 = c_exp(c, epsilon);
if (tmp1 == NULL) if (tmp1 == NULL)
return NULL; return NULL;
tmp2 = cneg(c); tmp2 = c_neg(c);
tmp3 = cexp(tmp2, epsilon); tmp3 = c_exp(tmp2, epsilon);
comfree(tmp2); comfree(tmp2);
if (tmp3 == NULL) if (tmp3 == NULL)
return NULL; return NULL;
tmp2 = cadd(tmp1, tmp3); tmp2 = c_add(tmp1, tmp3);
comfree(tmp1); comfree(tmp1);
comfree(tmp3); comfree(tmp3);
tmp1 = cscale(tmp2, -1); tmp1 = c_scale(tmp2, -1);
comfree(tmp2); comfree(tmp2);
return tmp1; return tmp1;
} }
COMPLEX * COMPLEX *
csinh(COMPLEX *c, NUMBER *epsilon) c_sinh(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2, *tmp3; COMPLEX *tmp1, *tmp2, *tmp3;
tmp1 = cexp(c, epsilon); tmp1 = c_exp(c, epsilon);
if (tmp1 == NULL) if (tmp1 == NULL)
return NULL; return NULL;
tmp2 = cneg(c); tmp2 = c_neg(c);
tmp3 = cexp(tmp2, epsilon); tmp3 = c_exp(tmp2, epsilon);
comfree(tmp2); comfree(tmp2);
if (tmp3 == NULL) if (tmp3 == NULL)
return NULL; return NULL;
tmp2 = csub(tmp1, tmp3); tmp2 = c_sub(tmp1, tmp3);
comfree(tmp1); comfree(tmp1);
comfree(tmp3); comfree(tmp3);
tmp1 = cscale(tmp2, -1); tmp1 = c_scale(tmp2, -1);
comfree(tmp2); comfree(tmp2);
return tmp1; return tmp1;
} }
COMPLEX * COMPLEX *
casin(COMPLEX *c, NUMBER *epsilon) c_asin(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2; COMPLEX *tmp1, *tmp2;
tmp1 = cmul(&_conei_, c); tmp1 = c_mul(&_conei_, c);
tmp2 = casinh(tmp1, epsilon); tmp2 = c_asinh(tmp1, epsilon);
comfree(tmp1); comfree(tmp1);
tmp1 = cdiv(tmp2, &_conei_); tmp1 = c_div(tmp2, &_conei_);
comfree(tmp2); comfree(tmp2);
return tmp1; return tmp1;
} }
COMPLEX * COMPLEX *
cacos(COMPLEX *c, NUMBER *epsilon) c_acos(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2; COMPLEX *tmp1, *tmp2;
tmp1 = csquare(c); tmp1 = c_square(c);
tmp2 = csub(&_cone_, tmp1); tmp2 = c_sub(&_cone_, tmp1);
comfree(tmp1); comfree(tmp1);
tmp1 = csqrt(tmp2, epsilon, 24); tmp1 = c_sqrt(tmp2, epsilon, 24);
comfree(tmp2); comfree(tmp2);
tmp2 = cmul(&_conei_, tmp1); tmp2 = c_mul(&_conei_, tmp1);
comfree(tmp1); comfree(tmp1);
tmp1 = cadd(c, tmp2); tmp1 = c_add(c, tmp2);
comfree(tmp2); comfree(tmp2);
tmp2 = cln(tmp1, epsilon); tmp2 = c_ln(tmp1, epsilon);
comfree(tmp1); comfree(tmp1);
tmp1 = cdiv(tmp2, &_conei_); tmp1 = c_div(tmp2, &_conei_);
comfree(tmp2); comfree(tmp2);
return tmp1; return tmp1;
} }
COMPLEX * COMPLEX *
casinh(COMPLEX *c, NUMBER *epsilon) c_asinh(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2, *tmp3; COMPLEX *tmp1, *tmp2, *tmp3;
BOOL neg; BOOL neg;
neg = qisneg(c->real); neg = qisneg(c->real);
tmp1 = neg ? cneg(c) : clink(c); tmp1 = neg ? c_neg(c) : clink(c);
tmp2 = csquare(tmp1); tmp2 = c_square(tmp1);
tmp3 = cadd(&_cone_, tmp2); tmp3 = c_add(&_cone_, tmp2);
comfree(tmp2); comfree(tmp2);
tmp2 = csqrt(tmp3, epsilon, 24); tmp2 = c_sqrt(tmp3, epsilon, 24);
comfree(tmp3); comfree(tmp3);
tmp3 = cadd(tmp2, tmp1); tmp3 = c_add(tmp2, tmp1);
comfree(tmp1); comfree(tmp1);
comfree(tmp2); comfree(tmp2);
tmp1 = cln(tmp3, epsilon); tmp1 = c_ln(tmp3, epsilon);
comfree(tmp3); comfree(tmp3);
if (neg) { if (neg) {
tmp2 = cneg(tmp1); tmp2 = c_neg(tmp1);
comfree(tmp1); comfree(tmp1);
return tmp2; return tmp2;
} }
@@ -734,153 +798,153 @@ casinh(COMPLEX *c, NUMBER *epsilon)
COMPLEX * COMPLEX *
cacosh(COMPLEX *c, NUMBER *epsilon) c_acosh(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2; COMPLEX *tmp1, *tmp2;
tmp1 = csquare(c); tmp1 = c_square(c);
tmp2 = csub(tmp1, &_cone_); tmp2 = c_sub(tmp1, &_cone_);
comfree(tmp1); comfree(tmp1);
tmp1 = csqrt(tmp2, epsilon, 24); tmp1 = c_sqrt(tmp2, epsilon, 24);
comfree(tmp2); comfree(tmp2);
tmp2 = cadd(c, tmp1); tmp2 = c_add(c, tmp1);
comfree(tmp1); comfree(tmp1);
tmp1 = cln(tmp2, epsilon); tmp1 = c_ln(tmp2, epsilon);
comfree(tmp2); comfree(tmp2);
return tmp1; return tmp1;
} }
COMPLEX * COMPLEX *
catan(COMPLEX *c, NUMBER *epsilon) c_atan(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2, *tmp3; COMPLEX *tmp1, *tmp2, *tmp3;
if (qiszero(c->real) && qisunit(c->imag)) if (qiszero(c->real) && qisunit(c->imag))
return NULL; return NULL;
tmp1 = csub(&_conei_, c); tmp1 = c_sub(&_conei_, c);
tmp2 = cadd(&_conei_, c); tmp2 = c_add(&_conei_, c);
tmp3 = cdiv(tmp1, tmp2); tmp3 = c_div(tmp1, tmp2);
comfree(tmp1); comfree(tmp1);
comfree(tmp2); comfree(tmp2);
tmp1 = cln(tmp3, epsilon); tmp1 = c_ln(tmp3, epsilon);
comfree(tmp3); comfree(tmp3);
tmp2 = cscale(tmp1, -1); tmp2 = c_scale(tmp1, -1);
comfree(tmp1); comfree(tmp1);
tmp1 = cdiv(tmp2, &_conei_); tmp1 = c_div(tmp2, &_conei_);
comfree(tmp2); comfree(tmp2);
return tmp1; return tmp1;
} }
COMPLEX * COMPLEX *
cacot(COMPLEX *c, NUMBER *epsilon) c_acot(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2, *tmp3; COMPLEX *tmp1, *tmp2, *tmp3;
if (qiszero(c->real) && qisunit(c->imag)) if (qiszero(c->real) && qisunit(c->imag))
return NULL; return NULL;
tmp1 = cadd(c, &_conei_); tmp1 = c_add(c, &_conei_);
tmp2 = csub(c, &_conei_); tmp2 = c_sub(c, &_conei_);
tmp3 = cdiv(tmp1, tmp2); tmp3 = c_div(tmp1, tmp2);
comfree(tmp1); comfree(tmp1);
comfree(tmp2); comfree(tmp2);
tmp1 = cln(tmp3, epsilon); tmp1 = c_ln(tmp3, epsilon);
comfree(tmp3); comfree(tmp3);
tmp2 = cscale(tmp1, -1); tmp2 = c_scale(tmp1, -1);
comfree(tmp1); comfree(tmp1);
tmp1 = cdiv(tmp2, &_conei_); tmp1 = c_div(tmp2, &_conei_);
comfree(tmp2); comfree(tmp2);
return tmp1; return tmp1;
} }
COMPLEX * COMPLEX *
casec(COMPLEX *c, NUMBER *epsilon) c_asec(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2; COMPLEX *tmp1, *tmp2;
tmp1 = cinv(c); tmp1 = c_inv(c);
tmp2 = cacos(tmp1, epsilon); tmp2 = c_acos(tmp1, epsilon);
comfree(tmp1); comfree(tmp1);
return tmp2; return tmp2;
} }
COMPLEX * COMPLEX *
cacsc(COMPLEX *c, NUMBER *epsilon) c_acsc(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2; COMPLEX *tmp1, *tmp2;
tmp1 = cinv(c); tmp1 = c_inv(c);
tmp2 = casin(tmp1, epsilon); tmp2 = c_asin(tmp1, epsilon);
comfree(tmp1); comfree(tmp1);
return tmp2; return tmp2;
} }
COMPLEX * COMPLEX *
catanh(COMPLEX *c, NUMBER *epsilon) c_atanh(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2, *tmp3; COMPLEX *tmp1, *tmp2, *tmp3;
if (qiszero(c->imag) && qisunit(c->real)) if (qiszero(c->imag) && qisunit(c->real))
return NULL; return NULL;
tmp1 = cadd(&_cone_, c); tmp1 = c_add(&_cone_, c);
tmp2 = csub(&_cone_, c); tmp2 = c_sub(&_cone_, c);
tmp3 = cdiv(tmp1, tmp2); tmp3 = c_div(tmp1, tmp2);
comfree(tmp1); comfree(tmp1);
comfree(tmp2); comfree(tmp2);
tmp1 = cln(tmp3, epsilon); tmp1 = c_ln(tmp3, epsilon);
comfree(tmp3); comfree(tmp3);
tmp2 = cscale(tmp1, -1); tmp2 = c_scale(tmp1, -1);
comfree(tmp1); comfree(tmp1);
return tmp2; return tmp2;
} }
COMPLEX * COMPLEX *
cacoth(COMPLEX *c, NUMBER *epsilon) c_acoth(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2, *tmp3; COMPLEX *tmp1, *tmp2, *tmp3;
if (qiszero(c->imag) && qisunit(c->real)) if (qiszero(c->imag) && qisunit(c->real))
return NULL; return NULL;
tmp1 = cadd(c, &_cone_); tmp1 = c_add(c, &_cone_);
tmp2 = csub(c, &_cone_); tmp2 = c_sub(c, &_cone_);
tmp3 = cdiv(tmp1, tmp2); tmp3 = c_div(tmp1, tmp2);
comfree(tmp1); comfree(tmp1);
comfree(tmp2); comfree(tmp2);
tmp1 = cln(tmp3, epsilon); tmp1 = c_ln(tmp3, epsilon);
comfree(tmp3); comfree(tmp3);
tmp2 = cscale(tmp1, -1); tmp2 = c_scale(tmp1, -1);
comfree(tmp1); comfree(tmp1);
return tmp2; return tmp2;
} }
COMPLEX * COMPLEX *
casech(COMPLEX *c, NUMBER *epsilon) c_asech(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2; COMPLEX *tmp1, *tmp2;
tmp1 = cinv(c); tmp1 = c_inv(c);
tmp2 = cacosh(tmp1, epsilon); tmp2 = c_acosh(tmp1, epsilon);
comfree(tmp1); comfree(tmp1);
return tmp2; return tmp2;
} }
COMPLEX * COMPLEX *
cacsch(COMPLEX *c, NUMBER *epsilon) c_acsch(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2; COMPLEX *tmp1, *tmp2;
tmp1 = cinv(c); tmp1 = c_inv(c);
tmp2 = casinh(tmp1, epsilon); tmp2 = c_asinh(tmp1, epsilon);
comfree(tmp1); comfree(tmp1);
return tmp2; return tmp2;
} }
COMPLEX * COMPLEX *
cgd(COMPLEX *c, NUMBER *epsilon) c_gd(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2, *tmp3; COMPLEX *tmp1, *tmp2, *tmp3;
NUMBER *q1, *q2; NUMBER *q1, *q2;
@@ -947,30 +1011,30 @@ cgd(COMPLEX *c, NUMBER *epsilon)
return tmp1; return tmp1;
} }
neg = qisneg(c->real); neg = qisneg(c->real);
tmp1 = neg ? cneg(c) : clink(c); tmp1 = neg ? c_neg(c) : clink(c);
tmp2 = cexp(tmp1, epsilon); tmp2 = c_exp(tmp1, epsilon);
comfree(tmp1); comfree(tmp1);
if (tmp2 == NULL) if (tmp2 == NULL)
return NULL; return NULL;
tmp1 = cmul(&_conei_, tmp2); tmp1 = c_mul(&_conei_, tmp2);
tmp3 = cadd(&_conei_, tmp2); tmp3 = c_add(&_conei_, tmp2);
comfree(tmp2); comfree(tmp2);
tmp2 = cadd(tmp1, &_cone_); tmp2 = c_add(tmp1, &_cone_);
comfree(tmp1); comfree(tmp1);
if (ciszero(tmp2) || ciszero(tmp3)) { if (ciszero(tmp2) || ciszero(tmp3)) {
comfree(tmp2); comfree(tmp2);
comfree(tmp3); comfree(tmp3);
return NULL; return NULL;
} }
tmp1 = cdiv(tmp2, tmp3); tmp1 = c_div(tmp2, tmp3);
comfree(tmp2); comfree(tmp2);
comfree(tmp3); comfree(tmp3);
tmp2 = cln(tmp1, epsilon); tmp2 = c_ln(tmp1, epsilon);
comfree(tmp1); comfree(tmp1);
tmp1 = cdiv(tmp2, &_conei_); tmp1 = c_div(tmp2, &_conei_);
comfree(tmp2); comfree(tmp2);
if (neg) { if (neg) {
tmp2 = cneg(tmp1); tmp2 = c_neg(tmp1);
comfree(tmp1); comfree(tmp1);
return tmp2; return tmp2;
} }
@@ -979,16 +1043,16 @@ cgd(COMPLEX *c, NUMBER *epsilon)
COMPLEX * COMPLEX *
cagd(COMPLEX *c, NUMBER *epsilon) c_agd(COMPLEX *c, NUMBER *epsilon)
{ {
COMPLEX *tmp1, *tmp2; COMPLEX *tmp1, *tmp2;
tmp1 = cmul(&_conei_, c); tmp1 = c_mul(&_conei_, c);
tmp2 = cgd(tmp1, epsilon); tmp2 = c_gd(tmp1, epsilon);
comfree(tmp1); comfree(tmp1);
if (tmp2 == NULL) if (tmp2 == NULL)
return NULL; return NULL;
tmp1 = cdiv(tmp2, &_conei_); tmp1 = c_div(tmp2, &_conei_);
comfree(tmp2); comfree(tmp2);
return tmp1; return tmp1;
} }
@@ -1000,7 +1064,7 @@ cagd(COMPLEX *c, NUMBER *epsilon)
* q1 * cos(q2) + q1 * sin(q2) * i. * q1 * cos(q2) + q1 * sin(q2) * i.
*/ */
COMPLEX * COMPLEX *
cpolar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon) c_polar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
{ {
COMPLEX *r; COMPLEX *r;
NUMBER *tmp, *cos, *sin; NUMBER *tmp, *cos, *sin;
@@ -1042,7 +1106,7 @@ cpolar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
* specified error. * specified error.
*/ */
COMPLEX * COMPLEX *
cpower(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon) c_power(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon)
{ {
COMPLEX *ctmp1, *ctmp2; COMPLEX *ctmp1, *ctmp2;
long k1, k2, k, m1, m2, m, n; long k1, k2, k, m1, m2, m, n;
@@ -1099,11 +1163,11 @@ cpower(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon)
if (k < n) if (k < n)
return clink(&_czero_); return clink(&_czero_);
epsilon1 = qbitvalue(n - k - m - 2); epsilon1 = qbitvalue(n - k - m - 2);
ctmp1 = cln(c1, epsilon1); ctmp1 = c_ln(c1, epsilon1);
qfree(epsilon1); qfree(epsilon1);
ctmp2 = cmul(ctmp1, c2); ctmp2 = c_mul(ctmp1, c2);
comfree(ctmp1); comfree(ctmp1);
ctmp1 = cexp(ctmp2, epsilon); ctmp1 = c_exp(ctmp2, epsilon);
comfree(ctmp2); comfree(ctmp2);
return ctmp1; return ctmp1;
} }
@@ -1165,7 +1229,7 @@ cprintfr(COMPLEX *c)
NUMBER * NUMBER *
cilog(COMPLEX *c, ZVALUE base) c_ilog(COMPLEX *c, ZVALUE base)
{ {
NUMBER *qr, *qi; NUMBER *qr, *qi;

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.4 $
* @(#) $Id: commath.c,v 29.3 2002/03/12 09:38:26 chongo Exp $ * @(#) $Id: commath.c,v 29.4 2005/10/18 10:43:49 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/commath.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/commath.c,v $
* *
* Under source code control: 1990/02/15 01:48:10 * Under source code control: 1990/02/15 01:48:10
@@ -42,7 +42,7 @@ static COMPLEX _cnegone_ = { &_qnegone_, &_qzero_, 1 };
* Add two complex numbers. * Add two complex numbers.
*/ */
COMPLEX * COMPLEX *
cadd(COMPLEX *c1, COMPLEX *c2) c_add(COMPLEX *c1, COMPLEX *c2)
{ {
COMPLEX *r; COMPLEX *r;
@@ -67,7 +67,7 @@ cadd(COMPLEX *c1, COMPLEX *c2)
* Subtract two complex numbers. * Subtract two complex numbers.
*/ */
COMPLEX * COMPLEX *
csub(COMPLEX *c1, COMPLEX *c2) c_sub(COMPLEX *c1, COMPLEX *c2)
{ {
COMPLEX *r; COMPLEX *r;
@@ -98,7 +98,7 @@ csub(COMPLEX *c1, COMPLEX *c2)
* Then (a+bi) * (c+di) = (q2 - q3) + (q1 - q2 - q3)i. * Then (a+bi) * (c+di) = (q2 - q3) + (q1 - q2 - q3)i.
*/ */
COMPLEX * COMPLEX *
cmul(COMPLEX *c1, COMPLEX *c2) c_mul(COMPLEX *c1, COMPLEX *c2)
{ {
COMPLEX *r; COMPLEX *r;
NUMBER *q1, *q2, *q3, *q4; NUMBER *q1, *q2, *q3, *q4;
@@ -110,9 +110,9 @@ cmul(COMPLEX *c1, COMPLEX *c2)
if (cisone(c2)) if (cisone(c2))
return clink(c1); return clink(c1);
if (cisreal(c2)) if (cisreal(c2))
return cmulq(c1, c2->real); return c_mulq(c1, c2->real);
if (cisreal(c1)) if (cisreal(c1))
return cmulq(c2, c1->real); return c_mulq(c2, c1->real);
/* /*
* Need to do the full calculation. * Need to do the full calculation.
*/ */
@@ -141,7 +141,7 @@ cmul(COMPLEX *c1, COMPLEX *c2)
* Square a complex number. * Square a complex number.
*/ */
COMPLEX * COMPLEX *
csquare(COMPLEX *c) c_square(COMPLEX *c)
{ {
COMPLEX *r; COMPLEX *r;
NUMBER *q1, *q2; NUMBER *q1, *q2;
@@ -183,7 +183,7 @@ csquare(COMPLEX *c)
* Divide two complex numbers. * Divide two complex numbers.
*/ */
COMPLEX * COMPLEX *
cdiv(COMPLEX *c1, COMPLEX *c2) c_div(COMPLEX *c1, COMPLEX *c2)
{ {
COMPLEX *r; COMPLEX *r;
NUMBER *q1, *q2, *q3, *den; NUMBER *q1, *q2, *q3, *den;
@@ -254,7 +254,7 @@ cdiv(COMPLEX *c1, COMPLEX *c2)
* Invert a complex number. * Invert a complex number.
*/ */
COMPLEX * COMPLEX *
cinv(COMPLEX *c) c_inv(COMPLEX *c)
{ {
COMPLEX *r; COMPLEX *r;
NUMBER *q1, *q2, *den; NUMBER *q1, *q2, *den;
@@ -296,7 +296,7 @@ cinv(COMPLEX *c)
* Negate a complex number. * Negate a complex number.
*/ */
COMPLEX * COMPLEX *
cneg(COMPLEX *c) c_neg(COMPLEX *c)
{ {
COMPLEX *r; COMPLEX *r;
@@ -320,7 +320,7 @@ cneg(COMPLEX *c)
* This means take the integer part of both components. * This means take the integer part of both components.
*/ */
COMPLEX * COMPLEX *
cint(COMPLEX *c) c_int(COMPLEX *c)
{ {
COMPLEX *r; COMPLEX *r;
@@ -340,7 +340,7 @@ cint(COMPLEX *c)
* This means take the fractional part of both components. * This means take the fractional part of both components.
*/ */
COMPLEX * COMPLEX *
cfrac(COMPLEX *c) c_frac(COMPLEX *c)
{ {
COMPLEX *r; COMPLEX *r;
@@ -360,7 +360,7 @@ cfrac(COMPLEX *c)
* This negates the complex part. * This negates the complex part.
*/ */
COMPLEX * COMPLEX *
cconj(COMPLEX *c) c_conj(COMPLEX *c)
{ {
COMPLEX *r; COMPLEX *r;
@@ -417,7 +417,7 @@ c_imag(COMPLEX *c)
* Add a real number to a complex number. * Add a real number to a complex number.
*/ */
COMPLEX * COMPLEX *
caddq(COMPLEX *c, NUMBER *q) c_addq(COMPLEX *c, NUMBER *q)
{ {
COMPLEX *r; COMPLEX *r;
@@ -436,7 +436,7 @@ caddq(COMPLEX *c, NUMBER *q)
* Subtract a real number from a complex number. * Subtract a real number from a complex number.
*/ */
COMPLEX * COMPLEX *
csubq(COMPLEX *c, NUMBER *q) c_subq(COMPLEX *c, NUMBER *q)
{ {
COMPLEX *r; COMPLEX *r;
@@ -456,7 +456,7 @@ csubq(COMPLEX *c, NUMBER *q)
* number of bits. Negative values shift to the right. * number of bits. Negative values shift to the right.
*/ */
COMPLEX * COMPLEX *
cshift(COMPLEX *c, long n) c_shift(COMPLEX *c, long n)
{ {
COMPLEX *r; COMPLEX *r;
@@ -475,7 +475,7 @@ cshift(COMPLEX *c, long n)
* Scale a complex number by a power of two. * Scale a complex number by a power of two.
*/ */
COMPLEX * COMPLEX *
cscale(COMPLEX *c, long n) c_scale(COMPLEX *c, long n)
{ {
COMPLEX *r; COMPLEX *r;
@@ -494,7 +494,7 @@ cscale(COMPLEX *c, long n)
* Multiply a complex number by a real number. * Multiply a complex number by a real number.
*/ */
COMPLEX * COMPLEX *
cmulq(COMPLEX *c, NUMBER *q) c_mulq(COMPLEX *c, NUMBER *q)
{ {
COMPLEX *r; COMPLEX *r;
@@ -503,7 +503,7 @@ cmulq(COMPLEX *c, NUMBER *q)
if (qisone(q)) if (qisone(q))
return clink(c); return clink(c);
if (qisnegone(q)) if (qisnegone(q))
return cneg(c); return c_neg(c);
r = comalloc(); r = comalloc();
qfree(r->real); qfree(r->real);
qfree(r->imag); qfree(r->imag);
@@ -517,7 +517,7 @@ cmulq(COMPLEX *c, NUMBER *q)
* Divide a complex number by a real number. * Divide a complex number by a real number.
*/ */
COMPLEX * COMPLEX *
cdivq(COMPLEX *c, NUMBER *q) c_divq(COMPLEX *c, NUMBER *q)
{ {
COMPLEX *r; COMPLEX *r;
@@ -528,7 +528,7 @@ cdivq(COMPLEX *c, NUMBER *q)
if (qisone(q)) if (qisone(q))
return clink(c); return clink(c);
if (qisnegone(q)) if (qisnegone(q))
return cneg(c); return c_neg(c);
r = comalloc(); r = comalloc();
qfree(r->real); qfree(r->real);
qfree(r->imag); qfree(r->imag);
@@ -564,7 +564,7 @@ qqtoc(NUMBER *q1, NUMBER *q2)
* and TRUE if they differ. * and TRUE if they differ.
*/ */
BOOL BOOL
ccmp(COMPLEX *c1, COMPLEX *c2) c_cmp(COMPLEX *c1, COMPLEX *c2)
{ {
BOOL i; BOOL i;
@@ -581,7 +581,7 @@ ccmp(COMPLEX *c1, COMPLEX *c2)
* imaginary parts of the two numbers. * imaginary parts of the two numbers.
*/ */
COMPLEX * COMPLEX *
crel(COMPLEX *c1, COMPLEX *c2) c_rel(COMPLEX *c1, COMPLEX *c2)
{ {
COMPLEX *c; COMPLEX *c;

View File

@@ -1,7 +1,7 @@
/* /*
* config - configuration routines * config - configuration routines
* *
* Copyright (C) 1999-2002 David I. Bell and Landon Curt Noll * Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.12 $ * @(#) $Revision: 29.17 $
* @(#) $Id: config.c,v 29.12 2004/02/23 05:59:50 chongo Exp $ * @(#) $Id: config.c,v 29.17 2006/05/19 15:26:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/config.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/config.c,v $
* *
* Under source code control: 1991/07/20 00:21:56 * Under source code control: 1991/07/20 00:21:56
@@ -38,6 +38,7 @@
#include "nametype.h" #include "nametype.h"
#include "config.h" #include "config.h"
#include "string.h" #include "string.h"
#include "custom.h"
#include "have_strdup.h" #include "have_strdup.h"
#if !defined(HAVE_STRDUP) #if !defined(HAVE_STRDUP)
@@ -93,6 +94,8 @@ NAMETYPE configs[] = {
{"basename", CONFIG_BASENAME}, {"basename", CONFIG_BASENAME},
{"windows", CONFIG_WINDOWS}, {"windows", CONFIG_WINDOWS},
{"cygwin", CONFIG_CYGWIN}, {"cygwin", CONFIG_CYGWIN},
{"compile_custom", CONFIG_COMPILE_CUSTOM},
{"allow_custom", CONFIG_ALLOW_CUSTOM},
{"version", CONFIG_VERSION}, {"version", CONFIG_VERSION},
{NULL, 0} {NULL, 0}
}; };
@@ -150,6 +153,12 @@ CONFIG oldstd = { /* backward compatible standard configuration */
#else #else
FALSE, /* not compiled with cygwin */ FALSE, /* not compiled with cygwin */
#endif #endif
#if defined(CUSTOM)
TRUE, /* compiled with -DCUSTOM */
#else
FALSE, /* compiled without -DCUSTOM */
#endif
&allow_custom, /* *TRUE=> custom functions are enabled */
NULL /* version */ NULL /* version */
}; };
CONFIG newstd = { /* new non-backward compatible configuration */ CONFIG newstd = { /* new non-backward compatible configuration */
@@ -201,6 +210,12 @@ CONFIG newstd = { /* new non-backward compatible configuration */
#else #else
FALSE, /* not compiled with cygwin */ FALSE, /* not compiled with cygwin */
#endif #endif
#if defined(CUSTOM)
TRUE, /* compiled with -DCUSTOM */
#else
FALSE, /* compiled without -DCUSTOM */
#endif
&allow_custom, /* *TRUE=> custom functions are enabled */
NULL /* version */ NULL /* version */
}; };
CONFIG *conf = NULL; /* loaded in at startup - current configuration */ CONFIG *conf = NULL; /* loaded in at startup - current configuration */
@@ -417,7 +432,7 @@ setconfig(int type, VALUE *vp)
NUMBER *q; NUMBER *q;
CONFIG *newconf; /* new configuration to set */ CONFIG *newconf; /* new configuration to set */
long temp; long temp;
LEN len; LEN len = 0;
char *p; char *p;
switch (type) { switch (type) {
@@ -707,7 +722,7 @@ setconfig(int type, VALUE *vp)
math_error("Cannot duplicate new prompt"); math_error("Cannot duplicate new prompt");
/*NOTREACHED*/ /*NOTREACHED*/
} }
strcpy(p, vp->v_str->s_str); strncpy(p, vp->v_str->s_str, vp->v_str->s_len + 1);
free(conf->prompt1); free(conf->prompt1);
conf->prompt1 = p; conf->prompt1 = p;
break; break;
@@ -722,7 +737,7 @@ setconfig(int type, VALUE *vp)
math_error("Cannot duplicate new more prompt"); math_error("Cannot duplicate new more prompt");
/*NOTREACHED*/ /*NOTREACHED*/
} }
strcpy(p, vp->v_str->s_str); strncpy(p, vp->v_str->s_str, vp->v_str->s_len + 1);
free(conf->prompt2); free(conf->prompt2);
conf->prompt2 = p; conf->prompt2 = p;
break; break;
@@ -872,6 +887,14 @@ setconfig(int type, VALUE *vp)
math_error("The cygwin config parameter is read-only"); math_error("The cygwin config parameter is read-only");
/*NOTREACHED*/ /*NOTREACHED*/
case CONFIG_COMPILE_CUSTOM:
math_error("The custom config parameter is read-only");
/*NOTREACHED*/
case CONFIG_ALLOW_CUSTOM:
math_error("The allow_custom config parameter is read-only");
/*NOTREACHED*/
case CONFIG_VERSION: case CONFIG_VERSION:
math_error("The version config parameter is read-only"); math_error("The version config parameter is read-only");
/*NOTREACHED*/ /*NOTREACHED*/
@@ -936,6 +959,7 @@ config_copy(CONFIG *src)
} else { } else {
dest->base_name = strdup(src->base_name); dest->base_name = strdup(src->base_name);
} }
/* NOTE: allow_custom points to a global variable, so do not clone it */
if (src->version == NULL) { if (src->version == NULL) {
dest->version = strdup(version()); dest->version = strdup(version());
} else { } else {
@@ -983,6 +1007,7 @@ config_free(CONFIG *cfg)
if (cfg->base_name != NULL) { if (cfg->base_name != NULL) {
free(cfg->base_name); free(cfg->base_name);
} }
/* NOTE: allow_custom points to a global variable, so do not free it */
if (cfg->version != NULL) { if (cfg->version != NULL) {
free(cfg->version); free(cfg->version);
} }
@@ -1262,6 +1287,26 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
} }
return; return;
case CONFIG_COMPILE_CUSTOM:
if (cfg->compile_custom) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
case CONFIG_ALLOW_CUSTOM:
/* firewall */
if (cfg->allow_custom == NULL) {
cfg->allow_custom = &allow_custom;
}
if (*(cfg->allow_custom)) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
case CONFIG_VERSION: case CONFIG_VERSION:
vp->v_type = V_STR; vp->v_type = V_STR;
if (cfg->version == NULL) { if (cfg->version == NULL) {
@@ -1361,9 +1406,19 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
(cfg1->base_name != NULL && cfg2->base_name != NULL && (cfg1->base_name != NULL && cfg2->base_name != NULL &&
strcmp(cfg1->base_name, cfg2->base_name) != 0) || strcmp(cfg1->base_name, cfg2->base_name) != 0) ||
cfg1->windows != cfg2->windows ||
cfg1->cygwin != cfg2->cygwin ||
cfg1->compile_custom != cfg2->compile_custom ||
(cfg1->allow_custom == NULL && cfg2->allow_custom != NULL) ||
(cfg1->allow_custom != NULL && cfg2->allow_custom == NULL) ||
(cfg1->allow_custom != NULL && cfg2->allow_custom != NULL &&
*(cfg1->allow_custom) != *(cfg2->allow_custom)) ||
(cfg1->version == NULL && cfg2->version != NULL) || (cfg1->version == NULL && cfg2->version != NULL) ||
(cfg1->version != NULL && cfg2->version == NULL) || (cfg1->version != NULL && cfg2->version == NULL) ||
cfg1->windows != cfg2->windows ||
(cfg1->version != NULL && cfg2->version != NULL && (cfg1->version != NULL && cfg2->version != NULL &&
strcmp(cfg1->version, cfg2->version) != 0); strcmp(cfg1->version, cfg2->version) != 0);
} }

View File

@@ -1,7 +1,7 @@
/* /*
* config - configuration routines * config - configuration routines
* *
* Copyright (C) 1999-2002 Landon Curt Noll and David I. Bell * Copyright (C) 1999-2004 Landon Curt Noll and David I. Bell
* *
* Primary author: Landon Curt Noll * Primary author: Landon Curt Noll
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.15 $ * @(#) $Revision: 29.17 $
* @(#) $Id: config.h,v 29.15 2004/02/23 06:08:29 chongo Exp $ * @(#) $Id: config.h,v 29.17 2004/02/25 23:56:13 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/config.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/config.h,v $
* *
* Under source code control: 1995/11/01 22:20:17 * Under source code control: 1995/11/01 22:20:17
@@ -92,6 +92,8 @@
#define CONFIG_WINDOWS 38 #define CONFIG_WINDOWS 38
#define CONFIG_MODE2 39 #define CONFIG_MODE2 39
#define CONFIG_CYGWIN 40 #define CONFIG_CYGWIN 40
#define CONFIG_COMPILE_CUSTOM 41
#define CONFIG_ALLOW_CUSTOM 42
/* /*
@@ -157,6 +159,8 @@ struct config {
char *base_name; /* basename of our name */ char *base_name; /* basename of our name */
BOOL windows; /* TRUE => running under MS windows */ BOOL windows; /* TRUE => running under MS windows */
BOOL cygwin; /* TRUE => compiled with cygwin */ BOOL cygwin; /* TRUE => compiled with cygwin */
BOOL compile_custom; /* TRUE => compiled with -DCUSTOM */
BOOL *allow_custom; /* ptr to if custom functions are allowed */
char *version; /* calc version string */ char *version; /* calc version string */
}; };
typedef struct config CONFIG; typedef struct config CONFIG;

View File

@@ -1,7 +1,7 @@
/* /*
* const - constant number storage module * const - constant number storage module
* *
* Copyright (C) 1999 David I. Bell * Copyright (C) 1999-2004 David I. Bell
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.4 $
* @(#) $Id: const.c,v 29.3 2004/02/23 07:50:41 chongo Exp $ * @(#) $Id: const.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/const.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/const.c,v $
* *
* Under source code control: 1990/02/15 01:48:14 * Under source code control: 1990/02/15 01:48:14

View File

@@ -1,7 +1,7 @@
/* /*
* custom - interface for custom software and hardware interfaces * custom - interface for custom software and hardware interfaces
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999-2006 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.6 $
* @(#) $Id: custom.c,v 29.3 2001/03/17 21:31:47 chongo Exp $ * @(#) $Id: custom.c,v 29.6 2006/05/19 15:26:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/custom.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/custom.c,v $
* *
* Under source code control: 1997/03/03 04:53:08 * Under source code control: 1997/03/03 04:53:08
@@ -51,7 +51,7 @@
#endif /* CUSTOM */ #endif /* CUSTOM */
int allow_custom = FALSE; /* TRUE => custom builtins allowed */ BOOL allow_custom = FALSE; /* TRUE => custom builtins allowed */
/* /*
@@ -189,7 +189,7 @@ customhelp(char *name)
/* /*
* form the custom help name * form the custom help name
*/ */
customname = (char *)malloc(sizeof("custhelp")+strlen(name)+1); customname = (char *)malloc(sizeof("custhelp")+1+strlen(name)+1);
if (customname == NULL) { if (customname == NULL) {
math_error("bad malloc of customname"); math_error("bad malloc of customname");
/*NOTREACHED*/ /*NOTREACHED*/

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: custom.h,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: custom.h,v 29.3 2004/02/25 23:54:40 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/custom.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/custom.h,v $
* *
* Under source code control: 1997/03/03 04:53:08 * Under source code control: 1997/03/03 04:53:08
@@ -72,7 +72,7 @@ struct custom {
* These are the required interfaces. The dummy.c stubs these interfaces too. * These are the required interfaces. The dummy.c stubs these interfaces too.
*/ */
extern VALUE custom(char*, int, VALUE**); /* master custom interface */ extern VALUE custom(char*, int, VALUE**); /* master custom interface */
extern int allow_custom; /* TRUE => custom builtins allowed */ extern BOOL allow_custom; /* TRUE => custom builtins allowed */
extern void showcustom(void); /* print custom functions */ extern void showcustom(void); /* print custom functions */
extern void customhelp(char *); /* direct custom help */ extern void customhelp(char *); /* direct custom help */
extern CONST struct custom cust[]; /* custom interface table */ extern CONST struct custom cust[]; /* custom interface table */

View File

@@ -36,13 +36,14 @@ Step 1: Do some background work
anything in Steps 2 and beyond! anything in Steps 2 and beyond!
If you are not familiar with calc internals, we recommend that If you are not familiar with calc internals, we recommend that
you look at some examples of custom functions. Check out you look at some examples of custom functions. Look at the
the following source files: the following source files:
custom.c custom.c
custom/custom.h custom.h
custom/custtbl.c custom/custtbl.c
custom/c_*.[ch] custom/c_*.[ch]
custom/*.cal
help/custom (or run: calc help custom) help/custom (or run: calc help custom)
You would be well advised to look at a more recent calc source You would be well advised to look at a more recent calc source
@@ -83,14 +84,15 @@ Step 3: Document your custom function
Take a look at one of the example custom help files: Take a look at one of the example custom help files:
devnull custom/devnull
argv custom/argv
help custom/help
sysinfo custom/sysinfo
You can save time by using one of the custom help files You can save time by using one of the custom help files
as a template. Copy one of these files to your own help file: as a template. Copy one of these files to your own help file:
cd custom
cp sysinfo curds cp sysinfo curds
and edit it accordingly. and edit it accordingly.
@@ -107,15 +109,16 @@ Step 4: Write your test code
test code will be an import part of your submission. Your test test code will be an import part of your submission. Your test
code will also service as additional for your custom function. code will also service as additional for your custom function.
Coops ... we said we would stop preaching, sorry about that ... Oops ... we said we would stop preaching, sorry about that ...
You can use one of the following as a template: You can use one of the following as a template:
argv.cal custom/argv.cal
halflen.cal custom/halflen.cal
Copy one of these to your own file: Copy one of these to your own file:
cd custom
cp halflen.cal curds.cal cp halflen.cal curds.cal
and exit it accordingly. In particular you will want to: and exit it accordingly. In particular you will want to:
@@ -152,6 +155,7 @@ Step 5: Write your custom function
We recommend that you use one of the c_*.c files as a template. We recommend that you use one of the c_*.c files as a template.
Copy an appropriate file to your file: Copy an appropriate file to your file:
cd custom
cp c_argv.c u_curds.c cp c_argv.c u_curds.c
Before you edit it, you should note that there are several important Before you edit it, you should note that there are several important
@@ -179,9 +183,6 @@ Step 5: Write your custom function
VALUE VALUE
u_curds(char *name, int count, VALUE **vals) u_curds(char *name, int count, VALUE **vals)
The /*ARGSUSED*/ may be needed if you do not make use
of all 3 function parameters.
The 3 args are passed in by the custom interface The 3 args are passed in by the custom interface
and have the following meaning: and have the following meaning:
@@ -222,6 +223,15 @@ Step 5: Write your custom function
vals[1] points to b vals[1] points to b
vals[2] points to c vals[2] points to c
NOTE: If you do not use any of the 3 function parameters,
then you should declare that function parameter to be UNUSED.
For example, if the count and vals parameters were not used
in your custom function, then your declaraction should be:
/*ARGSUSED*/
VALUE
u_curds(char *name, int UNUSED count, VALUE UNUSED **vals)
c) The return value is the function must be a VALUE. c) The return value is the function must be a VALUE.
The typical way to form a VALUE to return is by declaring The typical way to form a VALUE to return is by declaring
@@ -239,6 +249,8 @@ Step 5: Write your custom function
#include "../value.h" #include "../value.h"
#include "custom.h" #include "custom.h"
#include "../have_unused.h"
Typically these will be included just below any system Typically these will be included just below any system
includes and just below the #if defined(CUSTOM) line. includes and just below the #if defined(CUSTOM) line.
@@ -362,7 +374,7 @@ Step 6: Register the function in the custom interface table
To allow the custom() builtin to transfer control to your function, To allow the custom() builtin to transfer control to your function,
you need to add an entry into the CONST struct custom cust table you need to add an entry into the CONST struct custom cust table
found in custtbl.c: found in custom/custtbl.c:
/* /*
* custom interface table * custom interface table
@@ -482,10 +494,10 @@ Step 6: Register the function in the custom interface table
extern VALUE u_curds(char*, int, VALUE**); extern VALUE u_curds(char*, int, VALUE**);
Step 7: Add the required information to the Makefile Step 7: Add the required information to the custom/Makefile
The calc test script, curds.cal, should be added to the The calc test script, curds.cal, should be added to the
CUSTOM_CALC_FILES Makefile variable: CUSTOM_CALC_FILES Makefile variable found in custom/Makefile:
CUSTOM_CALC_FILES= argv.cal halflen.cal curds.cal CUSTOM_CALC_FILES= argv.cal halflen.cal curds.cal
@@ -619,7 +631,7 @@ Step 12: Contribute
and consider submitting your custom function for possible and consider submitting your custom function for possible
inclusion in later versions of calc. inclusion in later versions of calc.
## Copyright (C) 1999 Landon Curt Noll ## Copyright (C) 1999-2004 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -635,8 +647,8 @@ Step 12: Contribute
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.5 $
## @(#) $Id: HOW_TO_ADD,v 29.2 2000/06/07 14:03:03 chongo Exp $ ## @(#) $Id: HOW_TO_ADD,v 29.5 2005/10/18 11:18:34 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/HOW_TO_ADD,v $ ## @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/HOW_TO_ADD,v $
## ##
## Under source code control: 1997/03/10 03:03:21 ## Under source code control: 1997/03/10 03:03:21

View File

@@ -2,7 +2,7 @@
# #
# custom - makefile for calc custom routines # custom - makefile for calc custom routines
# #
# Copyright (C) 1999 Landon Curt Noll # Copyright (C) 1999,2004 Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.21 $ # @(#) $Revision: 29.24 $
# @(#) $Id: Makefile,v 29.21 2004/02/23 09:23:08 chongo Exp $ # @(#) $Id: Makefile,v 29.24 2004/07/29 08:38:18 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/Makefile,v $
# #
# Under source code control: 1997/03/09 02:28:54 # Under source code control: 1997/03/09 02:28:54
@@ -40,13 +40,13 @@
# #
# Put your custom calc resource files here. # Put your custom calc resource files here.
# #
CUSTOM_CALC_FILES= argv.cal halflen.cal pzasusb8.cal CUSTOM_CALC_FILES= argv.cal halflen.cal pzasusb8.cal pmodm127.cal
# The custom help files to install # The custom help files to install
# #
# Put your custom help files here. # Put your custom help files here.
# #
CUSTOM_HELP= argv devnull help sysinfo pzasusb8 CUSTOM_HELP= argv devnull help sysinfo pzasusb8 pmodm127
# Any .h files that are needed by programs that use libcustcalc.a # Any .h files that are needed by programs that use libcustcalc.a
# #
@@ -62,7 +62,7 @@ CUSTOM_H_SRC=
# #
# Put your custom .c files here. # Put your custom .c files here.
# #
CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c c_pmodm127.c
# Any .o files that are needed by program that use libcustcalc.a. # Any .o files that are needed by program that use libcustcalc.a.
# Don't put ${REQUIRED_OBJ} files in this list. # Don't put ${REQUIRED_OBJ} files in this list.
@@ -71,7 +71,7 @@ CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c
# #
# Put your custom .o files here. # Put your custom .o files here.
# #
CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o c_pmodm127.o
############################################################################## ##############################################################################
#-=-=-=-=-=-=- Defaults in case you want to build from this dir -=-=-=-=-=-=-# #-=-=-=-=-=-=- Defaults in case you want to build from this dir -=-=-=-=-=-=-#
@@ -831,6 +831,33 @@ c_help.o: ../value.h
c_help.o: ../win32dll.h c_help.o: ../win32dll.h
c_help.o: ../zmath.h c_help.o: ../zmath.h
c_help.o: c_help.c c_help.o: c_help.c
c_pmodm127.o: ../alloc.h
c_pmodm127.o: ../block.h
c_pmodm127.o: ../byteswap.h
c_pmodm127.o: ../calcerr.h
c_pmodm127.o: ../cmath.h
c_pmodm127.o: ../config.h
c_pmodm127.o: ../custom.h
c_pmodm127.o: ../endian_calc.h
c_pmodm127.o: ../hash.h
c_pmodm127.o: ../have_const.h
c_pmodm127.o: ../have_malloc.h
c_pmodm127.o: ../have_memmv.h
c_pmodm127.o: ../have_newstr.h
c_pmodm127.o: ../have_stdlib.h
c_pmodm127.o: ../have_string.h
c_pmodm127.o: ../have_unused.h
c_pmodm127.o: ../longbits.h
c_pmodm127.o: ../md5.h
c_pmodm127.o: ../nametype.h
c_pmodm127.o: ../qmath.h
c_pmodm127.o: ../shs.h
c_pmodm127.o: ../shs1.h
c_pmodm127.o: ../string.h
c_pmodm127.o: ../value.h
c_pmodm127.o: ../win32dll.h
c_pmodm127.o: ../zmath.h
c_pmodm127.o: c_pmodm127.c
c_pzasusb8.o: ../alloc.h c_pzasusb8.o: ../alloc.h
c_pzasusb8.o: ../block.h c_pzasusb8.o: ../block.h
c_pzasusb8.o: ../byteswap.h c_pzasusb8.o: ../byteswap.h
@@ -879,7 +906,6 @@ c_sysinfo.o: ../have_string.h
c_sysinfo.o: ../have_unused.h c_sysinfo.o: ../have_unused.h
c_sysinfo.o: ../hist.h c_sysinfo.o: ../hist.h
c_sysinfo.o: ../longbits.h c_sysinfo.o: ../longbits.h
c_sysinfo.o: ../longlong.h
c_sysinfo.o: ../md5.h c_sysinfo.o: ../md5.h
c_sysinfo.o: ../nametype.h c_sysinfo.o: ../nametype.h
c_sysinfo.o: ../prime.h c_sysinfo.o: ../prime.h

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: argv.cal,v 29.2 2000/06/07 14:03:03 chongo Exp $ * @(#) $Id: argv.cal,v 29.3 2004/03/31 05:03:02 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/argv.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/argv.cal,v $
* *
* Under source code control: 1997/03/10 00:27:17 * Under source code control: 1997/03/10 00:27:17
@@ -34,9 +34,14 @@
* NOTE: You must use a calc that was compiled with ALLOW_CUSTOM= -DCUSTOM * NOTE: You must use a calc that was compiled with ALLOW_CUSTOM= -DCUSTOM
* and run with a -C arg. * and run with a -C arg.
*/ */
if (config("compile_custom") == 0) {
quit "calc compiled without -DCUSTOM";
} else if (config("allow_custom") == 0) {
quit "calc was run without the -D command line option";
}
define argv() define argv_test()
{ {
local i; /* arg number */ local i; /* arg number */
local junk; /* throw away value */ local junk; /* throw away value */
@@ -54,7 +59,3 @@ define argv()
} }
return i-1; return i-1;
} }
if (config("resource_debug") >= 0) {
print "argv(var, ...) defined";
}

View File

@@ -1,7 +1,7 @@
/* /*
* c_argv - a custom function display info about its args * c_argv - a custom function display info about its args
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999-2006 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.7 $
* @(#) $Id: c_argv.c,v 29.3 2004/02/23 09:19:18 chongo Exp $ * @(#) $Id: c_argv.c,v 29.7 2006/05/22 19:04:45 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_argv.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_argv.c,v $
* *
* Under source code control: 1997/03/09 20:27:37 * Under source code control: 1997/03/09 20:27:37
@@ -152,10 +152,10 @@ c_argv(char UNUSED *name, int count, VALUE **vals)
/* getsize error */ /* getsize error */
printf("\tsize=unknown"); printf("\tsize=unknown");
} }
printf("\tsizeof=%ld\n", lsizeof(vals[i])); printf("\tsizeof=%ld\n", (long int)lsizeof(vals[i]));
} else { } else {
printf("\tsize=%ld\tsizeof=%ld\n", printf("\tsize=%ld\tsizeof=%ld\n",
elm_count(vals[i]), lsizeof(vals[i])); elm_count(vals[i]), (long int)lsizeof(vals[i]));
} }
} }

View File

@@ -1,7 +1,7 @@
/* /*
* c_devnull - a custom function that does nothing * c_devnull - a custom function that does nothing
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999-2004 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.4 $
* @(#) $Id: c_devnull.c,v 29.3 2004/02/23 09:19:18 chongo Exp $ * @(#) $Id: c_devnull.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_devnull.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_devnull.c,v $
* *
* Under source code control: 1997/03/09 17:49:12 * Under source code control: 1997/03/09 17:49:12

View File

@@ -1,7 +1,7 @@
/* /*
* c_help - custom help function * c_help - custom help function
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999-2004 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.4 $
* @(#) $Id: c_help.c,v 29.3 2004/02/23 09:19:18 chongo Exp $ * @(#) $Id: c_help.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_help.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_help.c,v $
* *
* Under source code control: 1997/03/09 05:25:41 * Under source code control: 1997/03/09 05:25:41

272
custom/c_pmodm127.c Normal file
View File

@@ -0,0 +1,272 @@
/*
* c_pmodm127 - calculate q mod 2^(2^127-1)
*
* Copyright (C) 2004 Landon Curt Noll
*
* Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* @(#) $Revision: 29.3 $
* @(#) $Id: c_pmodm127.c,v 29.3 2004/07/29 09:48:31 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_pmodm127.c,v $
*
* Under source code control: 2004/07/28 22:12:25
* File existed as early as: 2004
*
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
#if defined(CUSTOM)
#include <stdio.h>
#include "../have_const.h"
#include "../value.h"
#include "../custom.h"
#include "../zmath.h"
#include "../have_unused.h"
/* 2^255 */
static HALF h255[] = {
#if BASEB == 32
(HALF)0x00000000, (HALF)0x00000000, (HALF)0x00000000, (HALF)0x00000000,
(HALF)0x00000000, (HALF)0x00000000, (HALF)0x00000000, (HALF)0x80000000
#else /* BASEB == 32 */
(HALF)0x0000, (HALF)0x0000, (HALF)0x0000, (HALF)0x0000,
(HALF)0x0000, (HALF)0x0000, (HALF)0x0000, (HALF)0x0000,
(HALF)0x0000, (HALF)0x0000, (HALF)0x0000, (HALF)0x0000,
(HALF)0x0000, (HALF)0x0000, (HALF)0x0000, (HALF)0x8000
#endif /* BASEB == 32 */
};
ZVALUE p255 = {
h255, 8, 0
};
/* static declarations */
static void zmod5_or_zmod(ZVALUE *zp);
static BOOL havelastmod = FALSE;
static ZVALUE lastmod[1];
static ZVALUE lastmodinv[1];
/*
* c_pmodm127 - calculate q mod 2^(2^127-1)
*
* given:
* count = 1;
* vals[0] real number; (q - potential factor)
*
* returns:
* result real number; (q mod 2^(2^127-1))
*/
/*ARGSUSED*/
VALUE
c_pmodm127(char UNUSED *name, int UNUSED count, VALUE **vals)
{
VALUE result; /* what we will return */
ZVALUE q; /* test factor */
ZVALUE temp; /* temp calculation value */
int i; /* exponent value */
/*
* arg check
*/
result.v_type = V_NULL;
if (vals[0]->v_type != V_NUM) {
math_error("Non-numeric argument for pmodm127");
/*NOTREACHED*/
}
if (qisfrac(vals[0]->v_num)) {
math_error("Non-integer argument for pmodm127");
/*NOTREACHED*/
}
if (qisneg(vals[0]->v_num) || qiszero(vals[0]->v_num)) {
math_error("argument for pmodm127 <= 0");
/*NOTREACHED*/
}
/*
* look at the numerator
*/
q = vals[0]->v_num->num;
/*
* setup lastmod with q
*/
if (havelastmod && zcmp(q, *lastmod)) {
zfree(*lastmod);
zfree(*lastmodinv);
havelastmod = FALSE;
}
if (!havelastmod) {
zcopy(q, lastmod);
zbitvalue(2 * q.len * BASEB, &temp);
zquo(temp, q, lastmodinv, 0);
zfree(temp);
havelastmod = TRUE;
}
/*
* start with 2^255
*/
result.v_num = qalloc();
zcopy(p255, &result.v_num->num);
result.v_type = V_NUM;
/*
* compute 2^(2^127-1) mod q by modular exponentation
*
* We implement the following calc code in C:
*
* (* given q, our test factor, as the arg to this function *)
* result = 2^255;
* for (i=8; i < 127; ++i) {
* result %= q; (* mod *)
* result *= result; (* square *)
* result <<= 1; (* times 2 *)
* }
* result %= q; (* result is now 2^(2^127-1) % q *)
*/
for (i=8; i<127; ++i) {
#if 0
/* use of zmod is a bit slower than zmod5_or_zmod */
(void) zmod(result.v_num->num, *lastmod, &temp, 0);
zfree(result.v_num->num);
result.v_num->num = temp;
#else
zmod5_or_zmod(&result.v_num->num); /* mod */
#endif
#if 0
/* use of zmul is slightly slower than zsquare */
zmul(result.v_num->num, result.v_num->num, &temp); /* square */
#else
zsquare(result.v_num->num, &temp); /* square */
#endif
/* XXX - we could manually shift to speed up a tiny bit */
zfree(result.v_num->num);
zshift(temp, 1, &result.v_num->num); /* times 2 */
zfree(temp);
}
zmod5_or_zmod(&result.v_num->num); /* result = 2^(2^127-1) % q */
/*
* cleanup and return result
*/
return result;
}
/*
* zmod5_or_zmod - fast integer modulo the modulus computation
*
* "borrowed" from ../zmod.c
*
* Given the address of a positive integer whose word count does not
* exceed twice that of the modulus stored at lastmod, to evaluate and store
* at that address the value of the integer modulo the modulus.
*
* Unlike the static routine in ../zmod.c, we will call the zmod and return
* the result of the zmod5_or_zmod conditions do not apply to the argument
* and saved mod.
*/
static void
zmod5_or_zmod(ZVALUE *zp)
{
LEN len, modlen, j;
ZVALUE tmp1, tmp2;
ZVALUE z1, z2, z3;
HALF *a, *b;
FULL f;
HALF u;
int subcount = 0;
if (zrel(*zp, *lastmod) < 0)
return;
modlen = lastmod->len;
len = zp->len;
z1.v = zp->v + modlen - 1;
z1.len = len - modlen + 1;
z1.sign = z2.sign = z3.sign = 0;
if (z1.len > modlen + 1) {
/* in ../zmod.c we did a math_error("Bad call to zmod5!!!"); */
/* here we just call the slower zmod and return the result */
(void) zmod(*zp, *lastmod, &tmp1, 0);
/* replace zp with tmp1 mod result */
zfree(*zp);
*zp = tmp1;
return;
}
z2.v = lastmodinv->v + modlen + 1 - z1.len;
z2.len = lastmodinv->len - modlen - 1 + z1.len;
zmul(z1, z2, &tmp1);
z3.v = tmp1.v + z1.len;
z3.len = tmp1.len - z1.len;
if (z3.len > 0) {
zmul(z3, *lastmod, &tmp2);
j = modlen;
a = zp->v;
b = tmp2.v;
u = 0;
len = modlen;
while (j-- > 0) {
f = (FULL) *a - (FULL) *b++ - (FULL) u;
*a++ = (HALF) f;
u = - (HALF) (f >> BASEB);
}
if (z1.len > 1) {
len++;
if (tmp2.len > modlen)
f = (FULL) *a - (FULL) *b - (FULL) u;
else
f = (FULL) *a - (FULL) u;
*a++ = (HALF) f;
}
while (len > 0 && *--a == 0)
len--;
zp->len = len;
zfree(tmp2);
}
zfree(tmp1);
while (len > 0 && zrel(*zp, *lastmod) >= 0) {
subcount++;
if (subcount > 2) {
math_error("Too many subtractions in zmod5_or_zmod");
/*NOTREACHED*/
}
j = modlen;
a = zp->v;
b = lastmod->v;
u = 0;
while (j-- > 0) {
f = (FULL) *a - (FULL) *b++ - (FULL) u;
*a++ = (HALF) f;
u = - (HALF) (f >> BASEB);
}
if (len > modlen) {
f = (FULL) *a - (FULL) u;
*a++ = (HALF) f;
}
while (len > 0 && *--a == 0)
len--;
zp->len = len;
}
if (len == 0)
zp->len = 1;
}
#endif /* CUSTOM */

View File

@@ -1,7 +1,7 @@
/* /*
* c_pzasusb8 - print numereator as a string of USB8s * c_pzasusb8 - print numereator as a string of USB8s
* *
* Copyright (C) 1999 Ernest Bowen * Copyright (C) 1999-2004 Ernest Bowen
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.4 $
* @(#) $Id: c_pzasusb8.c,v 29.3 2004/02/23 09:19:18 chongo Exp $ * @(#) $Id: c_pzasusb8.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_pzasusb8.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_pzasusb8.c,v $
* *
* Under source code control: 1999/10/06 03:12:25 * Under source code control: 1999/10/06 03:12:25

View File

@@ -1,7 +1,7 @@
/* /*
* c_sysinfo - names and values of selected #defines * c_sysinfo - names and values of selected #defines
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999,2004 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.7 $ * @(#) $Revision: 29.11 $
* @(#) $Id: c_sysinfo.c,v 29.7 2004/02/23 09:19:18 chongo Exp $ * @(#) $Id: c_sysinfo.c,v 29.11 2006/05/22 19:04:45 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_sysinfo.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_sysinfo.c,v $
* *
* Under source code control: 1997/03/09 23:14:40 * Under source code control: 1997/03/09 23:14:40
@@ -42,7 +42,6 @@
#include "../calc.h" #include "../calc.h"
#include "../longbits.h" #include "../longbits.h"
#define CHECK_L_FORMAT #define CHECK_L_FORMAT
#include "../longlong.h"
#include "../block.h" #include "../block.h"
#include "../calcerr.h" #include "../calcerr.h"
#include "../conf.h" #include "../conf.h"
@@ -104,7 +103,6 @@ static struct infoname sys_info[] = {
{"INIT_K", "initial 2nd walking a55 table index", NULL, (FULL)INIT_K}, {"INIT_K", "initial 2nd walking a55 table index", NULL, (FULL)INIT_K},
{"INODE_BITS", "inode number size in bits", NULL, (FULL)INODE_BITS}, {"INODE_BITS", "inode number size in bits", NULL, (FULL)INODE_BITS},
{"LITTLE_ENDIAN", "Least Significant Byte first symbol", NULL, (FULL)LITTLE_ENDIAN}, {"LITTLE_ENDIAN", "Least Significant Byte first symbol", NULL, (FULL)LITTLE_ENDIAN},
{"LONGLONG_BITS", "length of a long long, or 0", NULL, (FULL)LONGLONG_BITS},
{"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS}, {"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS},
{"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT}, {"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT},
{"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL, (FULL)MAX_CALCRC}, {"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL, (FULL)MAX_CALCRC},
@@ -193,6 +191,7 @@ c_sysinfo(char UNUSED *name, int count, VALUE **vals)
* we will return NULL if a value was not found * we will return NULL if a value was not found
*/ */
result.v_type = V_NULL; result.v_type = V_NULL;
result.v_subtype = V_NOSUBTYPE;
/* /*
* case 0: if no args, then dump the table with no values * case 0: if no args, then dump the table with no values
@@ -317,30 +316,16 @@ dump_name_value(void)
/* dump the entire table */ /* dump the entire table */
for (p = sys_info; p->name != NULL; ++p) { for (p = sys_info; p->name != NULL; ++p) {
if (p->str == NULL) { if (p->str == NULL) {
#if LONG_BITS == FULL_BITS || FULL_BITS == 32 || !defined(HAVE_LONGLONG) #if LONG_BITS == FULL_BITS || FULL_BITS == 32
printf("%s%-23s\t%-8lu\t(0x%lx)\n", printf("%s%-23s\t%-8lu\t(0x%lx)\n",
(conf->tab_ok ? "\t" : ""), p->name, (conf->tab_ok ? "\t" : ""), p->name,
(unsigned long)p->nmbr, (unsigned long)p->nmbr,
(unsigned long)p->nmbr); (unsigned long)p->nmbr);
#else #else
/*
* Determine of %ld can print a 64 bit long long.
*
* Some systems that can make use of %ld to print a
* a 64 bit value do not support the %lld type.
* So we will only try %lld if %ld does not work.
*/
# if defined(L64_FORMAT)
printf("%s%-23s\t%-8lu\t(0x%lx)\n",
(conf->tab_ok ? "\t" : ""), p->name,
(unsigned long long)p->nmbr,
(unsigned long long)p->nmbr);
# else /* L64_FORMAT */
printf("%s%-23s\t%-8llu\t(0x%llx)\n", printf("%s%-23s\t%-8llu\t(0x%llx)\n",
(conf->tab_ok ? "\t" : ""), p->name, (conf->tab_ok ? "\t" : ""), p->name,
(unsigned long long)p->nmbr, (unsigned long long)p->nmbr,
(unsigned long long)p->nmbr); (unsigned long long)p->nmbr);
# endif /* L64_FORMAT */
#endif #endif
} else { } else {
printf("%s%-23s\t\"%s\"\n", printf("%s%-23s\t\"%s\"\n",
@@ -362,25 +347,16 @@ dump_mening_value(void)
/* dump the entire table */ /* dump the entire table */
for (p = sys_info; p->name != NULL; ++p) { for (p = sys_info; p->name != NULL; ++p) {
if (p->str == NULL) { if (p->str == NULL) {
#if LONG_BITS == FULL_BITS || FULL_BITS == 32 || !defined(HAVE_LONGLONG) #if LONG_BITS == FULL_BITS || FULL_BITS == 32
printf("%s%-36.36s\t%-8lu\t(0x%lx)\n", printf("%s%-36.36s\t%-8lu\t(0x%lx)\n",
(conf->tab_ok ? "\t" : ""), p->meaning, (conf->tab_ok ? "\t" : ""), p->meaning,
(unsigned long)p->nmbr, (unsigned long)p->nmbr,
(unsigned long)p->nmbr); (unsigned long)p->nmbr);
#else #else
# if defined(L64_FORMAT)
/* %ld prints all 64 bits, use %ld */
printf("%s%-36.36s\t%-8lu\t(0x%lx)\n",
(conf->tab_ok ? "\t" : ""), p->meaning,
(unsigned long long)p->nmbr,
(unsigned long long)p->nmbr);
# else /* L64_FORMAT */
/* %ld prints lower 32 bits only, use %lld */
printf("%s%-36.36s\t%-8llu\t(0x%llx)\n", printf("%s%-36.36s\t%-8llu\t(0x%llx)\n",
(conf->tab_ok ? "\t" : ""), p->meaning, (conf->tab_ok ? "\t" : ""), p->meaning,
(unsigned long long)p->nmbr, (unsigned long long)p->nmbr,
(unsigned long long)p->nmbr); (unsigned long long)p->nmbr);
# endif /* L64_FORMAT */
#endif #endif
} else { } else {
printf("%s%-36.36s\t\"%s\"\n", printf("%s%-36.36s\t\"%s\"\n",

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: custtbl.c,v 29.2 2000/06/07 14:03:03 chongo Exp $ * @(#) $Id: custtbl.c,v 29.4 2005/02/05 06:16:19 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/custtbl.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/custtbl.c,v $
* *
* Under source code control: 1997/03/09 02:28:54 * Under source code control: 1997/03/09 02:28:54
@@ -56,6 +56,7 @@ extern VALUE c_devnull(char*, int, VALUE**);
extern VALUE c_help(char*, int, VALUE**); extern VALUE c_help(char*, int, VALUE**);
extern VALUE c_sysinfo(char*, int, VALUE**); extern VALUE c_sysinfo(char*, int, VALUE**);
extern VALUE c_pzasusb8(char*, int, VALUE**); extern VALUE c_pzasusb8(char*, int, VALUE**);
extern VALUE c_pmodm127(char*, int, VALUE**);
#endif /* CUSTOM */ #endif /* CUSTOM */
@@ -105,9 +106,12 @@ CONST struct custom cust[] = {
{ "sysinfo", "return a calc #define value", { "sysinfo", "return a calc #define value",
0, 1, c_sysinfo }, 0, 1, c_sysinfo },
{ "pzasusb8", "print ZCALUE as USB8", { "pzasusb8", "print ZVALUE as USB8",
0, 1, c_pzasusb8 }, 0, 1, c_pzasusb8 },
{ "pmodm127", "calculate q mod 2^(2^127-1)",
1, 1, c_pmodm127 },
#endif /* CUSTOM */ #endif /* CUSTOM */

View File

@@ -1,7 +1,7 @@
/* /*
* halflen - determine the length of numeric value in HALFs * halflen - determine the length of numeric value in HALFs
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999,2004 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: halflen.cal,v 29.2 2000/06/07 14:03:03 chongo Exp $ * @(#) $Id: halflen.cal,v 29.3 2004/03/31 05:03:02 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/halflen.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/halflen.cal,v $
* *
* Under source code control: 1997/03/08 20:51:32 * Under source code control: 1997/03/08 20:51:32
@@ -34,11 +34,16 @@
* NOTE: You must use a calc that was compiled with ALLOW_CUSTOM= -DCUSTOM * NOTE: You must use a calc that was compiled with ALLOW_CUSTOM= -DCUSTOM
* and run with a -C arg. * and run with a -C arg.
*/ */
if (config("compile_custom") == 0) {
quit "calc compiled without -DCUSTOM";
} else if (config("allow_custom") == 0) {
quit "calc was run without the -D command line option";
}
define halflen(num) define halflen(num)
{ {
local baseb = custom("sysinfo","BASEB"); /* bit len of a HALF */ local baseb; /* bit len of a HALF */
/* /*
* firewall * firewall
@@ -47,6 +52,11 @@ define halflen(num)
return newerror("halflen only works on numeric values"); return newerror("halflen only works on numeric values");
} }
/*
* determine baseb
*/
baseb = custom("sysinfo","BASEB");
/* /*
* determine the HALF length of a numeric value * determine the HALF length of a numeric value
*/ */
@@ -63,7 +73,3 @@ define halflen(num)
return newerror("halflen only works on numeric values"); return newerror("halflen only works on numeric values");
} }
} }
if (config("resource_debug") >= 0) {
print "halflen(num) defined";
}

78
custom/pmodm127 Normal file
View File

@@ -0,0 +1,78 @@
NAME
pmodm127 - calculate q mod 2^(2^127-1)
SYNOPSIS
custom("pmodm127", q)
TYPES
q int > 0
return int
DESCRIPTION
This custom function will return the value:
q mod 2^(2^127-1)
This custom function serves as a demonstration of how to write
a custom function. It performs the equivalent of:
pmod(2, 2^127-1, q)
The return value is integer in the half open range: [0, q).
SPECIAL NOTE:
Can you find a value, q, for which this custom function returns 1?
If you do, send the value of q to chongo using the EMail address
found at:
http://www.isthe.com/chongo/address.html
EXAMPLE
> custom("pmodm127", 65537)
32769
> custom("pmodm127", 2^31-1)
8
> custom("pmodm127", 7^51+2)
11228202966269457258557496419097462731193173
LIMITS
calc must be built with ALLOW_CUSTOM= -DCUSTOM
calc must be executed with a -C arg.
q must be an integer > 0
LIBRARY
none
SEE ALSO
custom
## Copyright (C) 2004 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 29.2 $
## @(#) $Id: pmodm127,v 29.2 2004/07/29 09:28:58 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/pmodm127,v $
##
## Under source code control: 2004/02/25 07:13:15
## File existed as early as: 2004
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

137
custom/pmodm127.cal Normal file
View File

@@ -0,0 +1,137 @@
/*
* pmodm127 - test pmodm127's ability to calculate q mod 2^(2^127-1)
*
* Copyright (C) 2004 Landon Curt Noll
*
* Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* @(#) $Revision: 29.2 $
* @(#) $Id: pmodm127.cal,v 29.2 2004/07/29 08:35:36 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/pmodm127.cal,v $
*
* Under source code control: 2004/02/25 14:25:32
* File existed as early as: 2004
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* This file is part of the custom sample calc files.
*
* NOTE: You must use a calc that was compiled with ALLOW_CUSTOM= -DCUSTOM
* and run with a -C arg.
*/
if (config("compile_custom") == 0) {
quit "calc compiled without -DCUSTOM";
} else if (config("allow_custom") == 0) {
quit "calc was run without the -D command line option";
}
define pmodm127_test1(testcnt)
{
local q; /* test factor */
local m127; /* 2^127-1 */
local i;
/*
* firewall
*/
if (!isint(testcnt) || testcnt <= 0) {
return newerror("pmodm127_test1 must have an integer count>0");
}
/*
* perform testcnt divisor tests for primes of form 2*k*(2^127-1)+1
*
* NOTE: Since this is just a test, we do not need to be optimal.
*/
m127 = 2^127 - 1;
q = 2*4949132165849*m127+1;
for (i=0; i < testcnt; ++i) {
/*
* determine next prime divisor
*/
q = nextcand(q, -1, 0, 1, 2*m127);
/* compare custom function with its pmod() equivalent */
if (config("resource_debug") & 8) {
print "testing", q;
}
if (pmod(2, m127, q) != custom("pmodm127", q)) {
print "ERROR: pmodm127 failed for ", str(q);
return newerror("pmodm127 failed for " + str(q));
}
}
/* return success count */
if (config("resource_debug") & 8) {
print "passed", testcnt, "tests";
}
return testcnt;
}
define pmodm127_test2(testcnt, seed)
{
local q; /* test factor */
local m127; /* 2^127-1 */
local i;
/*
* firewall
*/
if (!isint(testcnt) || testcnt <= 0) {
return newerror("pmodm127_test2 must have an integer count>0");
}
if (!isint(seed)) {
return newerror("pmodm127_test2 must an integer seed");
}
/*
* perform testcnt divisor tests random integers over [1e51, 1e52)
*
* NOTE: Since this is just a test, we do not need to be optimal.
*/
m127 = 2^127 - 1;
for (i=0; i < testcnt; ++i) {
/*
* determine next prime divisor
*/
q = rand(1e51, 1e52) | 0x1;
if (config("resource_debug") & 8) {
print "testing", q;
}
/* compare custom function with its pmod() equivalent */
if (pmod(2, m127, q) != custom("pmodm127", q)) {
print "ERROR: pmodm127 failed for ", str(q);
print "ERROR: ", pmod(2,m127,q), " != ", custom("pmodm127", q);
return newerror("pmodm127 failed for " + str(q));
}
}
/* return success count */
if (config("resource_debug") & 8) {
print "passed", testcnt, "tests";
}
return testcnt;
}
if ((config("resource_debug") & 3) && !(config("resource_debug") & 8)) {
print "DEBUG: use config('resource_debug',", config("resource_debug")|8:") to enable more debugging";
}

View File

@@ -19,7 +19,7 @@ DESCRIPTION
custom("sysinfo", "BASEB") custom("sysinfo", "BASEB")
custom("sysinfo", "CALC_BYTE_ORDER") custom("sysinfo", "CALC_BYTE_ORDER")
foe details. for details.
This custom function is intented for testing of the general This custom function is intented for testing of the general
custom interface. custom interface.
@@ -65,8 +65,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: pzasusb8,v 29.2 2000/06/07 14:03:03 chongo Exp $ ## @(#) $Id: pzasusb8,v 29.3 2005/10/18 11:18:34 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/pzasusb8,v $ ## @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/pzasusb8,v $
## ##
## Under source code control: 1999/10/06 04:05:43 ## Under source code control: 1999/10/06 04:05:43

View File

@@ -1,7 +1,7 @@
/* /*
* pzasusb8 - print numereator as a string of USB8s * pzasusb8 - print numereator as a string of USB8s
* *
* Copyright (C) 1999 Ernest Bowen and Landon Curt Noll * Copyright (C) 1999,2004 Ernest Bowen and Landon Curt Noll
* *
* Primary author: Ernest Bowen * Primary author: Ernest Bowen
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: pzasusb8.cal,v 29.2 2000/06/07 14:03:03 chongo Exp $ * @(#) $Id: pzasusb8.cal,v 29.3 2004/03/31 05:03:02 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/pzasusb8.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/pzasusb8.cal,v $
* *
* Under source code control: 1999/10/06 03:11:12 * Under source code control: 1999/10/06 03:11:12
@@ -31,6 +31,15 @@
*/ */
/*
* firewall
*/
if (config("compile_custom") == 0) {
quit "calc compiled without -DCUSTOM";
} else if (config("allow_custom") == 0) {
quit "calc was run without the -D command line option";
}
print "p(n) prints array in which numerator of n is stored as a"; print "p(n) prints array in which numerator of n is stored as a";
print "sequence of 2-hex-digits representing unsigned characters."; print "sequence of 2-hex-digits representing unsigned characters.";
print "h(n) printx n in hex notation. This should be the same as"; print "h(n) printx n in hex notation. This should be the same as";
@@ -52,6 +61,5 @@ print "CALC_BYTE_ORDER: ", custom("sysinfo", "CALC_BYTE_ORDER");
print "BIG_ENDIAN: ", custom("sysinfo", "BIG_ENDIAN"); print "BIG_ENDIAN: ", custom("sysinfo", "BIG_ENDIAN");
print "LITTLE_ENDIAN: ", custom("sysinfo", "LITTLE_ENDIAN"); print "LITTLE_ENDIAN: ", custom("sysinfo", "LITTLE_ENDIAN");
print "LONG_BITS: ", custom("sysinfo", "LONG_BITS"); print "LONG_BITS: ", custom("sysinfo", "LONG_BITS");
print "LONGLONG_BITS: ", custom("sysinfo", "LONGLONG_BITS");
print "Calc sizes:"; print "Calc sizes:";
show sizes; show sizes;

691
file.c
View File

@@ -1,7 +1,7 @@
/* /*
* file - file I/O routines callable by users * file - file I/O routines callable by users
* *
* Copyright (C) 1999 David I. Bell and Landon Curt Noll * Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.8 $ * @(#) $Revision: 29.15 $
* @(#) $Id: file.c,v 29.8 2004/02/23 07:53:12 chongo Exp $ * @(#) $Id: file.c,v 29.15 2006/05/22 19:04:45 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/file.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/file.c,v $
* *
* Under source code control: 1991/07/20 00:21:56 * Under source code control: 1991/07/20 00:21:56
@@ -68,11 +68,11 @@ extern FILE *f_open(char *name, char *mode);
*/ */
static FILEIO files[MAXFILES] = { static FILEIO files[MAXFILES] = {
{FILEID_STDIN, NULL, (dev_t)0, (ino_t)0, {FILEID_STDIN, NULL, (dev_t)0, (ino_t)0,
"(stdin)", TRUE, FALSE, 'r', "r"}, "(stdin)", TRUE, FALSE, FALSE, FALSE, 'r', "r"},
{FILEID_STDOUT, NULL, (dev_t)0, (ino_t)0, {FILEID_STDOUT, NULL, (dev_t)0, (ino_t)0,
"(stdout)", FALSE, TRUE, 'w', "w"}, "(stdout)", FALSE, TRUE, FALSE, FALSE, 'w', "w"},
{FILEID_STDERR, NULL, (dev_t)0, (ino_t)0, {FILEID_STDERR, NULL, (dev_t)0, (ino_t)0,
"(stderr)", FALSE, TRUE, 'w', "w"} "(stderr)", FALSE, TRUE, FALSE, FALSE, 'w', "w"}
}; };
@@ -188,14 +188,141 @@ file_init(void)
/* /*
* Open the specified file name for reading or writing; mode is assumed * init_fileio - initialize a FILEIO structure
* to be one of "r", "w", "a", "r+", "w+", "a+". *
* Returns a file id which can be used to do I/O to the file, or else * This function initializes a calc FILEIO structure. It will optionally
* FILEID_NONE if the open failed. * malloc the filename string if given an non-NULL associated filename.
* It will canonicalize the file open mode string.
*
* given:
* fiop pointer to FILEIO structure to initialize
* name associated filename (NULL => caller will setup filename)
* mode open mode (one of {r,w,a}{,b}{,+})
* sbufp pointer to stat of open file
* id calc file ID
* fp open file stream
*/
static void
init_fileio(FILEIO *fiop, char *name, char *mode,
struct stat *sbufp, FILEID id, FILE *fp)
{
char modestr[sizeof(fiop->mode)]; /* mode [rwa]b?\+? */
size_t namelen; /* length of name */
/* allocate filename if requested */
if (name != NULL) {
namelen = strlen(name);
fiop->name = (char *)malloc(namelen + 1);
if (fiop->name == NULL) {
math_error("No memory for filename");
/*NOTREACHED*/
}
}
/* initialize FILEIO structure */
if (name != NULL) {
strncpy(fiop->name, name, namelen+1);
}
fiop->id = id;
fiop->fp = fp;
fiop->dev = sbufp->st_dev;
fiop->inode = sbufp->st_ino;
fiop->reading = FALSE;
fiop->writing = FALSE;
fiop->appending = FALSE;
fiop->binary = FALSE;
fiop->action = 0;
fiop->mode[0] = '\0';
/*
* determine file open mode
*
* While a leading 'r' is for reading and a leading 'w' is
* for writing, the presense of a '+' in the string means
* both reading and writing. A leading 'a' means append
* which is writing.
*/
/* canonicalize read modes */
if (mode[0] == 'r') {
/* note read mode */
strcpy(modestr, "r");
fiop->reading = TRUE;
/* note binary mode even though mode is not used / ignored */
if (strchr(mode, 'b') != NULL) {
strcat(modestr, "b");
}
/* note if reading and writing */
if (strchr(mode, '+') != NULL) {
fiop->writing = TRUE;
strcat(modestr, "+");
}
/* canonicalize write modes */
} else if (mode[0] == 'w') {
/* note write mode */
strcpy(modestr, "w");
fiop->writing = TRUE;
/* note binary mode even though mode is not used / ignored */
if (strchr(mode, 'b') != NULL) {
strcat(modestr, "b");
}
/* note if reading and writing */
if (strchr(mode, '+') != NULL) {
fiop->reading = TRUE;
strcat(modestr, "+");
}
/* canonicalize append modes */
} else if (mode[0] == 'a') {
/* note append mode */
strcpy(modestr, "a");
fiop->writing = TRUE;
fiop->appending = TRUE;
/* note binary mode even though mode is not used / ignored */
if (strchr(mode, 'b') != NULL) {
strcat(modestr, "b");
}
/* note if reading and writing */
if (strchr(mode, '+') != NULL) {
fiop->reading = TRUE;
strcat(modestr, "+");
}
/* canonicalize no I/O modes */
} else {
modestr[0] = '\0';
}
modestr[sizeof(modestr)-1] = '\0'; /* firewall */
/* record canonical open mode string */
strncpy(fiop->mode, modestr, sizeof(fiop->mode));
}
/*
* openid - open the specified file name for reading or writing
* *
* given: * given:
* name file name * name file name
* mode open mode * mode open mode (one of {r,w,a}{,b}{,+})
*
* returns:
* >=3 FILEID which can be used to do I/O to the file
* <0 if the open failed
*
* NOTE: This function will not return 0, 1 or 2 since they are
* reserved for stdin, stdout, stderr. In fact, it must not
* return 0, 1, or 2 because it will confuse those who call
* the opensearchfiile() function
*/ */
FILEID FILEID
openid(char *name, char *mode) openid(char *name, char *mode)
@@ -206,9 +333,9 @@ openid(char *name, char *mode)
struct stat sbuf; /* file status */ struct stat sbuf; /* file status */
int i; int i;
/* find the next open slot in the files array */
if (idnum >= MAXFILES) if (idnum >= MAXFILES)
return -E_FOPEN3; return -E_MANYOPEN;
fiop = &files[3]; fiop = &files[3];
for (i = 3; i < MAXFILES; fiop++,i++) { for (i = 3; i < MAXFILES; fiop++,i++) {
if (fiop->name == NULL) if (fiop->name == NULL)
@@ -217,8 +344,8 @@ openid(char *name, char *mode)
if (i == MAXFILES) if (i == MAXFILES)
math_error("This should not happen in openid()!!!"); math_error("This should not happen in openid()!!!");
/* open the file */
fp = f_open(name, mode); fp = f_open(name, mode);
if (fp == NULL) { if (fp == NULL) {
return FILEID_NONE; return FILEID_NONE;
} }
@@ -227,50 +354,88 @@ openid(char *name, char *mode)
/*NOTREACHED*/ /*NOTREACHED*/
} }
fiop->name = (char *)malloc(strlen(name) + 1); /* get a new FILEID */
if (fiop->name == NULL) {
math_error("No memory for filename");
/*NOTREACHED*/
}
id = ++lastid; id = ++lastid;
ioindex[idnum++] = i; ioindex[idnum++] = i;
strcpy(fiop->name, name); /* initialize FILEIO structure */
fiop->id = id; init_fileio(fiop, name, mode, &sbuf, id, fp);
fiop->fp = fp;
fiop->dev = sbuf.st_dev;
fiop->inode = sbuf.st_ino;
fiop->reading = TRUE;
fiop->writing = TRUE;
fiop->action = 0;
/* /* return calc open file ID */
* determine file open mode return id;
* }
* While a leading 'r' is for reading and a leading 'w' is
* for writing, the presense of a '+' in the string means
* both reading and writing. A leading 'a' means append /*
* which is writing. * openpathid - open the specified abse filename, or relative filename along a search path
*/ *
if (mode[0] == 'r') { * given:
fiop->reading = TRUE; * name file name
if (strchr(mode, '+') == NULL) { * mode open mode (one of {r,w,a}{,b}{,+})
fiop->writing = FALSE; * pathlist list of colon separated paths (or NULL)
} else { *
fiop->writing = TRUE; * returns:
} * >=3 FILEID which can be used to do I/O to the file
} else if (mode[0] == 'w' || mode[0] == 'a') { * <0 if the open failed
fiop->writing = TRUE; *
if (strchr(mode, '+') == NULL) { * NOTE: This function will not return 0, 1 or 2 since they are
fiop->reading = FALSE; * reserved for stdin, stdout, stderr. In fact, it must not
} else { * return 0, 1, or 2 because it will confuse those who call
fiop->reading = TRUE; * the opensearchfiile() function
} */
} else { FILEID
fiop->reading = FALSE; openpathid(char *name, char *mode, char *pathlist)
fiop->writing = FALSE; {
FILEIO *fiop; /* file structure */
FILEID id; /* new file id */
FILE *fp;
struct stat sbuf; /* file status */
char *openpath; /* malloc copy of path that was opened */
int i;
/* find the next open slot in the files array */
if (idnum >= MAXFILES)
return -E_MANYOPEN;
fiop = &files[3];
for (i = 3; i < MAXFILES; fiop++,i++) {
if (fiop->name == NULL)
break;
} }
strcpy(fiop->mode, mode); if (i == MAXFILES)
math_error("This should not happen in openpathid()!!!");
/* open a file - searching along a path */
openpath = NULL;
fp = f_pathopen(name, mode, pathlist, &openpath);
if (fp == NULL) {
if (openpath != NULL) {
/* should not happen, but just in case */
free(openpath);
}
return FILEID_NONE;
}
if (fstat(fileno(fp), &sbuf) < 0) {
if (openpath != NULL) {
free(openpath);
}
math_error("bad fstat");
/*NOTREACHED*/
}
if (openpath == NULL) {
fclose(fp);
math_error("bad openpath");
/*NOTREACHED*/
}
/* get a new FILEID */
id = ++lastid;
ioindex[idnum++] = i;
/* initialize FILEIO structure */
init_fileio(fiop, NULL, mode, &sbuf, id, fp);
fiop->name = openpath; /* already malloced by f_pathopen */
/* return calc open file ID */
return id; return id;
} }
@@ -279,16 +444,20 @@ openid(char *name, char *mode)
* reopenid - reopen a FILEID * reopenid - reopen a FILEID
* *
* given: * given:
* id FILEID to reopen * id FILEID to reopen
* mode new mode to open as * mode new mode to open as
* name name of new file * mode new mode to open as (one of "r", "w", "a", "r+", "w+", "a+")
* name name of new file
*
* returns:
* FILEID which can be used to do I/O to the file
* <0 if the open failed
*/ */
FILEID FILEID
reopenid(FILEID id, char *mode, char *name) reopenid(FILEID id, char *mode, char *name)
{ {
FILEIO *fiop; /* file structure */ FILEIO *fiop; /* file structure */
FILE *fp; FILE *fp;
char *newname;
struct stat sbuf; struct stat sbuf;
int i; int i;
@@ -299,8 +468,8 @@ reopenid(FILEID id, char *mode, char *name)
/*NOTREACHED*/ /*NOTREACHED*/
} }
/* reopen the file */
fiop = NULL; fiop = NULL;
for (i = 3; i < idnum; i++) { for (i = 3; i < idnum; i++) {
fiop = &files[ioindex[i]]; fiop = &files[ioindex[i]];
if (fiop->id == id) if (fiop->id == id)
@@ -344,57 +513,23 @@ reopenid(FILEID id, char *mode, char *name)
return FILEID_NONE; return FILEID_NONE;
} }
} }
if (fstat(fileno(fp), &sbuf) < 0) { if (fstat(fileno(fp), &sbuf) < 0) {
math_error("bad fstat"); math_error("bad fstat");
/*NOTREACHED*/ /*NOTREACHED*/
} }
if (name) { /* initialize FILEIO structure */
newname = (char *)malloc(strlen(name) + 1); if (name == NULL) {
if (newname == NULL) { if (fiop->name == NULL) {
math_error("No memory for filename"); math_error("old and new reopen filenames are NULL");
/*NOTREACHED*/
} }
if (fiop->name) } else if (fiop->name != NULL) {
free(fiop->name); free(fiop->name);
strcpy(newname, name); fiop->name = NULL;
fiop->name = newname;
} }
fiop->fp = fp; init_fileio(fiop, name, mode, &sbuf, id, fp);
fiop->dev = sbuf.st_dev;
fiop->inode = sbuf.st_ino;
fiop->reading = TRUE;
fiop->writing = TRUE;
fiop->action = 0;
/* /* return calc open file ID */
* determine file open mode
*
* While a leading 'r' is for reading and a leading 'w' is
* for writing, the presense of a '+' in the string means
* both reading and writing. A leading 'a' means append
* which is writing.
*/
if (mode[0] == 'r') {
fiop->reading = TRUE;
if (strchr(mode, '+') == NULL) {
fiop->writing = FALSE;
} else {
fiop->writing = TRUE;
}
} else if (mode[0] == 'w' || mode[0] == 'a') {
fiop->writing = TRUE;
if (strchr(mode, '+') == NULL) {
fiop->reading = FALSE;
} else {
fiop->reading = TRUE;
}
} else {
fiop->reading = FALSE;
fiop->writing = FALSE;
}
strcpy(fiop->mode, mode);
return id; return id;
} }
@@ -810,7 +945,7 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
VALUE *vp; VALUE *vp;
char *str; char *str;
int ch; int ch;
long len; size_t len;
int oldmode, newmode; int oldmode, newmode;
long olddigits, newdigits; long olddigits, newdigits;
long width, precision; long width, precision;
@@ -877,36 +1012,36 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
newdigits = precision; newdigits = precision;
switch (ch) { switch (ch) {
case 's': case 's':
printstring = TRUE; printstring = TRUE;
case 'c': case 'c':
printchar = TRUE; printchar = TRUE;
case 'd': case 'd':
break; break;
case 'f': case 'f':
newmode = MODE_REAL; newmode = MODE_REAL;
break; break;
case 'e': case 'e':
newmode = MODE_EXP; newmode = MODE_EXP;
break; break;
case 'r': case 'r':
newmode = MODE_FRAC; newmode = MODE_FRAC;
break; break;
case 'o': case 'o':
newmode = MODE_OCTAL; newmode = MODE_OCTAL;
break; break;
case 'x': case 'x':
newmode = MODE_HEX; newmode = MODE_HEX;
break; break;
case 'b': case 'b':
newmode = MODE_BINARY; newmode = MODE_BINARY;
break; break;
case 0: case 0:
math_setfp(stdout); math_setfp(stdout);
return 0; return 0;
default: default:
math_chr(ch); math_chr(ch);
continue; continue;
} }
if (--count < 0) { if (--count < 0) {
@@ -927,41 +1062,41 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
if ((width == 0) || if ((width == 0) ||
(vp->v_type == V_MAT) || (vp->v_type == V_LIST)) { (vp->v_type == V_MAT) || (vp->v_type == V_LIST)) {
switch(vp->v_type) { switch(vp->v_type) {
case V_OCTET: case V_OCTET:
if (printstring) if (printstring)
math_str((char *)vp->v_octet); math_str((char *)vp->v_octet);
else if (printchar) else if (printchar)
math_chr(*vp->v_octet); math_chr(*vp->v_octet);
else else
printvalue(vp, PRINT_NORMAL);
break;
case V_BLOCK:
if (printstring)
math_str((char *)
vp->v_block->data);
else if (printchar)
math_chr(*vp->v_block->data);
else
printvalue(vp, PRINT_NORMAL);
break;
case V_NBLOCK:
if (printstring) {
if (vp->v_nblock->blk->data !=
NULL)
math_str((char *)
vp->v_nblock
->blk->data);
} else if (printchar) {
if (vp->v_nblock->blk->data !=
NULL)
math_chr(*vp->v_nblock->
blk->data);
} else {
printvalue(vp, PRINT_NORMAL);
}
break;
default:
printvalue(vp, PRINT_NORMAL); printvalue(vp, PRINT_NORMAL);
break;
case V_BLOCK:
if (printstring)
math_str((char *)
vp->v_block->data);
else if (printchar)
math_chr(*vp->v_block->data);
else
printvalue(vp, PRINT_NORMAL);
break;
case V_NBLOCK:
if (printstring) {
if (vp->v_nblock->blk->data !=
NULL)
math_str((char *)
vp->v_nblock
->blk->data);
} else if (printchar) {
if (vp->v_nblock->blk->data !=
NULL)
math_chr(*vp->v_nblock->
blk->data);
} else {
printvalue(vp, PRINT_NORMAL);
}
break;
default:
printvalue(vp, PRINT_NORMAL);
} }
math_setmode(oldmode); math_setmode(oldmode);
@@ -1014,13 +1149,13 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
if (strchr(str, '\n')) if (strchr(str, '\n'))
width = 0; width = 0;
len = strlen(str); len = strlen(str);
while (!didneg && (width > len)) { while (!didneg && ((size_t)width > len)) {
width--; width--;
math_chr(' '); math_chr(' ');
} }
math_str(str); math_str(str);
free(str); free(str);
while (didneg && (width > len)) { while (didneg && ((size_t)width > len)) {
width--; width--;
math_chr(' '); math_chr(' ');
} }
@@ -1414,52 +1549,52 @@ fseekid(FILEID id, ZVALUE offset, int whence)
/* seek depending on whence */ /* seek depending on whence */
switch (whence) { switch (whence) {
case 0: case 0:
/* construct seek position, off = offset */ /* construct seek position, off = offset */
if (zisneg(offset)) if (zisneg(offset))
return -3; return -3;
off = z2filepos(offset); off = z2filepos(offset);
/* seek there */ /* seek there */
ret = f_seek_set(fiop->fp, &off); ret = f_seek_set(fiop->fp, &off);
break; break;
case 1: case 1:
/* construct seek position, off = cur+offset */ /* construct seek position, off = cur+offset */
f_tell(fiop->fp, &off); f_tell(fiop->fp, &off);
cur = filepos2z(off); cur = filepos2z(off);
zadd(cur, offset, &tmp); zadd(cur, offset, &tmp);
zfree(cur); zfree(cur);
if (zisneg(tmp)) { if (zisneg(tmp)) {
zfree(tmp);
return -3;
}
off = z2filepos(tmp);
zfree(tmp); zfree(tmp);
return -3;
}
off = z2filepos(tmp);
zfree(tmp);
/* seek there */ /* seek there */
ret = f_seek_set(fiop->fp, &off); ret = f_seek_set(fiop->fp, &off);
break; break;
case 2: case 2:
/* construct seek position, off = len+offset */ /* construct seek position, off = len+offset */
if (get_open_siz(fiop->fp, &cur) < 0) if (get_open_siz(fiop->fp, &cur) < 0)
return -4; return -4;
zadd(cur, offset, &tmp); zadd(cur, offset, &tmp);
zfree(cur); zfree(cur);
if (zisneg(tmp)) { if (zisneg(tmp)) {
zfree(tmp);
return -3;
}
off = z2filepos(tmp);
zfree(tmp); zfree(tmp);
return -3;
}
off = z2filepos(tmp);
zfree(tmp);
/* seek there */ /* seek there */
ret = f_seek_set(fiop->fp, &off); ret = f_seek_set(fiop->fp, &off);
break; break;
default: default:
return -5; return -5;
} }
return ret; return ret;
} }
@@ -1828,7 +1963,7 @@ showfiles(void)
FILE *fp; FILE *fp;
struct stat sbuf; struct stat sbuf;
ino_t inodes[MAXFILES]; ino_t inodes[MAXFILES];
long sizes[MAXFILES]; off_t sizes[MAXFILES];
int i, j; int i, j;
for (i = 0; i < idnum; i++) { for (i = 0; i < idnum; i++) {
@@ -1840,7 +1975,7 @@ showfiles(void)
sizes[i] = -1; sizes[i] = -1;
} else { } else {
inodes[i] = sbuf.st_ino; inodes[i] = sbuf.st_ino;
sizes[i] = (long) sbuf.st_size; sizes[i] = sbuf.st_size;
} }
} }
for (i = 0; i < idnum; i++) { for (i = 0; i < idnum; i++) {
@@ -1853,7 +1988,7 @@ showfiles(void)
math_chr('\n'); math_chr('\n');
continue; continue;
} }
printf(" size = %ld\n", sizes[i]); printf(" size = %lld\n", (long long int)sizes[i]);
for (j = i + 1; j < idnum; j++) { for (j = i + 1; j < idnum; j++) {
if (listed[j] || sizes[j] == -1) if (listed[j] || sizes[j] == -1)
continue; continue;
@@ -2040,7 +2175,7 @@ fscanfile(FILE *fp, char *fmt, int count, VALUE **vals)
BOOL skip; /* True if string to be skipped rather than read */ BOOL skip; /* True if string to be skipped rather than read */
int width; int width;
VALUE *var; /* lvalue to be assigned to */ VALUE *var; /* lvalue to be assigned to */
short subtype; /* for var->v_subtype */ unsigned short subtype; /* for var->v_subtype */
FILEPOS cur; /* current location */ FILEPOS cur; /* current location */
if (feof(fp)) if (feof(fp))
@@ -2083,75 +2218,75 @@ fscanfile(FILE *fp, char *fmt, int count, VALUE **vals)
f = *fmt++; f = *fmt++;
} }
switch (f) { switch (f) {
case 'c': case 'c':
if (width == 0) if (width == 0)
width = 1; width = 1;
getscanfield(fp,skip,width,0,NULL,&str); getscanfield(fp,skip,width,0,NULL,&str);
break; break;
case 's': case 's':
getscanwhite(fp,1,0,6,NULL); getscanwhite(fp,1,0,6,NULL);
if (feof(fp)) if (feof(fp))
return assnum;
getscanwhite(fp,skip,width,-6,&str);
break;
case '[':
f = *fmt;
comp = (f == '^');
if (comp)
f = *++fmt;
scanptr = fmt;
if (f == '\0')
return assnum;
fmt = strchr((f == ']' ? fmt + 1 : fmt), ']');
if (fmt == NULL)
return assnum;
scannum = fmt - scanptr;
if (comp)
scannum = -scannum;
fmt++;
getscanfield(fp,skip,
width,scannum,scanptr,&str);
break;
case 'f':
case 'e':
case 'r':
case 'i':
getscanwhite(fp,1,0,6, NULL);
if (feof(fp))
return assnum;
if (skip) {
fskipnum(fp);
continue;
}
assnum++;
var = *vals++;
if (var->v_type != V_ADDR)
math_error("This should not happen!!");
var = var->v_addr;
subtype = var->v_subtype;
freevalue(var);
count--;
freadsum(fp, var);
var->v_subtype = subtype;
continue;
case 'n':
assnum++;
var = *vals++;
count--;
if (var->v_type != V_ADDR)
math_error("This should not happen!!");
var = var->v_addr;
subtype = var->v_subtype;
freevalue(var);
var->v_type = V_NUM;
var->v_num = qalloc();
f_tell(fp, &cur);
var->v_num->num = filepos2z(cur);
var->v_subtype = subtype;
continue;
default:
fprintf(stderr, "Unsupported scan specifier");
return assnum; return assnum;
getscanwhite(fp,skip,width,-6,&str);
break;
case '[':
f = *fmt;
comp = (f == '^');
if (comp)
f = *++fmt;
scanptr = fmt;
if (f == '\0')
return assnum;
fmt = strchr((f == ']' ? fmt + 1 : fmt), ']');
if (fmt == NULL)
return assnum;
scannum = fmt - scanptr;
if (comp)
scannum = -scannum;
fmt++;
getscanfield(fp,skip,
width,scannum,scanptr,&str);
break;
case 'f':
case 'e':
case 'r':
case 'i':
getscanwhite(fp,1,0,6, NULL);
if (feof(fp))
return assnum;
if (skip) {
fskipnum(fp);
continue;
}
assnum++;
var = *vals++;
if (var->v_type != V_ADDR)
math_error("This should not happen!!");
var = var->v_addr;
subtype = var->v_subtype;
freevalue(var);
count--;
freadsum(fp, var);
var->v_subtype = subtype;
continue;
case 'n':
assnum++;
var = *vals++;
count--;
if (var->v_type != V_ADDR)
math_error("This should not happen!!");
var = var->v_addr;
subtype = var->v_subtype;
freevalue(var);
var->v_type = V_NUM;
var->v_num = qalloc();
f_tell(fp, &cur);
var->v_num->num = filepos2z(cur);
var->v_subtype = subtype;
continue;
default:
fprintf(stderr, "Unsupported scan specifier");
return assnum;
} }
if (!skip) { if (!skip) {
assnum++; assnum++;

21
file.h
View File

@@ -1,7 +1,7 @@
/* /*
* file - file I/O routines callable by users * file - file I/O routines callable by users
* *
* Copyright (C) 1999 David I. Bell and Landon Curt Noll * Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.5 $ * @(#) $Revision: 29.8 $
* @(#) $Id: file.h,v 29.5 2001/06/08 21:00:58 chongo Exp $ * @(#) $Id: file.h,v 29.8 2006/05/19 15:26:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/file.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/file.h,v $
* *
* Under source code control: 1996/05/24 05:55:58 * Under source code control: 1996/05/24 05:55:58
@@ -53,8 +53,10 @@ typedef struct {
char *name; /* file name */ char *name; /* file name */
BOOL reading; /* TRUE if opened for reading */ BOOL reading; /* TRUE if opened for reading */
BOOL writing; /* TRUE if opened for writing */ BOOL writing; /* TRUE if opened for writing */
BOOL appending; /* TRUE if also opened for appending */
BOOL binary; /* TRUE if binary mode - mode ignored/unused */
char action; /* most recent use for 'r', 'w' or 0 */ char action; /* most recent use for 'r', 'w' or 0 */
char mode[sizeof("rb+")];/* open mode */ char mode[sizeof("rb+")+1];/* open mode */
} FILEIO; } FILEIO;
@@ -89,11 +91,12 @@ typedef struct {
/* /*
* external functions * external functions
*/ */
extern FILEIO * findid(FILEID id, int writable); extern DLL FILEIO * findid(FILEID id, int writable);
extern int fgetposid(FILEID id, FILEPOS *ptr); extern DLL int fgetposid(FILEID id, FILEPOS *ptr);
extern int fsetposid(FILEID id, FILEPOS *ptr); extern DLL int fsetposid(FILEID id, FILEPOS *ptr);
extern int get_open_siz(FILE *fp, ZVALUE *res); extern DLL int get_open_siz(FILE *fp, ZVALUE *res);
extern char* findfname(FILEID); extern DLL char* findfname(FILEID);
extern DLL FILE *f_pathopen(char *name, char *mode, char *pathlist, char **openpath);
#endif /* !__FILE_H__ */ #endif /* !__FILE_H__ */

635
func.c

File diff suppressed because it is too large Load Diff

17
hash.c
View File

@@ -1,7 +1,7 @@
/* /*
* hash - one-way hash routines * hash - one-way hash routines
* *
* Copyright (C) 1999-2002 Landon Curt Noll * Copyright (C) 1999-2006 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.5 $ * @(#) $Revision: 29.8 $
* @(#) $Id: hash.c,v 29.5 2002/12/29 09:20:25 chongo Exp $ * @(#) $Id: hash.c,v 29.8 2006/05/19 15:26:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/hash.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/hash.c,v $
* *
* Under source code control: 1995/11/23 05:13:11 * Under source code control: 1995/11/23 05:13:11
@@ -596,7 +596,7 @@ hash_complex(int type, void *c, HASH *state)
HASH * HASH *
hash_str(int type, char *str, HASH *state) hash_str(int type, char *str, HASH *state)
{ {
USB32 len; /* string length */ size_t len; /* string length */
/* /*
* initialize if state is NULL * initialize if state is NULL
@@ -985,6 +985,15 @@ hash_value(int type, void *v, HASH *state)
state = hash_int(type, value->v_config->ctrl_d, state); state = hash_int(type, value->v_config->ctrl_d, state);
state = hash_str(type, value->v_config->program, state); state = hash_str(type, value->v_config->program, state);
state = hash_str(type, value->v_config->base_name, state); state = hash_str(type, value->v_config->base_name, state);
state = hash_bool(type, value->v_config->windows, state);
state = hash_bool(type, value->v_config->cygwin, state);
state = hash_bool(type, value->v_config->compile_custom, state);
if (value->v_config->allow_custom != NULL &&
*(value->v_config->allow_custom)) {
state = hash_bool(type, TRUE, state);
} else {
state = hash_bool(type, FALSE, state);
}
state = hash_str(type, value->v_config->version, state); state = hash_str(type, value->v_config->version, state);
break; break;

View File

@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.23 $ # @(#) $Revision: 29.28 $
# @(#) $Id: Makefile,v 29.23 2003/01/14 02:24:48 chongo Exp $ # @(#) $Id: Makefile,v 29.28 2006/05/07 12:59:51 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/help/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/cmd/calc/help/RCS/Makefile,v $
# #
# Under source code control: 1991/07/23 06:47:57 # Under source code control: 1991/07/23 06:47:57
@@ -170,6 +170,19 @@ SORT= sort
FMT= fmt FMT= fmt
CMP= cmp CMP= cmp
# Some out of date operating systems require / want an executable to
# end with a certain file extension. Some compile systems such as
# Cygwin build calc as calc.exe. The EXT variable is used to denote
# the extension required by such.
#
# EXT= # normal Un*x / Linux / GNU/Linux systems
# EXT=.exe # windoz / Cygwin
#
# If in doubt, use EXT=
#
EXT=
#EXT=.exe
# Standard and Builtin help files # Standard and Builtin help files
# #
STD_HELP_FILES_1= intro overview help STD_HELP_FILES_1= intro overview help
@@ -245,32 +258,41 @@ BLT_HELP_FILES= ${BLT_HELP_FILES_3} ${BLT_HELP_FILES_5} \
# This list is prodiced by the detaillist rule when no WARNINGS are detected. # This list is prodiced by the detaillist rule when no WARNINGS are detected.
# #
# Please use:
#
# make detaillist
#
# to keep this list in nice sorted order and to check that these
# non-special help files are under RCS control.
#
DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \ DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \
appr arg argv arrow asec asech asin asinh assign atan atan2 atanh \ appr arg argv arrow asec asech asin asinh assign atan atan2 atanh \
avg base base2 bernoulli bit blk blkcpy blkfree blocks bround btrunc \ avg base base2 bernoulli bit blk blkcpy blkfree blocks bround btrunc \
calc_tty calclevel catalan ceil cfappr cfsim char cmdbuf cmp comb \ calc_tty calclevel catalan ceil cfappr cfsim char cmdbuf cmp comb \
conj cos cosh cot coth count cp csc csch ctime delete den dereference \ conj cos cosh cot coth count cp csc csch ctime delete den dereference \
det digit digits dp epsilon errcount errmax errno error euler eval \ det digit digits display dp epsilon errcount errmax errno error \
exp fact factor fclose fcnt feof ferror fflush fgetc fgetfield \ euler eval exp fact factor fclose fcnt feof ferror fflush fgetc \
fgetline fgets fgetstr fib files floor fopen forall fprintf fputc \ fgetfield fgetline fgets fgetstr fib files floor fopen forall \
fputs fputstr frac free freebernoulli freeeuler freeglobals freeredc \ fpathopen fprintf fputc fputs fputstr frac free freebernoulli \
freestatics frem freopen fscan fscanf fseek fsize ftell gcd gcdrem \ freeeuler freeglobals freeredc freestatics frem freopen fscan \
gd getenv hash head highbit hmean hnrmod hypot ilog ilog10 ilog2 \ fscanf fseek fsize ftell gcd gcdrem gd getenv hash head highbit \
im indices inputlevel insert int inverse iroot isassoc isatty isblk \ hmean hnrmod hypot ilog ilog10 ilog2 im indices inputlevel insert \
isconfig isdefined iserror iseven isfile ishash isident isint islist \ int inverse iroot isassoc isatty isblk isconfig isdefined iserror \
ismat ismult isnull isnum isobj isobjtype isodd isprime isptr isqrt \ iseven isfile ishash isident isint islist ismat ismult isnull isnum \
isrand israndom isreal isrel issimple issq isstr istype jacobi join \ isobj isobjtype isodd isprime isptr isqrt isrand israndom isreal \
lcm lcmfact lfactor ln lowbit ltol makelist matdim matfill matmax \ isrel issimple issq isstr istype jacobi join lcm lcmfact lfactor \
matmin matsum mattrace mattrans max md5 memsize meq min minv mmin \ ln log lowbit ltol makelist matdim matfill matmax matmin matsum \
mne mod modify name near newerror nextcand nextprime norm null \ mattrace mattrans max md5 memsize meq min minv mmin mne mod modify \
num oldvalue ord param perm pfact pi pix places pmod polar poly \ name near newerror nextcand nextprime norm null num oldvalue ord \
pop popcnt power prevcand prevprime printf prompt protect ptest \ param perm pfact pi pix places pmod polar poly pop popcnt power \
push putenv quo quomod rand randbit random randombit randperm rcin \ prevcand prevprime printf prompt protect ptest push putenv quo \
rcmul rcout rcpow rcsq re remove reverse rewind rm root round rsearch \ quomod rand randbit random randombit randperm rcin rcmul rcout \
runtime saveval scale scan scanf search sec sech seed segment select \ rcpow rcsq re remove reverse rewind rm root round rsearch runtime \
sgn sha sha1 sin sinh size sizeof sleep sort sqrt srand srandom \ saveval scale scan scanf search sec sech seed segment select sgn \
ssq str strcat strerror strlen strpos strprintf strscan strscanf \ sha sha1 sin sinh size sizeof sleep sort sqrt srand srandom ssq \
substr sum swap system tail tan tanh test time trunc version xor str strcat strcmp strcpy strerror strlen strncmp strncpy strpos \
strprintf strscan strscanf substr sum swap system tail tan tanh \
test time trunc version xor
# This list is of files that are clones of DETAIL_HELP files. They are # This list is of files that are clones of DETAIL_HELP files. They are
# built from DETAIL_HELP files. # built from DETAIL_HELP files.
@@ -534,13 +556,13 @@ builtin: builtin.top builtin.end ../func.c funclist.sed
${Q}echo "forming builtin help file" ${Q}echo "forming builtin help file"
-${Q}rm -f funclist.c -${Q}rm -f funclist.c
${Q}${SED} -n -f funclist.sed ../func.c > funclist.c ${Q}${SED} -n -f funclist.sed ../func.c > funclist.c
-${Q}rm -f funclist.o funclist -${Q}rm -f funclist.o funclist${EXT}
${Q}${LCC} ${ICFLAGS} -DFUNCLIST -I/usr/include \ ${Q}${LCC} ${ICFLAGS} -DFUNCLIST -I/usr/include \
-I.. funclist.c -c 2>/dev/null -I.. funclist.c -c 2>/dev/null
${Q}${LCC} ${ILDFLAGS} funclist.o -o funclist ${Q}${LCC} ${ILDFLAGS} funclist.o -o funclist${EXT}
-${Q}rm -f builtin -${Q}rm -f builtin
${Q}cat builtin.top > builtin ${Q}cat builtin.top > builtin
${Q}./funclist | \ ${Q}./funclist${EXT} | \
${SED} -e 's/^/ /' -e 's/[ ][ ]*$$//' >> builtin ${SED} -e 's/^/ /' -e 's/[ ][ ]*$$//' >> builtin
${Q}cat builtin.end >> builtin ${Q}cat builtin.end >> builtin
${Q}echo "builtin help file formed" ${Q}echo "builtin help file formed"
@@ -625,12 +647,12 @@ echo_inst_files:
## ##
clean: clean:
rm -f obj mkbuiltin funclist.c funclist.o funclist rm -f obj mkbuiltin funclist.c funclist.o funclist${EXT}
rm -f COPYING COPYING-LGPL rm -f COPYING COPYING-LGPL
clobber: clobber:
rm -f ${BLT_HELP_FILES} full .all calc rm -f ${BLT_HELP_FILES} full .all calc
rm -f obj mkbuiltin funclist.c funclist.o funclist rm -f obj mkbuiltin funclist.c funclist.o funclist${EXT}
rm -f COPYING COPYING-LGPL rm -f COPYING COPYING-LGPL
rm -f ${SINGULAR_FILES} ${DETAIL_CLONE} rm -f ${SINGULAR_FILES} ${DETAIL_CLONE}

View File

@@ -29,10 +29,10 @@ DESCRIPTION
the result will be the absolute value correct to n decimal places. the result will be the absolute value correct to n decimal places.
EXAMPLE EXAMPLE
> print abs(3.4), abs(-3.4) ; print abs(3.4), abs(-3.4)
3.4 3.4 3.4 3.4
> print abs(3+4i, 1e-5), abs(4+5i, 1e-5), abs(4+5i, 1e-10) ; print abs(3+4i, 1e-5), abs(4+5i, 1e-5), abs(4+5i, 1e-10)
5 6.40312 6.4031242374 5 6.40312 6.4031242374
LIMITS LIMITS
@@ -60,8 +60,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: abs,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: abs,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/abs,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/abs,v $
## ##
## Under source code control: 1994/03/19 01:40:22 ## Under source code control: 1994/03/19 01:40:22

View File

@@ -23,19 +23,19 @@ EXAMPLE
The system error-numbers and messages may differ for different The system error-numbers and messages may differ for different
implementations implementations
> !rm -f junk ; !rm -f junk
> access("junk") ; access("junk")
System error 2 System error 2
> strerror(.) ; strerror(.)
"No such file or directory" "No such file or directory"
> f = fopen("junk", "w") ; f = fopen("junk", "w")
> access("junk") ; access("junk")
> fputs(f, "Alpha") ; fputs(f, "Alpha")
> fclose(f) ; fclose(f)
> !chmod u-w junk ; !chmod u-w junk
> access("junk", "w") ; access("junk", "w")
System error 13 System error 13
> strerror(.) ; strerror(.)
"Permission denied" "Permission denied"
LIMITS LIMITS
@@ -64,8 +64,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: access,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: access,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/access,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/access,v $
## ##
## Under source code control: 1996/04/30 03:36:20 ## Under source code control: 1996/04/30 03:36:20

View File

@@ -17,7 +17,7 @@ DESCRIPTION
v = acos(x) is the number in [0, pi] for which cos(v) = x. v = acos(x) is the number in [0, pi] for which cos(v) = x.
EXAMPLE EXAMPLE
> print acos(.5, 1e-5), acos(.5, 1e-10), acos(.5, 1e-15), acos(.5, 1e-20) ; print acos(.5, 1e-5), acos(.5, 1e-10), acos(.5, 1e-15), acos(.5, 1e-20)
1.0472 1.0471975512 1.047197551196598 1.04719755119659774615 1.0472 1.0471975512 1.047197551196598 1.04719755119659774615
LIMITS LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: acos,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: acos,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acos,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acos,v $
## ##
## Under source code control: 1994/03/19 01:40:23 ## Under source code control: 1994/03/19 01:40:23

View File

@@ -20,7 +20,7 @@ DESCRIPTION
acosh(x) = ln(x + sqrt(x^2 - 1)) acosh(x) = ln(x + sqrt(x^2 - 1))
EXAMPLE EXAMPLE
> print acosh(2, 1e-5), acosh(2, 1e-10), acosh(2, 1e-15), acosh(2, 1e-20) ; print acosh(2, 1e-5), acosh(2, 1e-10), acosh(2, 1e-15), acosh(2, 1e-20)
1.31696 1.3169578969 1.316957896924817 1.31695789692481670862 1.31696 1.3169578969 1.316957896924817 1.31695789692481670862
LIMITS LIMITS
@@ -48,8 +48,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: acosh,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: acosh,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acosh,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acosh,v $
## ##
## Under source code control: 1994/03/19 01:40:24 ## Under source code control: 1994/03/19 01:40:24

View File

@@ -17,7 +17,7 @@ DESCRIPTION
v = acot(x) is the number in (0, pi) for which cot(v) = x. v = acot(x) is the number in (0, pi) for which cot(v) = x.
EXAMPLE EXAMPLE
> print acot(2, 1e-5), acot(2, 1e-10), acot(2, 1e-15), acot(2, 1e-20) ; print acot(2, 1e-5), acot(2, 1e-10), acot(2, 1e-15), acot(2, 1e-20)
.46365 .463647609 .463647609000806 .46364760900080611621 .46365 .463647609 .463647609000806 .46364760900080611621
LIMITS LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: acot,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: acot,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acot,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acot,v $
## ##
## Under source code control: 1995/11/13 03:49:00 ## Under source code control: 1995/11/13 03:49:00

View File

@@ -19,7 +19,7 @@ DESCRIPTION
acoth(x) = ln((x + 1)/(x - 1))/2 acoth(x) = ln((x + 1)/(x - 1))/2
EXAMPLE EXAMPLE
> print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20) ; print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20)
.54931 .5493061443 .549306144334055 .5493061443340548457 .54931 .5493061443 .549306144334055 .5493061443340548457
LIMITS LIMITS
@@ -47,8 +47,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: acoth,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: acoth,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acoth,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acoth,v $
## ##
## Under source code control: 1995/11/13 03:49:01 ## Under source code control: 1995/11/13 03:49:01

View File

@@ -17,7 +17,7 @@ DESCRIPTION
v = acsc(x) is the number in [-pi/2, pi/2] for which csc(v) = x. v = acsc(x) is the number in [-pi/2, pi/2] for which csc(v) = x.
EXAMPLE EXAMPLE
> print acsc(2, 1e-5), acsc(2, 1e-10), acsc(2, 1e-15), acsc(2, 1e-20) ; print acsc(2, 1e-5), acsc(2, 1e-10), acsc(2, 1e-15), acsc(2, 1e-20)
.5236 .5235987756 .523598775598299 .52359877559829887308 .5236 .5235987756 .523598775598299 .52359877559829887308
LIMITS LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: acsc,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: acsc,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acsc,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acsc,v $
## ##
## Under source code control: 1995/11/13 03:49:00 ## Under source code control: 1995/11/13 03:49:00

View File

@@ -20,7 +20,7 @@ DESCRIPTION
EXAMPLE EXAMPLE
> print acsch(2, 1e-5), acsch(2, 1e-10), acsch(2, 1e-15), acsch(2, 1e-20) ; print acsch(2, 1e-5), acsch(2, 1e-10), acsch(2, 1e-15), acsch(2, 1e-20)
.48121 .4812118251 .481211825059603 .4812118250596034475 .48121 .4812118251 .481211825059603 .4812118250596034475
LIMITS LIMITS
@@ -48,8 +48,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: acsch,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: acsch,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acsch,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acsch,v $
## ##
## Under source code control: 1995/11/13 03:49:01 ## Under source code control: 1995/11/13 03:49:01

View File

@@ -134,21 +134,21 @@ DESCRIPTION
EXAMPLE EXAMPLE
Addresses for particular systems may differ from those displayed here. Addresses for particular systems may differ from those displayed here.
> mat A[3] ; mat A[3]
> B = blk() ; B = blk()
> print &A, &A[0], &A[1] ; print &A, &A[0], &A[1]
v-ptr: 1400470d0 v-ptr: 140044b70 v-ptr: 140044b80 v-ptr: 1400470d0 v-ptr: 140044b70 v-ptr: 140044b80
> print &B, &B[0], &B[1] ; print &B, &B[0], &B[1]
v-ptr: 140047130 o-ptr: 140044d00 o-ptr: 140044d01 v-ptr: 140047130 o-ptr: 140044d00 o-ptr: 140044d01
> a = A[0] = 27 ; a = A[0] = 27
> print &*a, &*A[0]. &27 ; print &*a, &*A[0]. &27
n_ptr: 14003a850 n_ptr: 14003a850 n_ptr: 14003a850 n_ptr: 14003a850 n_ptr: 14003a850 n_ptr: 14003a850
> a = A[0] = "abc" ; a = A[0] = "abc"
> print &*a, &*A[0], &"abc" ; print &*a, &*A[0], &"abc"
s_ptr: 14004cae0 s_ptr: 14004cae0 s_ptr: 14004cae0 s_ptr: 14004cae0 s_ptr: 14004cae0 s_ptr: 14004cae0
LIMITS LIMITS
@@ -176,8 +176,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.3 $ ## @(#) $Revision: 29.4 $
## @(#) $Id: address,v 29.3 2002/07/10 11:47:04 chongo Exp $ ## @(#) $Id: address,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/address,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/address,v $
## ##
## Under source code control: 1997/09/06 20:03:34 ## Under source code control: 1997/09/06 20:03:34

View File

@@ -35,23 +35,23 @@ DESCRIPTION
EXAMPLE EXAMPLE
> print agd(1, 1e-5), agd(1, 1e-10), agd(1, 1e-15) ; print agd(1, 1e-5), agd(1, 1e-10), agd(1, 1e-15)
1.22619 1.2261911709 1.226191170883517 1.22619 1.2261911709 1.226191170883517
> print agd(2, 1e-5), agd(2, 1e-10) ; print agd(2, 1e-5), agd(2, 1e-10)
1.52345-3.14159i 1.5234524436-3.1415926536i 1.52345-3.14159i 1.5234524436-3.1415926536i
> print agd(5, 1e-5), agd(5, 1e-10), agd(5, 1e-15) ; print agd(5, 1e-5), agd(5, 1e-10), agd(5, 1e-15)
-1.93237 -1.9323667197 -1.932366719745925 -1.93237 -1.9323667197 -1.932366719745925
> print agd(1+2i, 1e-5), agd(1+2i, 1e-10) ; print agd(1+2i, 1e-5), agd(1+2i, 1e-10)
.22751+1.42291i .2275106584+1.4229114625i .22751+1.42291i .2275106584+1.4229114625i
LIMITS LIMITS
none none
LINK LIBRARY LINK LIBRARY
COMPLEX *cagd(COMPLEX *x, NUMBER *eps) COMPLEX *c_agd(COMPLEX *x, NUMBER *eps)
SEE ALSO SEE ALSO
gd, exp, ln, sin, sinh, etc. gd, exp, ln, sin, sinh, etc.
@@ -72,8 +72,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.4 $
## @(#) $Id: agd,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: agd,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/agd,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/agd,v $
## ##
## Under source code control: 1997/09/06 20:03:34 ## Under source code control: 1997/09/06 20:03:34

View File

@@ -19,9 +19,9 @@ DESCRIPTION
append(x, y_0, y_1, ...) is equivalent to insert(x, n, y_0, y_1, ...). append(x, y_0, y_1, ...) is equivalent to insert(x, n, y_0, y_1, ...).
EXAMPLE EXAMPLE
> x = list(2,3,4) ; x = list(2,3,4)
> append(x, 5, 6) ; append(x, 5, 6)
> print x ; print x
list (5 elements, 5 nonzero): list (5 elements, 5 nonzero):
[[0]] = 2 [[0]] = 2
@@ -30,8 +30,8 @@ EXAMPLE
[[3]] = 5 [[3]] = 5
[[4]] = 6 [[4]] = 6
> append(x, pop(x), pop(x)) ; append(x, pop(x), pop(x))
> print x ; print x
list (5 elements, 5 nonzero): list (5 elements, 5 nonzero):
[[0]] = 4 [[0]] = 4
@@ -40,8 +40,8 @@ EXAMPLE
[[3]] = 2 [[3]] = 2
[[4]] = 3 [[4]] = 3
> append(x, (remove(x), 7)) ; append(x, (remove(x), 7))
> print x ; print x
list (5 elements, 5 nonzero): list (5 elements, 5 nonzero):
[[0]] = 4 [[0]] = 4
@@ -75,8 +75,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: append,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: append,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/append,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/append,v $
## ##
## Under source code control: 1994/03/19 03:13:17 ## Under source code control: 1994/03/19 03:13:17

View File

@@ -97,47 +97,47 @@ PROPERTIES
If y is nonzero, appr(x,y,8)/y = an odd integer n only if x = n * y. If y is nonzero, appr(x,y,8)/y = an odd integer n only if x = n * y.
EXAMPLES EXAMPLES
> print appr(-5.44,0.1,0), appr(5.44,0.1,0), appr(5.7,1,0), appr(-5.7,1,0) ; print appr(-5.44,0.1,0), appr(5.44,0.1,0), appr(5.7,1,0), appr(-5.7,1,0)
-5.5 5.4 5 -6 -5.5 5.4 5 -6
> print appr(-5.44,-.1,0), appr(5.44,-.1,0), appr(5.7,-1,0), appr(-5.7,-1,0) ; print appr(-5.44,-.1,0), appr(5.44,-.1,0), appr(5.7,-1,0), appr(-5.7,-1,0)
-5.4 5.5 6 -5 -5.4 5.5 6 -5
> print appr(-5.44,0.1,3), appr(5.44,0.1,3), appr(5.7,1,3), appr(-5.7,1,3) ; print appr(-5.44,0.1,3), appr(5.44,0.1,3), appr(5.7,1,3), appr(-5.7,1,3)
-5.5 5.5 6 -6 -5.5 5.5 6 -6
> print appr(-5.44,0.1,4), appr(5.44,0.1,4), appr(5.7,1,4), appr(-5.7,1,4) ; print appr(-5.44,0.1,4), appr(5.44,0.1,4), appr(5.7,1,4), appr(-5.7,1,4)
-5.5 5.4 5 -6 -5.5 5.4 5 -6
> print appr(-5.44,0.1,6), appr(5.44,0.1,6), appr(5.7,1,6), appr(-5.7,1,6) ; print appr(-5.44,0.1,6), appr(5.44,0.1,6), appr(5.7,1,6), appr(-5.7,1,6)
-5.4 5.4 6 -5 -5.4 5.4 6 -5
> print appr(-5.44,-.1,6), appr(5.44,-.1,6), appr(5.7,-1,6), appr(-5.7,-1,6) ; print appr(-5.44,-.1,6), appr(5.44,-.1,6), appr(5.7,-1,6), appr(-5.7,-1,6)
-5.5 5.5 6 -6 -5.5 5.5 6 -6
> print appr(-5.44,0.1,9), appr(5.44,0.1,9), appr(5.7,1,9), appr(-5.7,1,9) ; print appr(-5.44,0.1,9), appr(5.44,0.1,9), appr(5.7,1,9), appr(-5.7,1,9)
-5.5 5.5 5 -5 -5.5 5.5 5 -5
> print appr(-.44,0.1,11), appr(.44,0.1,11), appr(5.7,1,11), appr(-5.7,1,11) ; print appr(-.44,0.1,11), appr(.44,0.1,11), appr(5.7,1,11), appr(-5.7,1,11)
-.4 .5 5 -6 -.4 .5 5 -6
> print appr(-.44,-.1,11),appr(.44,-.1,11),appr(5.7,-1,11),appr(-5.7,-1,11) ; print appr(-.44,-.1,11),appr(.44,-.1,11),appr(5.7,-1,11),appr(-5.7,-1,11)
-.5 .4 6 -5 -.5 .4 6 -5
> print appr(-.44,0.1,12), appr(.44,0.1,12), appr(5.7,1,12), appr(-5.7,1,12) ; print appr(-.44,0.1,12), appr(.44,0.1,12), appr(5.7,1,12), appr(-5.7,1,12)
-.4 .5 5 -6 -.4 .5 5 -6
> print appr(-.44,-.1,12),appr(.44,-.1,12),appr(5.7,-1,12),appr(-5.7,-1,12) ; print appr(-.44,-.1,12),appr(.44,-.1,12),appr(5.7,-1,12),appr(-5.7,-1,12)
-.5 .4 6 -5 -.5 .4 6 -5
> print appr(-.44,0.1,15), appr(.44,0.1,15), appr(5.7,1,15), appr(-5.7,1,15) ; print appr(-.44,0.1,15), appr(.44,0.1,15), appr(5.7,1,15), appr(-5.7,1,15)
-.4 .5 5 -6 -.4 .5 5 -6
> print appr(-.44,-.1,15),appr(.44,-.1,15),appr(5.7,-1,15),appr(-5.7,-1,15) ; print appr(-.44,-.1,15),appr(.44,-.1,15),appr(5.7,-1,15),appr(-5.7,-1,15)
-.4 .5 5 -6 -.4 .5 5 -6
> x = sqrt(7-3i, 1e-20) ; x = sqrt(7-3i, 1e-20)
> print appr(x,1e-5,0), appr(x,1e-5,1), appr(x,1e-5,2), appr(x,1e-6,3) ; print appr(x,1e-5,0), appr(x,1e-5,1), appr(x,1e-5,2), appr(x,1e-6,3)
2.70331-.55488i 2.70332-.55487i 2.70331-.55487i 2.70332-.55488i 2.70331-.55488i 2.70332-.55487i 2.70331-.55487i 2.70332-.55488i
LIMITS LIMITS
@@ -167,8 +167,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: appr,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: appr,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/appr,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/appr,v $
## ##
## Under source code control: 1994/09/25 17:18:21 ## Under source code control: 1994/09/25 17:18:21

View File

@@ -16,11 +16,11 @@ DESCRIPTION
but usually less than 0.5 * abs(eps). but usually less than 0.5 * abs(eps).
EXAMPLE EXAMPLE
> print arg(2), arg(2+3i, 1e-5), arg(2+3i, 1e-10), arg(2+3i, 1e-20) ; print arg(2), arg(2+3i, 1e-5), arg(2+3i, 1e-10), arg(2+3i, 1e-20)
0 .98279 .9827937232 .98279372324732906799 0 .98279 .9827937232 .98279372324732906799
> pi = pi(1e-10); deg = pi/180; eps = deg/10000 ; pi = pi(1e-10); deg = pi/180; eps = deg/10000
> print arg(2+3i, eps)/deg, arg(-1 +1i, eps)/deg, arg(-1 - 1i,eps)/deg ; print arg(2+3i, eps)/deg, arg(-1 +1i, eps)/deg, arg(-1 - 1i,eps)/deg
56.3099 135 -135 56.3099 135 -135
LIMITS LIMITS
@@ -48,8 +48,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: arg,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: arg,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arg,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arg,v $
## ##
## Under source code control: 1994/09/25 20:22:31 ## Under source code control: 1994/09/25 20:22:31

View File

@@ -38,8 +38,8 @@ DESCRIPTION
EXAMPLE EXAMPLE
$ calc -s a bb ccc $ calc -s a bb ccc
> argc = argv(); ; argc = argv();
> for (i = 0; i < argc; i++) print "argv[": i : '] = "': argv(i) : '"'; ; for (i = 0; i < argc; i++) print "argv[": i : '] = "': argv(i) : '"';
argv[0] = "a" argv[0] = "a"
argv[1] = "bb" argv[1] = "bb"
argv[2] = "ccc" argv[2] = "ccc"
@@ -69,8 +69,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: argv,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: argv,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/argv,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/argv,v $
## ##
## Under source code control: 1999/11/23 19:45:05 ## Under source code control: 1999/11/23 19:45:05

View File

@@ -23,21 +23,21 @@ DESCRIPTION
Spaces or tabs on either side of -> are optional. Spaces or tabs on either side of -> are optional.
EXAMPLES EXAMPLES
> obj pair {one, two} ; obj pair {one, two}
> obj pair A, B ; obj pair A, B
> p = &A ; p = &A
> p->one = 1; p->two = 2 ; p->one = 1; p->two = 2
> A ; A
obj pair {1, 2} obj pair {1, 2}
> A->two = &B ; A->two = &B
> p->two->one = 3; p->two->two = 4 ; p->two->one = 3; p->two->two = 4
> *p->ptwo ; *p->ptwo
obj pair {3, 4} obj pair {3, 4}
> B = {5,6} ; B = {5,6}
> *p->two ; *p->two
obj pair {5, 6} obj pair {5, 6}
@@ -66,8 +66,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.3 $ ## @(#) $Revision: 29.4 $
## @(#) $Id: arrow,v 29.3 2002/07/10 11:47:04 chongo Exp $ ## @(#) $Id: arrow,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arrow,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arrow,v $
## ##
## Under source code control: 1997/09/06 20:03:34 ## Under source code control: 1997/09/06 20:03:34

View File

@@ -17,7 +17,7 @@ DESCRIPTION
v = asec(x) is the number in [0, pi] for which sec(v) = x. v = asec(x) is the number in [0, pi] for which sec(v) = x.
EXAMPLE EXAMPLE
> print asec(2, 1e-5), asec(2, 1e-10), asec(2, 1e-15), asec(2, 1e-20) ; print asec(2, 1e-5), asec(2, 1e-10), asec(2, 1e-15), asec(2, 1e-20)
1.0472 1.0471975512 1.047197551196598 1.04719755119659774615 1.0472 1.0471975512 1.047197551196598 1.04719755119659774615
LIMITS LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: asec,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: asec,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asec,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asec,v $
## ##
## Under source code control: 1995/11/13 03:49:00 ## Under source code control: 1995/11/13 03:49:00

View File

@@ -19,7 +19,7 @@ DESCRIPTION
asech(x) = ln((1 + sqrt(1 - x^2))/x) asech(x) = ln((1 + sqrt(1 - x^2))/x)
EXAMPLE EXAMPLE
> print asech(.5,1e-5), asech(.5,1e-10), asech(.5,1e-15), asech(.5,1e-20) ; print asech(.5,1e-5), asech(.5,1e-10), asech(.5,1e-15), asech(.5,1e-20)
1.31696 1.3169578969 1.316957896924817 1.31695789692481670862 1.31696 1.3169578969 1.316957896924817 1.31695789692481670862
LIMITS LIMITS
@@ -47,8 +47,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: asech,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: asech,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asech,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asech,v $
## ##
## Under source code control: 1995/11/13 03:49:00 ## Under source code control: 1995/11/13 03:49:00

View File

@@ -17,7 +17,7 @@ DESCRIPTION
v = asin(x) is the number in [-pi/2, pi/2] for which sin(v) = x. v = asin(x) is the number in [-pi/2, pi/2] for which sin(v) = x.
EXAMPLE EXAMPLE
> print asin(.5, 1e-5), asin(.5, 1e-10), asin(.5, 1e-15), asin(.5, 1e-20) ; print asin(.5, 1e-5), asin(.5, 1e-10), asin(.5, 1e-15), asin(.5, 1e-20)
.5236 .5235987756 .523598775598299 .52359877559829887308 .5236 .5235987756 .523598775598299 .52359877559829887308
LIMITS LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.3 $ ## @(#) $Revision: 29.4 $
## @(#) $Id: asin,v 29.3 2002/07/10 11:47:04 chongo Exp $ ## @(#) $Id: asin,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asin,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asin,v $
## ##
## Under source code control: 1994/03/19 01:40:24 ## Under source code control: 1994/03/19 01:40:24

View File

@@ -19,7 +19,7 @@ DESCRIPTION
asinh(x) = ln(x + sqrt(1 + x^2)) asinh(x) = ln(x + sqrt(1 + x^2))
EXAMPLE EXAMPLE
> print asinh(2, 1e-5), asinh(2, 1e-10), asinh(2, 1e-15), asinh(2, 1e-20) ; print asinh(2, 1e-5), asinh(2, 1e-10), asinh(2, 1e-15), asinh(2, 1e-20)
1.44363 1.4436354752 1.44363547517881 1.44363547517881034249 1.44363 1.4436354752 1.44363547517881 1.44363547517881034249
LIMITS LIMITS
@@ -47,8 +47,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: asinh,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: asinh,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asinh,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asinh,v $
## ##
## Under source code control: 1994/03/19 01:40:25 ## Under source code control: 1994/03/19 01:40:25

View File

@@ -76,32 +76,32 @@ DESCRIPTION
EXAMPLE EXAMPLE
> b = 3+1 ; b = 3+1
> a = b ; a = b
> print a, b ; print a, b
4 4 4 4
> obj point {x,y} ; obj point {x,y}
> mat A[3] = {1, list(2,3), obj point = {4,5}} ; mat A[3] = {1, list(2,3), obj point = {4,5}}
> A[1][[0]] = 6; A[2].x = 7 ; A[1][[0]] = 6; A[2].x = 7
> print A[1] ; print A[1]
list (2 elements, 2 nonzero): list (2 elements, 2 nonzero):
[[0]] = 6 [[0]] = 6
[[1]] = 3 [[1]] = 3
> print A[2] ; print A[2]
obj point {7, 5} obj point {7, 5}
> A = {A[2], , {9,10}} ; A = {A[2], , {9,10}}
> print A[0] ; print A[0]
obj point {7, 5} obj point {7, 5}
> print A[2] ; print A[2]
obj point {9, 10} obj point {9, 10}
> A = {, {2}} ; A = {, {2}}
print A[1] print A[1]
list (2 elements, 2 nonzero): list (2 elements, 2 nonzero):
@@ -133,8 +133,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: assign,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: assign,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/assign,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/assign,v $
## ##
## Under source code control: 1995/05/11 21:03:23 ## Under source code control: 1995/05/11 21:03:23

View File

@@ -60,12 +60,12 @@ DESCRIPTION
and are illegal. and are illegal.
EXAMPLE EXAMPLE
> A = assoc(); print A ; A = assoc(); print A
assoc (0 elements): assoc (0 elements):
> A["zero"] = 0; A["one"] = 1; A["two"] = 2; A["three"] = 3; ; A["zero"] = 0; A["one"] = 1; A["two"] = 2; A["three"] = 3;
> A["smallest", "prime"] = 2; ; A["smallest", "prime"] = 2;
> print A ; print A
assoc (5 elements); assoc (5 elements);
["two"] = 2 ["two"] = 2
["three"] = 3 ["three"] = 3
@@ -98,8 +98,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.3 $ ## @(#) $Revision: 29.4 $
## @(#) $Id: assoc,v 29.3 2002/07/10 11:47:04 chongo Exp $ ## @(#) $Id: assoc,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/assoc,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/assoc,v $
## ##
## Under source code control: 1994/09/25 20:22:31 ## Under source code control: 1994/09/25 20:22:31

View File

@@ -17,7 +17,7 @@ DESCRIPTION
v = atan(x) is the number in (-pi/2, pi/2) for which tan(v) = x. v = atan(x) is the number in (-pi/2, pi/2) for which tan(v) = x.
EXAMPLE EXAMPLE
> print atan(2, 1e-5), atan(2, 1e-10), atan(2, 1e-15), atan(2, 1e-20) ; print atan(2, 1e-5), atan(2, 1e-10), atan(2, 1e-15), atan(2, 1e-20)
1.10715 1.1071487178 1.107148717794091 1.10714871779409050302 1.10715 1.1071487178 1.107148717794091 1.10714871779409050302
LIMITS LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.3 $ ## @(#) $Revision: 29.4 $
## @(#) $Id: atan,v 29.3 2002/07/10 11:47:04 chongo Exp $ ## @(#) $Id: atan,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atan,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atan,v $
## ##
## Under source code control: 1994/03/19 01:40:25 ## Under source code control: 1994/03/19 01:40:25

View File

@@ -24,7 +24,7 @@ DESCRIPTION
returns 0. returns 0.
EXAMPLE EXAMPLE
> print atan2(0,0), atan2(1,sqrt(3)), atan2(17,53,1e-100) ; print atan2(0,0), atan2(1,sqrt(3)), atan2(17,53,1e-100)
0 ~.52359877559829887307 ~.31038740713235146535 0 ~.52359877559829887307 ~.31038740713235146535
LIMITS LIMITS
@@ -52,8 +52,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: atan2,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: atan2,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atan2,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atan2,v $
## ##
## Under source code control: 1994/03/19 01:40:26 ## Under source code control: 1994/03/19 01:40:26

View File

@@ -19,7 +19,7 @@ DESCRIPTION
atanh(x) = ln((1 + x)/(1 - x))/2 atanh(x) = ln((1 + x)/(1 - x))/2
EXAMPLE EXAMPLE
> print atanh(.5,1e-5), atanh(.5,1e-10), atanh(.5,1e-15), atanh(.5,1e-20) ; print atanh(.5,1e-5), atanh(.5,1e-10), atanh(.5,1e-15), atanh(.5,1e-20)
.54931 .5493061443 .549306144334055 .5493061443340548457 .54931 .5493061443 .549306144334055 .5493061443340548457
LIMITS LIMITS
@@ -47,8 +47,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: atanh,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: atanh,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atanh,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atanh,v $
## ##
## Under source code control: 1994/03/19 01:40:27 ## Under source code control: 1994/03/19 01:40:27

View File

@@ -27,12 +27,12 @@ DESCRIPTION
be averaged. be averaged.
EXAMPLE EXAMPLE
> print avg(1,2,3,4,5), avg(list(1,2,3,4,5)), avg(1,2,list(3,4,5)) ; print avg(1,2,3,4,5), avg(list(1,2,3,4,5)), avg(1,2,list(3,4,5))
3 3 3 3 3 3
> mat x[2,2] = {1,2,3,4} ; mat x[2,2] = {1,2,3,4}
> mat y[2,2] = {1,2,4,8} ; mat y[2,2] = {1,2,4,8}
> avg(x,y) ; avg(x,y)
mat [2,2] (4 elements, 4 nonzero): mat [2,2] (4 elements, 4 nonzero):
[0,0] = 1 [0,0] = 1
@@ -65,8 +65,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: avg,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: avg,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/avg,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/avg,v $
## ##
## Under source code control: 1994/09/25 20:22:31 ## Under source code control: 1994/09/25 20:22:31

View File

@@ -60,13 +60,13 @@ DESCRIPTION
listed in the table above. listed in the table above.
EXAMPLE EXAMPLE
> base() ; base()
10 10
> base(8) ; base(8)
012 012
> print 10 ; print 10
012 012
LIMITS LIMITS
@@ -97,8 +97,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.5 $ ## @(#) $Revision: 29.6 $
## @(#) $Id: base,v 29.5 2002/12/29 09:17:54 chongo Exp $ ## @(#) $Id: base,v 29.6 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/base,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/base,v $
## ##
## Under source code control: 1994/09/30 00:09:39 ## Under source code control: 1994/09/30 00:09:39

View File

@@ -68,16 +68,16 @@ DESCRIPTION
listed in the table above. listed in the table above.
EXAMPLE EXAMPLE
> base2() ; base2()
0 0
> base2(8) ; base2(8)
0 /* 0 */ 0 /* 0 */
> print 10 ; print 10
10 /* 012 */ 10 /* 012 */
> base2(16), ; base2(16),
> 131072 ; 131072
131072 /* 0x20000 */ 131072 /* 0x20000 */
> 2345 ; 2345
2345 /* 0x929 */ 2345 /* 0x929 */
LIMITS LIMITS
@@ -109,8 +109,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 1.3 $ ## @(#) $Revision: 1.4 $
## @(#) $Id: base2,v 1.3 2002/12/29 09:17:54 chongo Exp $ ## @(#) $Id: base2,v 1.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/base2,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/base2,v $
## ##
## Under source code control: 2002/12/29 00:21:07 ## Under source code control: 2002/12/29 00:21:07

View File

@@ -28,8 +28,8 @@ DESCRIPTION
freebernoulli(). freebernoulli().
EXAMPLE EXAMPLE
> config("mode", "frac"),; ; config("mode", "frac"),;
> for (n = 0; n <= 6; n++) print bernoulli(n),; print; ; for (n = 0; n <= 6; n++) print bernoulli(n),; print;
1 -1/2 1/6 0 -1/30 0 1/42 1 -1/2 1/6 0 -1/30 0 1/42
LIMITS LIMITS
@@ -57,8 +57,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.5 $ ## @(#) $Revision: 29.6 $
## @(#) $Id: bernoulli,v 29.5 2002/07/10 11:47:04 chongo Exp $ ## @(#) $Id: bernoulli,v 29.6 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bernoulli,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bernoulli,v $
## ##
## Under source code control: 2000/07/13 01:33:00 ## Under source code control: 2000/07/13 01:33:00

View File

@@ -20,17 +20,17 @@ DESCRIPTION
return 1, otherwise return 0. return 1, otherwise return 0.
EXAMPLE EXAMPLE
> print bit(9,0), bit(9,1), bit(9,2), bit(9,3) ; print bit(9,0), bit(9,1), bit(9,2), bit(9,3)
1 0 0 1 1 0 0 1
> print bit(9,4), bit(0,0), bit(9,-1) ; print bit(9,4), bit(0,0), bit(9,-1)
0 0 0 0 0 0
> print bit(1.25, -2), bit(1.25, -1), bit(1.25, 0) ; print bit(1.25, -2), bit(1.25, -1), bit(1.25, 0)
1 0 1 1 0 1
> p = pi() ; p = pi()
> print bit(p, 1), bit(p, -2), bit(p, -3) ; print bit(p, 1), bit(p, -2), bit(p, -3)
1 0 1 1 0 1
LIMITS LIMITS
@@ -58,8 +58,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: bit,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: bit,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bit,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bit,v $
## ##
## Under source code control: 1994/10/21 02:21:30 ## Under source code control: 1994/10/21 02:21:30

View File

@@ -14,7 +14,7 @@ TYPES
DESCRIPTION DESCRIPTION
With only integer arguments, blk(len, chunk) attempts to With only integer arguments, blk(len, chunk) attempts to
allocate a block of memory consisting of N octets (unsigned 8-bit allocate a block of memory consisting of len octets (unsigned 8-bit
bytes). Allocation is always done in multiples of chunk bytes). Allocation is always done in multiples of chunk
octets, so the actual allocation size of len rounded up octets, so the actual allocation size of len rounded up
to the next multiple of chunk. to the next multiple of chunk.
@@ -26,7 +26,7 @@ DESCRIPTION
... , B[len-1], these all initially having zero value. ... , B[len-1], these all initially having zero value.
The octets B[i] for i >= len always have zero value. If B[i] with The octets B[i] for i >= len always have zero value. If B[i] with
some i >= len is referenced, len is increased by 1. For example: some i >= len is referenced, size(B) is increased to i + 1. For example:
B[i] = x B[i] = x
@@ -56,7 +56,7 @@ DESCRIPTION
will append one octet to B and increment size(B). will append one octet to B and increment size(B).
The builtin test(B) returns 1 or 0 according as at least one octet The builtin test(B) returns 1 or 0 according as at least one octet
is zero or all octets are zero. If B1 and B2 are blocks, they are is nonzero or all octets are zero. If B1 and B2 are blocks, they are
considered equal (B1 == B2) if they have the same length and the considered equal (B1 == B2) if they have the same length and the
same data, i.e. B1[i] == B2[i] for 0 <= i < len. Chunksizes same data, i.e. B1[i] == B2[i] for 0 <= i < len. Chunksizes
and maxsizes are ignored. and maxsizes are ignored.
@@ -107,7 +107,7 @@ DESCRIPTION
will give a second variable B referring to the same block as A. will give a second variable B referring to the same block as A.
Either A[i] = x or B[i] = x may then be used to assign a value Either A[i] = x or B[i] = x may then be used to assign a value
to an octet in the book. Its length or chunksize may be changed by to an octet in the block. Its length or chunksize may be changed by
instructions like: instructions like:
blk(A, len, chunk); blk(A, len, chunk);
@@ -154,55 +154,55 @@ DESCRIPTION
EXAMPLE EXAMPLE
> B = blk(15,10) ; B = blk(15,10)
> B[7] = 0xff ; B[7] = 0xff
> B ; B
chunksize = 10, maxsize = 20, datalen = 15 chunksize = 10, maxsize = 20, datalen = 15
00000000000000ff00000000000000 00000000000000ff00000000000000
> B[18] = 127 ; B[18] = 127
> B ; B
chunksize = 10, maxsize = 20, datalen = 18 chunksize = 10, maxsize = 20, datalen = 18
00000000000000ff0000000000000000007f 00000000000000ff0000000000000000007f
> B[20] = 2 ; B[20] = 2
Index out of bounds for block Index out of bounds for block
> print size(B), sizeof(B) ; print size(B), sizeof(B)
18 20 18 20
> B = blk(B, 100, 20) ; B = blk(B, 100, 20)
> B ; B
chunksize = 20, maxsize = 120, datalen = 100 chunksize = 20, maxsize = 120, datalen = 100
00000000000000ff0000000000000000007f000000000000000000000000... 00000000000000ff0000000000000000007f000000000000000000000000...
> C = blk(B, 10} = {1,2,3} ; C = blk(B, 10} = {1,2,3}
> C ; C
chunksize = 20, maxsize = 20, datalen = 10 chunksize = 20, maxsize = 20, datalen = 10
01020300000000ff0000 01020300000000ff0000
> A1 = blk("alpha") ; A1 = blk("alpha")
> A1 ; A1
block 0: alpha block 0: alpha
chunksize = 256, maxsize = 256, datalen = 0 chunksize = 256, maxsize = 256, datalen = 0
> A1[7] = 0xff ; A1[7] = 0xff
> A2 = A1 ; A2 = A1
> A2[17] = 127 ; A2[17] = 127
> A1 ; A1
block 0: alpha block 0: alpha
chunksize = 256, maxsize = 256, datalen = 18 chunksize = 256, maxsize = 256, datalen = 18
00000000000000ff0000000000000000007f 00000000000000ff0000000000000000007f
> A1 = blk(A1, 1000) ; A1 = blk(A1, 1000)
> A1 ; A1
block 0: alpha block 0: alpha
chunksize = 256, maxsize = 1024, datalen = 1000 chunksize = 256, maxsize = 1024, datalen = 1000
00000000000000ff0000000000000000007f000000000000000000000000... 00000000000000ff0000000000000000007f000000000000000000000000...
> A1 = blk(A1, , 16) ; A1 = blk(A1, , 16)
> A1 ; A1
block 0: alpha block 0: alpha
chunksize = 16, maxsize = 1008, datalen = 1000 chunksize = 16, maxsize = 1008, datalen = 1000
00000000000000ff0000000000000000007f000000000000000000000000... 00000000000000ff0000000000000000007f000000000000000000000000...
@@ -234,8 +234,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.3 $ ## @(#) $Revision: 29.4 $
## @(#) $Id: blk,v 29.3 2002/07/10 11:47:04 chongo Exp $ ## @(#) $Id: blk,v 29.4 2006/05/07 07:16:42 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blk,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blk,v $
## ##
## Under source code control: 1997/04/05 13:07:13 ## Under source code control: 1997/04/05 13:07:13

View File

@@ -108,74 +108,74 @@ DESCRIPTION
EXAMPLE EXAMPLE
> A = blk() = {1,2,3,4} ; A = blk() = {1,2,3,4}
> B = blk() ; B = blk()
> blkcpy(B,A) ; blkcpy(B,A)
> B ; B
chunksize = 256, maxsize = 256, datalen = 4 chunksize = 256, maxsize = 256, datalen = 4
01020304 01020304
> >
> blkcpy(B,A) ; blkcpy(B,A)
> B ; B
chunksize = 256, maxsize = 256, datalen = 8 chunksize = 256, maxsize = 256, datalen = 8
0102030401020304 0102030401020304
> blkcpy(B, A, 2, 10) ; blkcpy(B, A, 2, 10)
> B ; B
chunksize = 256, maxsize = 256, datalen = 12 chunksize = 256, maxsize = 256, datalen = 12
010203040102030400000102 010203040102030400000102
> blkcpy(B,32767) ; blkcpy(B,32767)
> B ; B
chunksize = 256, maxsize = 256, datalen = 16 chunksize = 256, maxsize = 256, datalen = 16
010203040102030400000102ff7f0000 010203040102030400000102ff7f0000
> mat M[2,2] ; mat M[2,2]
> blkcpy(M, A) ; blkcpy(M, A)
> M ; M
mat [2,2] (4 elements, 4 nonzero): mat [2,2] (4 elements, 4 nonzero):
[0,0] = 1 [0,0] = 1
[0,1] = 2 [0,1] = 2
[1,0] = 3 [1,0] = 3
[1,1] = 4 [1,1] = 4
> blkcpy(M, A, 2, 2) ; blkcpy(M, A, 2, 2)
> M ; M
mat [2,2] (4 elements, 4 nonzero): mat [2,2] (4 elements, 4 nonzero):
[0,0] = 1 [0,0] = 1
[0,1] = 2 [0,1] = 2
[1,0] = 1 [1,0] = 1
[1,1] = 2 [1,1] = 2
> A = blk() = {1,2,3,4} ; A = blk() = {1,2,3,4}
> B = blk() ; B = blk()
> copy(A,B) ; copy(A,B)
> B ; B
chunksize = 256, maxsize = 256, datalen = 4 chunksize = 256, maxsize = 256, datalen = 4
01020304 01020304
> copy(A,B) ; copy(A,B)
> B ; B
chunksize = 256, maxsize = 256, datalen = 8 chunksize = 256, maxsize = 256, datalen = 8
0102030401020304 0102030401020304
> copy(A,B,1,2) ; copy(A,B,1,2)
> B ; B
chunksize = 256, maxsize = 256, datalen = 10 chunksize = 256, maxsize = 256, datalen = 10
01020304010203040203 01020304010203040203
> mat M[2,2] ; mat M[2,2]
> copy(A,M) ; copy(A,M)
> M ; M
mat [2,2] (4 elements, 4 nonzero): mat [2,2] (4 elements, 4 nonzero):
[0,0] = 1 [0,0] = 1
[0,1] = 2 [0,1] = 2
[1,0] = 3 [1,0] = 3
[1,1] = 4 [1,1] = 4
> copy(A,M,2) ; copy(A,M,2)
> M ; M
mat [2,2] (4 elements, 4 nonzero): mat [2,2] (4 elements, 4 nonzero):
[0,0] = 3 [0,0] = 3
[0,1] = 4 [0,1] = 4
[1,0] = 3 [1,0] = 3
[1,1] = 4 [1,1] = 4
> copy(A,M,0,2,2) ; copy(A,M,0,2,2)
> M ; M
mat [2,2] (4 elements, 4 nonzero): mat [2,2] (4 elements, 4 nonzero):
[0,0] = 3 [0,0] = 3
[0,1] = 4 [0,1] = 4
@@ -207,8 +207,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: blkcpy,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: blkcpy,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blkcpy,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blkcpy,v $
## ##
## Under source code control: 1997/04/05 14:08:50 ## Under source code control: 1997/04/05 14:08:50

View File

@@ -23,27 +23,27 @@ DESCRIPTION
EXAMPLE EXAMPLE
> B1 = blk("foo") ; B1 = blk("foo")
> B2 = blk("Second block") ; B2 = blk("Second block")
show blocks show blocks
id name id name
---- ----- ---- -----
0 foo 0 foo
1 Second block 1 Second block
> blkfree(B1) ; blkfree(B1)
> show blocks ; show blocks
id name id name
---- ----- ---- -----
1 Second block 1 Second block
> B1 ; B1
block 0: foo block 0: foo
chunksize = 256, maxsize = 0, datalen = 0 chunksize = 256, maxsize = 0, datalen = 0
NULL NULL
> blk(B1); B[7] = 5 ; blk(B1); B[7] = 5
> B1 ; B1
block 0: foo block 0: foo
chunksize = 256, maxsize = 256, datalen = 8 chunksize = 256, maxsize = 256, datalen = 8
0000000000000005 0000000000000005
@@ -73,8 +73,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: blkfree,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: blkfree,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blkfree,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blkfree,v $
## ##
## Under source code control: 1997/04/05 13:07:13 ## Under source code control: 1997/04/05 13:07:13

View File

@@ -20,17 +20,17 @@ DESCRIPTION
EXAMPLE EXAMPLE
> A = blk("alpha") ; A = blk("alpha")
> B = blk("beta") = {1,2,3} ; B = blk("beta") = {1,2,3}
> blocks() ; blocks()
2 2
> blocks(1) ; blocks(1)
block 1: beta block 1: beta
chunksize = 256, maxsize = 256, datalen = 3 chunksize = 256, maxsize = 256, datalen = 3
010203 010203
> blocks(2) ; blocks(2)
Error 10211 Error 10211
> strerror() ; strerror()
"Non-allocated index number for blocks" "Non-allocated index number for blocks"
LIMITS LIMITS
@@ -58,8 +58,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.3 $ ## @(#) $Revision: 29.4 $
## @(#) $Id: blocks,v 29.3 2002/07/10 11:47:04 chongo Exp $ ## @(#) $Id: blocks,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blocks,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blocks,v $
## ##
## Under source code control: 1997/04/05 13:07:13 ## Under source code control: 1997/04/05 13:07:13

View File

@@ -66,38 +66,38 @@ DESCRIPTION
variables, so their values are not changed by the call. variables, so their values are not changed by the call.
EXAMPLES EXAMPLES
> a = 7/32, b = -7/32 ; a = 7/32, b = -7/32
> print a, b ; print a, b
.21875 -.21875 .21875 -.21875
> print round(a,3,0), round(a,3,1), round(a,3,2), print round(a,3,3) ; print round(a,3,0), round(a,3,1), round(a,3,2), print round(a,3,3)
.218, .219, .218, .219 .218, .219, .218, .219
> print round(b,3,0), round(b,3,1), round(b,3,2), print round(b,3,3) ; print round(b,3,0), round(b,3,1), round(b,3,2), print round(b,3,3)
-.219, -.218, -.218, -.219 -.219, -.218, -.218, -.219
> print round(a,3,16), round(a,3,17), round(a,3,18), print round(a,3,19) ; print round(a,3,16), round(a,3,17), round(a,3,18), print round(a,3,19)
.2188 .2188 .2188 .2188 .2188 .2188 .2188 .2188
> print round(a,4,16), round(a,4,17), round(a,4,18), print round(a,4,19) ; print round(a,4,16), round(a,4,17), round(a,4,18), print round(a,4,19)
.2187 .2188 .2187 .2188 .2187 .2188 .2187 .2188
> print round(a,2,8), round(a,3,8), round(a,4,8), round(a,5,8) ; print round(a,2,8), round(a,3,8), round(a,4,8), round(a,5,8)
.22 .218 .2188 .21875 .22 .218 .2188 .21875
> print round(a,2,24), round(a,3,24), round(a,4,24), round(a,5,24) ; print round(a,2,24), round(a,3,24), round(a,4,24), round(a,5,24)
.22 .219 .2188 .21875 .22 .219 .2188 .21875
> c = 21875 ; c = 21875
> print round(c,-2,0), round(c,-2,1), round(c,-3,0), round(c,-3,16) ; print round(c,-2,0), round(c,-2,1), round(c,-3,0), round(c,-3,16)
21800 21900 21000 22000 21800 21900 21000 22000
> print round(c,2,32), round(c,2,33), round(c,2,56), round(c,4,56) ; print round(c,2,32), round(c,2,33), round(c,2,56), round(c,4,56)
21000 22000 22000 21880 21000 22000 22000 21880
> A = list(1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8) ; A = list(1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8)
> print round(A,2,24) ; print round(A,2,24)
list(7 elements, 7 nonzero): list(7 elements, 7 nonzero):
[[0]] = .12 [[0]] = .12
@@ -138,8 +138,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: bround,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: bround,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bround,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bround,v $
## ##
## Under source code control: 1994/09/30 00:22:35 ## Under source code control: 1994/09/30 00:22:35

View File

@@ -22,16 +22,16 @@ DESCRIPTION
int(x). int(x).
EXAMPLE EXAMPLE
> print btrunc(pi()), btrunc(pi(), 10) ; print btrunc(pi()), btrunc(pi(), 10)
3 3.140625 3 3.140625
> print btrunc(3.3), btrunc(3.7), btrunc(3.3, 2), btrunc(3.7, 2) ; print btrunc(3.3), btrunc(3.7), btrunc(3.3, 2), btrunc(3.7, 2)
3 3 3.25 3.5 3 3 3.25 3.5
> print btrunc(-3.3), btrunc(-3.7), btrunc(-3.3, 2), btrunc(-3.7, 2) ; print btrunc(-3.3), btrunc(-3.7), btrunc(-3.3, 2), btrunc(-3.7, 2)
-3 -3 -3.25 -3.5 -3 -3 -3.25 -3.5
> print btrunc(55.123, -4), btrunc(-55.123, -4) ; print btrunc(55.123, -4), btrunc(-55.123, -4)
48 -48 48 -48
LIMITS LIMITS
@@ -59,8 +59,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: btrunc,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: btrunc,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/btrunc,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/btrunc,v $
## ##
## Under source code control: 1994/09/30 00:44:27 ## Under source code control: 1994/09/30 00:44:27

View File

@@ -18,7 +18,7 @@ DESCRIPTION
> !stty echo -cbreak > !stty echo -cbreak
EXAMPLE EXAMPLE
> calc_tty(); ; calc_tty();
LIBRARY LIBRARY
none none
@@ -42,8 +42,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.1 $ ## @(#) $Revision: 29.2 $
## @(#) $Id: calc_tty,v 29.1 2000/12/14 10:31:45 chongo Exp $ ## @(#) $Id: calc_tty,v 29.2 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/calc_tty,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/calc_tty,v $
## ##
## Under source code control: 2000/12/14 01:33:00 ## Under source code control: 2000/12/14 01:33:00

View File

@@ -25,7 +25,7 @@ DESCRIPTION
from (x,y) = (0,0) to (x,y) = (n,n) for which always y <= x. from (x,y) = (0,0) to (x,y) = (n,n) for which always y <= x.
EXAMPLE EXAMPLE
> print catalan(2), catalan(3), catalan(4), catalan(20) ; print catalan(2), catalan(3), catalan(4), catalan(20)
2 5 14 6564120420 2 5 14 6564120420
LIMITS LIMITS
@@ -53,8 +53,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: catalan,v 29.2 2000/12/17 12:27:58 chongo Exp $ ## @(#) $Id: catalan,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/catalan,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/catalan,v $
## ##
## Under source code control: 2000/12/14 01:33:00 ## Under source code control: 2000/12/14 01:33:00

View File

@@ -20,7 +20,7 @@ DESCRIPTION
by ceil(t). by ceil(t).
EXAMPLE EXAMPLE
> print ceil(27), ceil(1.23), ceil(-4.56), ceil(7.8 - 9.1i) ; print ceil(27), ceil(1.23), ceil(-4.56), ceil(7.8 - 9.1i)
27 2 -4 8-9i 27 2 -4 8-9i
LIMITS LIMITS
@@ -48,8 +48,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: ceil,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: ceil,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/ceil,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/ceil,v $
## ##
## Under source code control: 1994/09/30 01:12:01 ## Under source code control: 1994/09/30 01:12:01

View File

@@ -66,17 +66,17 @@ DESCRIPTION
exceeding n is 1/cfappr(1/x, n, 16). exceeding n is 1/cfappr(1/x, n, 16).
EXAMPLE EXAMPLE
> c = config("mode", "frac") ; c = config("mode", "frac")
> x = 43/30; u = cfappr(x, 10, 0); v = cfappr(x, 10, 1); ; x = 43/30; u = cfappr(x, 10, 0); v = cfappr(x, 10, 1);
> print u, v, x - u, v - x, v - u, cfappr(x, 10, 16) ; print u, v, x - u, v - x, v - u, cfappr(x, 10, 16)
10/7 13/9 1/210 1/90 1/63 10/7 10/7 13/9 1/210 1/90 1/63 10/7
> pi = pi(1e-10) ; pi = pi(1e-10)
> print cfappr(pi, 100, 16), cfappr(pi, .01, 16), cfappr(pi, 1e-6, 16) ; print cfappr(pi, 100, 16), cfappr(pi, .01, 16), cfappr(pi, 1e-6, 16)
311/99 22/7 355/113 311/99 22/7 355/113
> x = 17/12; u = cfappr(x,4,0); v = cfappr(x,4,1); ; x = 17/12; u = cfappr(x,4,0); v = cfappr(x,4,1);
> print u, v, x - u, v - x, cfappr(x,4,16) ; print u, v, x - u, v - x, cfappr(x,4,16)
4/3 3/2 1/12 1/12 3/2 4/3 3/2 1/12 1/12 3/2
LIMITS LIMITS
@@ -104,8 +104,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: cfappr,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: cfappr,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cfappr,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cfappr,v $
## ##
## Under source code control: 1994/09/30 01:23:59 ## Under source code control: 1994/09/30 01:23:59

View File

@@ -95,13 +95,13 @@ DESCRIPTION
cfsim(1/x, rnd) = 1/cfsim(x, rnd). cfsim(1/x, rnd) = 1/cfsim(x, rnd).
EXAMPLE EXAMPLE
> c = config("mode", "frac"); ; c = config("mode", "frac");
> print cfsim(43/30, 0), cfsim(43/30, 1), cfsim(43/30, 8), cfsim(43/30,16) ; print cfsim(43/30, 0), cfsim(43/30, 1), cfsim(43/30, 8), cfsim(43/30,16)
10/7 33/23 10/7 33/23 10/7 33/23 10/7 33/23
> x = pi(1e-20); c = config("mode", "frac"); ; x = pi(1e-20); c = config("mode", "frac");
> while (!isint(x)) {x = cfsim(x,8); if (den(x) < 1e6) print x,:;} ; while (!isint(x)) {x = cfsim(x,8); if (den(x) < 1e6) print x,:;}
1146408/364913 312689/99532 104348/33215 355/113 22/7 3 1146408/364913 312689/99532 104348/33215 355/113 22/7 3
LIMITS LIMITS
@@ -129,8 +129,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: cfsim,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: cfsim,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cfsim,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cfsim,v $
## ##
## Under source code control: 1994/09/30 01:29:45 ## Under source code control: 1994/09/30 01:29:45

View File

@@ -14,7 +14,7 @@ DESCRIPTION
the same value as j. For j = 0, returns the null string "". the same value as j. For j = 0, returns the null string "".
EXAMPLE EXAMPLE
> print char(0102), char(0x6f), char(119), char(0145), char(0x6e) ; print char(0102), char(0x6f), char(119), char(0145), char(0x6e)
B o w e n B o w e n
LIMITS LIMITS
@@ -42,8 +42,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: char,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: char,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/char,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/char,v $
## ##
## Under source code control: 1994/09/30 01:45:45 ## Under source code control: 1994/09/30 01:45:45

View File

@@ -92,16 +92,16 @@ DESCRIPTION
for example, cmp(2, "2"), returns the null value. for example, cmp(2, "2"), returns the null value.
EXAMPLE EXAMPLE
> print cmp(3,4), cmp(4,3), cmp(4,4), cmp("a","b"), cmp("abcd","abc") ; print cmp(3,4), cmp(4,3), cmp(4,4), cmp("a","b"), cmp("abcd","abc")
-1 1 0 -1 1 -1 1 0 -1 1
> print cmp(3,4i), cmp(4,4i), cmp(5,4i), cmp(-5,4i), cmp(-4i,5), cmp(-4i,-5) ; print cmp(3,4i), cmp(4,4i), cmp(5,4i), cmp(-5,4i), cmp(-4i,5), cmp(-4i,-5)
1-1i 1-1i 1-1i -1-1i -1-1i 1-1i 1-1i 1-1i 1-1i -1-1i -1-1i 1-1i
> print cmp(3i,4i), cmp(4i,4i), cmp(5i,4i), cmp(3+4i,5), cmp(3+4i,-5) ; print cmp(3i,4i), cmp(4i,4i), cmp(5i,4i), cmp(3+4i,5), cmp(3+4i,-5)
-1i 0 1i -1+1i 1+1i -1i 0 1i -1+1i 1+1i
> print cmp(3+4i,3+4i), cmp(3+4i,3-4i), cmp(3+4i,2+3i), cmp(3+4i,-4-5i) ; print cmp(3+4i,3+4i), cmp(3+4i,3-4i), cmp(3+4i,2+3i), cmp(3+4i,-4-5i)
0 1i 1+1i 1+1i 0 1i 1+1i 1+1i
LIMITS LIMITS
@@ -130,8 +130,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: cmp,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: cmp,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cmp,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cmp,v $
## ##
## Under source code control: 1994/10/20 02:52:30 ## Under source code control: 1994/10/20 02:52:30

View File

@@ -21,10 +21,10 @@ DESCRIPTION
may be chosen from x items ignoring the order in which they are chosen. may be chosen from x items ignoring the order in which they are chosen.
EXAMPLE EXAMPLE
> print comb(7,3), comb(7,4), comb(7,5), comb(3,0), comb(0,0) ; print comb(7,3), comb(7,4), comb(7,5), comb(3,0), comb(0,0)
35 35 21 1 1 35 35 21 1 1
> print comb(2^31+1,2^31-1) ; print comb(2^31+1,2^31-1)
2305843010287435776 2305843010287435776
LIMITS LIMITS
@@ -54,8 +54,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: comb,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: comb,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/comb,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/comb,v $
## ##
## Under source code control: 1994/10/20 04:03:02 ## Under source code control: 1994/10/20 04:03:02

View File

@@ -18,6 +18,7 @@ Command sequence
----------------- -----------------
define function(params) { body } define function(params) { body }
define function(params) = expression define function(params) = expression
This first form defines a full function which can consist This first form defines a full function which can consist
of declarations followed by many statements which implement of declarations followed by many statements which implement
the function. the function.
@@ -42,16 +43,30 @@ Command sequence
read calc commands read calc commands
------------------ ------------------
read $var
read -once $var
read filename read filename
read -once filename read -once filename
This reads definitions from the specified calc resource filename. This reads definitions from the specified calc resource filename.
The name can be quoted if desired. The calculator uses the In the 1st and 2nd forms, if var is a global variable string
CALCPATH environment variable to search through the specified value, then the value of that variable is used as a filename.
directories for the filename, similarly to the use of the
PATH environment variable. If CALCPATH is not defined, The following is equivalent to read lucas.cal or read "lucas.cal":
then a default path which is usually ":/usr/local/lib/calc"
is used. global var = "lucas.cal";
read $var;
In the 3rd or 4th forms, the filename argument is treated
as a literal string, not a variable. In these forms, the
name can be quoted if desired.
The calculator uses the CALCPATH environment variable to
search through the specified directories for the filename,
similarly to the use of the PATH environment variable.
If CALCPATH is not defined, then a default path which is
usually ":/usr/local/lib/calc" is used.
The ".cal" extension is defaulted for input files, so that The ".cal" extension is defaulted for input files, so that
if "filename" is not found, then "filename.cal" is then if "filename" is not found, then "filename.cal" is then
@@ -76,7 +91,9 @@ Command sequence
write calc commands write calc commands
------------------- -------------------
write $var
write filename write filename
This writes the values of all global variables to the This writes the values of all global variables to the
specified filename, in such a way that the file can be specified filename, in such a way that the file can be
later read in order to recreate the variable values. later read in order to recreate the variable values.
@@ -85,6 +102,19 @@ Command sequence
matrices, lists, and objects are not saved. Function matrices, lists, and objects are not saved. Function
definitions are also not saved. definitions are also not saved.
In the 1st form, if var is a global variable string
value, then the value of that variable is used as a filename.
The following is equivalent to write dump.out or
write "dump.out":
global var = "dump.out";
write $var;
In the 2nd form, the filename argument is treated as a literal
string, not a variable. In this form, the name can be quoted
if desired.
If the -m mode disallows opening of files for writing, If the -m mode disallows opening of files for writing,
this command will be disabled. this command will be disabled.
@@ -95,6 +125,7 @@ Command sequence
quit string quit string
exit exit
exit string exit string
The action of these commands depends on where they are used. The action of these commands depends on where they are used.
At the interactive level, they will cause calc it edit. At the interactive level, they will cause calc it edit.
This is the normal way to leave the calculator. In any This is the normal way to leave the calculator. In any
@@ -131,6 +162,7 @@ Command sequence
----- -----
abort abort
abort string abort string
This command behaves like QUIT except that it will attempt This command behaves like QUIT except that it will attempt
to return to the interactive level if permitted, otherwise to return to the interactive level if permitted, otherwise
calc exit. calc exit.
@@ -143,6 +175,7 @@ Command sequence
------------------------ ------------------------
cd cd
cd dir cd dir
Change the current directory to 'dir'. If 'dir' is ommitted, Change the current directory to 'dir'. If 'dir' is ommitted,
change the current directory to the home directory, if $HOME change the current directory to the home directory, if $HOME
is set in the environment. is set in the environment.
@@ -151,6 +184,7 @@ Command sequence
show information show information
---------------- ----------------
show item show item
This command displays some information where 'item' is This command displays some information where 'item' is
one of the following: one of the following:
@@ -185,11 +219,24 @@ Command sequence
calc help calc help
--------- ---------
help help $var
help name help name
This displays a help related to 'name' or general This displays a help related to 'name' or general
help of none is given. help of none is given.
In the 1st form, if var is a global variable string
value, then the value of that variable is used as a name.
The following is equivalent to help command or help "command":
global var = "command";
help $var;
In the 2nd form, the filename argument is treated as a literal
string, not a variable. In this form, the name can be quoted
if desired.
=-= =-=
@@ -323,8 +370,8 @@ Command sequence
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: command,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: command,v 29.3 2006/05/20 10:01:33 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/command,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/command,v $
## ##
## Under source code control: 1991/07/21 04:37:17 ## Under source code control: 1991/07/21 04:37:17

View File

@@ -50,6 +50,8 @@ Configuration parameters
"basename" Read-only basename of the program value "basename" Read-only basename of the program value
"windows" Read-only indicator of MS windows "windows" Read-only indicator of MS windows
"cygwin" TRUE=>calc compiled with cygwin, Read-only "cygwin" TRUE=>calc compiled with cygwin, Read-only
"compile_custom" TRUE=>calc was compiled with custom functions
"allow_custom" TRUE=>custom functions are enabled
"version" Read-only calc version "version" Read-only calc version
The "all" config value allows one to save/restore the configuration The "all" config value allows one to save/restore the configuration
@@ -553,7 +555,7 @@ Detailed config descriptions
is displayed. is displayed.
2 Show func will display more information about a functions 2 Show func will display more information about a functions
arguments as well as more argument sdummary information. arguments and argument summary information.
3 During execution, allow calc standard resource files 3 During execution, allow calc standard resource files
to output additional debugging information. to output additional debugging information.
@@ -712,6 +714,40 @@ Detailed config descriptions
=-= =-=
config("compile_custom") <== NOTE: This is a read-only config value
Returns TRUE if you calc was compiled with -DCUSTOM. By default,
the calc Makefile uses ALLOW_CUSTOM= -DCUSTOM so by default
config("compile_custom") is TRUE. If, however, calc is compiled
without -DCUSTOM, then config("compile_custom") will be FALSE.
The config("compile_custom") value is only affected by compile
flags. The calc -D runtime command line option does not change
the config("compile_custom") value.
See also config("allow_custom").
This config parameter is read-only and cannot be set.
=-=
config("allow_custom") <== NOTE: This is a read-only config value
Returns TRUE if you custom functions are enabled. To allow the use
of custom functions, calc must be compiled with -DCUSTOM (which it
is by default) AND calc run be run with the -D runtime command line
option (which it is not by default).
If config("allow_custom") is TRUE, then custom functions are allowed.
If config("allow_custom") is FALSE, then custom functions are not
allowed.
See also config("compile_custom").
This config parameter is read-only and cannot be set.
=-=
config("version") <== NOTE: This is a read-only config value config("version") <== NOTE: This is a read-only config value
The version string of the calc program can be obtained by: The version string of the calc program can be obtained by:
@@ -736,8 +772,8 @@ Detailed config descriptions
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.8 $ ## @(#) $Revision: 29.10 $
## @(#) $Id: config,v 29.8 2004/02/23 05:59:22 chongo Exp $ ## @(#) $Id: config,v 29.10 2004/07/27 23:45:52 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/config,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/config,v $
## ##
## Under source code control: 1991/07/21 04:37:17 ## Under source code control: 1991/07/21 04:37:17

View File

@@ -28,7 +28,7 @@ DESCRIPTION
conjugate of the corresponding component of a. conjugate of the corresponding component of a.
EXAMPLE EXAMPLE
> print conj(3), conj(3 + 4i) ; print conj(3), conj(3 + 4i)
3 3-4i 3 3-4i
LIMITS LIMITS
@@ -56,8 +56,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: conj,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: conj,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/conj,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/conj,v $
## ##
## Under source code control: 1995/10/03 10:40:01 ## Under source code control: 1995/10/03 10:40:01

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