Compare commits

..

8 Commits

Author SHA1 Message Date
Landon Curt Noll
87570b56fe Release calc version 2.12.0.5 2017-05-21 15:38:47 -07:00
Landon Curt Noll
afe37ec851 Release calc version 2.12.0.4 2017-05-21 15:38:46 -07:00
Landon Curt Noll
bd3086138b Release calc version 2.12.0.3 2017-05-21 15:38:46 -07:00
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
381 changed files with 13555 additions and 8026 deletions

158
BUGS
View File

@@ -68,58 +68,47 @@ of a context diff patch).
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
us know! See the above for details on how to report and were to
EMail your bug reports and hopefully patches to fix them.
Problems with known work-a-rounds:
=-=
* The gcc as shipped with Redhat 7 perhaps other Linux distributions
has a bug causes calc to dump core on startup when calc is:
mis-features in calc:
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,
READLINE_LIB and READLINE_INCLUDE in the Makefile)
will write an extra NUL octet to the file. Where as:
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:
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
Problems with old systems that have known work-a-rounds:
* There is a bug in gcc-2.95 that causes calc, when compiled with -O2,
to fail the regression test. The work-a-round is to compile with -O
@@ -170,59 +159,6 @@ Problems with known work-a-rounds:
if (n < 0) n = 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
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
@@ -238,41 +174,7 @@ Problems with known work-a-rounds:
CCWARN="-DFORCE_STDC -w"
DEBUG="-fast -xarch=v9"
* Under BSDI v4, the warnings of the form:
/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
## Copyright (C) 1999-2006 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
@@ -288,8 +190,8 @@ Problems with known work-a-rounds:
## 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.18 $
## @(#) $Id: BUGS,v 29.18 2004/07/26 05:56:40 chongo Exp $
## @(#) $Revision: 29.24 $
## @(#) $Id: BUGS,v 29.24 2006/05/21 07:54:13 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/BUGS,v $
##
## Under source code control: 1994/03/18 14:06:13

687
CHANGES
View File

@@ -1,4 +1,422 @@
The following are the changes from calc version 2.11.10 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.
Added the reading of more calc resource files to the cal/regress.cal
regression test.
The issq() test had a slight performance boost. A minor note
was added to the help/issq file.
Improved the documentation of the mul2, sq2, pow2, and redc2 config
parameters in help/config.
Added config("baseb"), a read-only configuration value to return
the number of bits in the fundamental base in which calculations
are performed. This is a read-only configuration value.
Calc now permits such as:
++*p-- ++*----*++p----
where p is an lvalue; successful evaluation of course require the
successive operations to be performed to have operands of appropriate
types; e.g. in *A, A is usually an lvalue whose current value is a
pointer. ++ and -- act on lvalues. In the above examples there are
implied parentheses from the beginning to immediately after p. If
there are no pre ++ or -- operations, as in
**p++
the implied parentheses are from immediately before p to the end.
Improved the error message when && is used as a prefix operator.
Changed the help/config file to read like a builtin function
help file.
One can no longer set to 1, or to a value < 0, the config()
parameters: "mul2", "sq2", "pow2", and "redc2". These values
in the past would result in improper configuration of internal
calc algorithms. Changed cal/test4100.cal to use the minimal
value of 2 for "pow2", and "redc2".
Changed the default values for the following config() parameters:
config("mul2") == 1780
config("sq2") == 3388
config("pow2") == 176
These values were determined established on a 1.8GHz AMD 32-bit
CPU of ~3406 BogoMIPS by the new resource file:
cal/alg_config.cal
Regarding the alg_config.cal resource file:
The best_mul2() function returns the optimal value of config("mul2").
The best_sq2() function returns the optimal value of config("sq2").
The best_pow2() function returns the optimal value of config("pow2").
The other functions are just support functions.
By design, best_mul2(), best_sq2(), and best_pow2() take a few
minutes to run. These functions increase the number of times a
given computational loop is executed until a minimum amount of CPU
time is consumed. To watch these functions progress, one can set
the config("user_debug") value.
Here is a suggested way to use the alg_config.cal resource file:
; read alg_config
; config("user_debug",2),;
; best_mul2(); best_sq2(); best_pow2();
; best_mul2(); best_sq2(); best_pow2();
; best_mul2(); best_sq2(); best_pow2();
NOTE: It is perfectly normal for the optimal value returned
to differ slightly from run to run. Slight variations due to
inaccuracy in CPU timings will cause the best value returned to
differ slightly from run to run.
See "help resource" for more information on alg_config.cal.
Updated the "help variable" text to reflect the current calc
use of ` (backquote), * (star), and & (ampersand).
Removal of some restrictions on the use of the same identifier
for more than one of parameter, local, static or global variable.
For example, at command level, one could use:
for (local x = 0; x < 10; x++) print sqrt(x);
At the beginning of a statement, "(global A)" is a way of
indicating a reference to the variable A, whereas "global A"
would be taken as a declaration. Parentheses are not required in
"++global A" or "global A++" when "global" is used in this way.
The patch extends this "specifier" (or "qualifier") feature
to static variables, but such that "static A" refers only
to a static variable at the current file and function scope
levels. (If there is already a static variable A at the current
file and function levels, a declaration statement "static A"
would end the scope of that variable and define a new static
variable with identifier A. A "global A" declaration is more
drastic in that it ends the scope of any static variable A at
the same or higher scope levels.)
Unlike a static declaration in which an "initialization" occurs at
most once, in the specifier case, "static A = expr" is simply an
assignment which may be repeated any number of times. An example
of its use is:
define np() = static a = nextprime(a);
For n not too large, the n-th call to this function will
return the n-th prime. The variable a here will be private to
the function.
Because one can use "global", "local" or "static" to specify a
type of variable, there seems little point in restricting the
ways identifiers that can be used in more than one of these
or as parameters. Obviously, introducing A as a local variable
when it is being used as a parameter can lead to confusion and a
warning is appropriate, but if it is to be used only occasionally,
it might be convenient to be able to refer to it as "local A"
rather than introducing another identifier. While it may be
silly to use the same identifier for both a parameter and local
variable, it should not be illegal.
The provision of warnings for possibly questionable programming in
function definitions.
Added config("redecl_warn", boolean) to control if calc issues
warnings about variables being declared. The config("redecl_warn")
value is TRUE by default.
Added config("dupvar_warn", boolean) to control if calc issues
warnings about when variable names collide. Examples of variable name
collisions include when:
* both local and static variables have the same name
* both local and global variables have the same name
* both function parameter and local variables have the same name
* both function parameter and global variables have the same name
The config("dupvar_warn") value is TRUE by default.
Fix of a bug which causes some static variables not to be correctly
unscoped when their identifiers are used in a global declaration.
Change of "undefine" from a command-level keyword to statement level and
introduction of an "undefine static A" statement to end the scope of a
static variable A at the current file/function levels.
Change/restored the syntax rules for "for" and "while" loops to
recognize an unescaped newline in top-level command-level statements.
Updated help/avg, help/define, help/fprintf, help/gcd, help/hash,
help/hmean, help/lcm, help/max, help/min, help/null, help/poly,
help/printf, help/ssq, help/strcat, help/strprintf, help/sum,
help/xor.
Changed the definition of the function ssq() to enable list arguments
to be processed in the same way as in sum(). For example:
ssq(1,2, list(3,4,list(5,6)), list(), 7, 8)
returns the value of 1^2 + 2^2 + ... + 8^2 == 204.
Added the calc resource sumtimes.cal, to give the runtimes for
various ways of evaluating sums, sums of squares, etc, for large
lists and matrices. For example:
read sumtimes
doalltimes(1e6)
Calc now ignores carrage returns (\r), vertical tabs (\v), and
form feeds (\f) when token parsing. Thus users on Windoz systems
can write files using their \r\n format and users on non-Windoz
systems can read them without errors.
The quomod() builtin function now takes an optional 5th argument
which controls the rounding mode like config("quomod") does, but
only for that call. Now quomod() is in line with quo() and mod()
in that the final augument is an optional rounding mode.
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.
@@ -34,7 +452,7 @@ The following are the changes from calc version 2.11.10 to date:
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 to no warrent trying to support this deprecated mode.
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
@@ -69,7 +487,7 @@ The following are the changes from calc version 2.11.10 to date:
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 test our fix.
at vsnl dot net> for helping identify this problem and testing our fix.
Added custom function:
@@ -89,6 +507,9 @@ The following are the changes from calc version 2.11.10 to date:
that was reported for the PowerMac G5 2GHz MacOS 10.3 by
Guillaume VERGNAUD <vergnaud at via dot ecp dot fr>.
Fixed a number of pending issues with help files filling in
missing LIMITS, LINK LIBRARY, and SEE ALSO information,
The following are the changes from calc version 2.11.9 to 2.11.9.3:
@@ -467,7 +888,7 @@ The following are the changes from calc version 2.11.5t4.1 to 2.11.5t4.4:
For example when forming the calc rpm, the Makefile is called with
T=$RPM_BUILD_ROOT. If $T is empty, calc is installed under /.
Removed all echo_XXX rules except for echo_inst_files from lower
Removed all echo_XYZ rules except for echo_inst_files from lower
level makefile. The calc.spec will use a make install rule
with T=$RPM_BUILD_ROOT.
@@ -858,11 +1279,11 @@ The following are the changes from calc version 2.11.3t0 to 2.11.4:
files may be referred to in succession by separating their names
by whitespace. For example:
> read alpha beta gamma;
; read alpha beta gamma;
does essentially the same as:
> read alpha; read beta; read gamma;
; read alpha; read beta; read gamma;
This is convenient for commands like:
@@ -887,7 +1308,7 @@ The following are the changes from calc version 2.11.3t0 to 2.11.4:
multiple read statement, -once applies only to the next named file.
For example
> read -once alpha beta -once gamma;
; read -once alpha beta -once gamma;
will read alpha and gamma only if they have not already been read,
but in any case, will read beta.
@@ -895,7 +1316,7 @@ The following are the changes from calc version 2.11.3t0 to 2.11.4:
(8) A fault in the programming for the cd command has been corrected
so that specifying a directory by a string constant will work. E.g:
> cd "my work"
; cd "my work"
should work if the current directory has a directory with name "my work".
@@ -955,17 +1376,17 @@ The following are the changes from calc version 2.11.3t0 to 2.11.4:
(16) "global" and "local" may now be used in expressions. For example:
> for (local i = 0; i < 5; i++) print i^2;
; for (local i = 0; i < 5; i++) print i^2;
is now acceptable, as is:
> define f(x = global x) = (global x = x)^2;
; define f(x = global x) = (global x = x)^2;
which breaks wise programming rules and would probably better be handled
by something like:
> global x
> define f(t = x) = (x = t)^2;
; global x
; define f(t = x) = (x = t)^2;
Both definitions produce the same code for f. For non-null t, f(t)
returns t^2 and assigns the value of t to x; f() and f(t) with null t
@@ -983,11 +1404,11 @@ The following are the changes from calc version 2.11.3t0 to 2.11.4:
either 32 or 64-bit longs. In setting such components, the arguments
are now to less than 2^31. Before this change:
> config("mul2", 2^32 + 3)
; config("mul2", 2^32 + 3)
would be accepted on a 64-bit machine but result in the same as:
> config("mul2", 3)
; config("mul2", 3)
The following are the changes from calc version 2.11.2t0 to 2.11.2t1.0:
@@ -1226,9 +1647,9 @@ The following are the changes from calc version 2.11.0t10 to 2.11.0t11:
The power(a, b, epsilon) builtin will return a "too-large result"
if an estimate indicates that the result will have absolute value
> 2^2^30 * epsilon. Otherwise the evaluation will be attempted
but may fail due to shortage of memory or may require a long
runtime if the result will be very large.
that is > 2^2^30 * epsilon. Otherwise the evaluation will be
attempted but may fail due to shortage of memory or may require
a long runtime if the result will be very large.
Changes have been made to the algorithms used for some special
functions sinh(), cosh(), tanh(), sin(), cos(), etc., that make
@@ -2125,6 +2546,8 @@ The following are the changes from calc version 2.10.3t5.38 to 2.11.3t5.46:
into a single section.
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:
@@ -2262,10 +2685,10 @@ The following are the changes from calc version 2.10.3t5.34 to 2.10.3t5.37:
of links to the occurrence of that argument that is being referred to.
For example, supposing "abc" has not been used earlier:
> A = "abc"
> links(A)
; A = "abc"
; links(A)
2
> links(A)
; links(A)
1
The two links in the first call are to A and the current "oldvalue";
@@ -2560,11 +2983,11 @@ The following are the changes from calc version 2.10.3t5.34 to 2.10.3t5.37:
(30) Although it is not illegal, it seems pointless to use a comma operator
with a constant or simple variable as in
> 2 * 3,14159
; 2 * 3,14159
14159
> a = 4; b = 5;
> A = (a , b + 2);
> A
; a = 4; b = 5;
; A = (a , b + 2);
; A
7
I have added a few lines to addop.c so that when this occurs a
@@ -2595,27 +3018,27 @@ The following are the changes from calc version 2.10.3t5.34 to 2.10.3t5.37:
Here is a demo:
> global a;
>
> define f(x) {local i = x^2; a++;
>> if (x > 5) quit "Too large!"; return i;}
; global a;
;
; define f(x) {local i = x^2; a++;
;; if (x > 5) quit "Too large!"; return i;}
f() defined
> define g(x) = f(x) + f(2*x);
; define g(x) = f(x) + f(2*x);
g() defined
> g(2)
; g(2)
20
> g(3)
; g(3)
Too large!
"f": line 3
"g": line 0
"*": line 6
> eval("g(3)")
; eval("g(3)")
Too large!
"f": line 3
"g": line 0
"**": line 1
"*": line 7
> a
; a
6
(32) I've made several small changes like removing
@@ -2661,14 +3084,14 @@ The following are the changes from calc version 2.10.3t5.28 to 2.10.3t5.33:
a variable as in p = &var, and then *p in expressions has
the same effect as var. Here is a simple example of their use:
> define s(L) {local v=0; while (size(L)) v+= *pop(L);return v;}
; define s(L) {local v=0; while (size(L)) v+= *pop(L);return v;}
s() defined
> global a = 1, b = 2;
> L = list(&a, &b);
> print s(L)
; global a = 1, b = 2;
; L = list(&a, &b);
; print s(L)
3
> b = 3;
> print s(L)
; b = 3;
; print s(L)
4
Octet-pointers, number-pointers, and string-pointers in
@@ -2680,11 +3103,11 @@ The following are the changes from calc version 2.10.3t5.28 to 2.10.3t5.33:
Some arithmetic operations has been defined for corresponding
C operations. For example:
> A = mat[4];
> p = &A[0];
> *(p+2) == A[2]
> ++p
> *p == A[1]
; A = mat[4];
; p = &A[0];
; *(p+2) == A[2]
; ++p
; *p == A[1]
There is at present no protection against "illegal" use of &
and *, e.g. if one attempts here to assign a value to *(p+5),
@@ -2697,28 +3120,28 @@ The following are the changes from calc version 2.10.3t5.28 to 2.10.3t5.33:
X; in effect X is an address and *X is the value at X.
Added isptr(p) builtin to return 0 is p is not a pointer,
>0 if it is a pointer. The value of isptr(p) comes from the
V_XYZ #define (see the top of value.h) of the value to which
p points.
and >0 if it is a pointer. The value of isptr(p) comes from
the V_XYZ #define (see the top of value.h) of the value to
which p points.
To allow & to be used as a C-like address operator, use of it
has been dropped in calls to user-defined functions. For the
time being I have replaced it by the back-quote `. For example:
> global a
> define f(a,b) = a = b
> f(&a,5)
> print a
; global a
; define f(a,b) = a = b
; f(&a,5)
; print a
0
> f(`a,5)
> print a
; f(`a,5)
; print a
5
However, one may use & in a similar way as in:
> define g(a,b) = *a = b
> g(&a, 7)
> print a
; define g(a,b) = *a = b
; g(&a, 7)
; print a
7
There is no hashvalue for pointers. Thus, like error values,
@@ -2726,38 +3149,38 @@ The following are the changes from calc version 2.10.3t5.28 to 2.10.3t5.33:
The -> also works in calc. For example:
> obj xy {x,y}
> obj uvw {u, v, w}
> obj xy A = {1,2}
> obj uvw B = {3,4,5}
> p = &A
> q = &B
> p->x
; obj xy {x,y}
; obj uvw {u, v, w}
; obj xy A = {1,2}
; obj uvw B = {3,4,5}
; p = &A
; q = &B
; p->x
1
> p->y = 6
> A
; p->y = 6
; A
obj xy {1, 6}
> q -> u
; q -> u
3
> p->y = q
> A
; p->y = q
; A
obj xy {1, v-ptr: 1400474c0}
> p->y->u
; p->y->u
3
> p->y->u = 7
> B
; p->y->u = 7
; B
obj uvw {7, 4, 5}
> p -> y = p
> A
; p -> y = p
; A
obj xy {1, v-ptr: 140047490}
> p -> y -> x
; p -> y -> x
1
> p->y->y
; p->y->y
v-ptr: 140047490
> p->y->y-> x
; p->y->y-> x
1
> p->y->y->x = 8
> A
; p->y->y->x = 8
; A
obj xy {8, v-ptr: 140047490}
@@ -2785,14 +3208,14 @@ The following are the changes from calc version 2.10.3t5.28 to 2.10.3t5.33:
The prior method calc has used for handling "constants" amounted
to leakage. After:
> define f(x) = 27 + x;
> a = 27;
; define f(x) = 27 + x;
; a = 27;
It is of course necessary for the constant 27 to be stored, but
if one now redefines f and a by:
> define f(x) = 45 + x;
> a = 45;
; define f(x) = 45 + x;
; a = 45;
There seems little point in retaining 27 as a constant and
therefore using up memory. If this example seems trivial,
@@ -2874,16 +3297,16 @@ The following are the changes from calc version 2.10.3t5.28 to 2.10.3t5.33:
The "." value:
> 2 + 2
; 2 + 2
4
> .
; .
4
can now be treated as an unnamed variable. For example:
> mat x[3,3]={1,2,3,4,5,6,7,8,9}
> x
> print .[1,2]
; mat x[3,3]={1,2,3,4,5,6,7,8,9}
; x
; print .[1,2]
6
(9) for a list L defining L[i] to be same as L[[i]]
@@ -2920,18 +3343,18 @@ The following are the changes from calc version 2.10.3t5.28 to 2.10.3t5.33:
For example:
> A = list(1,2,4);
> B = mat[2,2] = {5,6,7,8};
> define f(x) = (x ? A : B)[[1]];
> print f(1), f(0)
; A = list(1,2,4);
; B = mat[2,2] = {5,6,7,8};
; define f(x) = (x ? A : B)[[1]];
; print f(1), f(0)
2 6
> obj xy {x,y}
> C = obj xy = {4,5}
> p = &C
> *p.x
; obj xy {x,y}
; C = obj xy = {4,5}
; p = &C
; *p.x
Not indexing matrix or object
> (*p).x
; (*p).x
4
(14) swap(a,b) now permits swapping of octets in the same or different
@@ -2939,10 +3362,10 @@ The following are the changes from calc version 2.10.3t5.28 to 2.10.3t5.33:
For example:
> A = blk() = {1,2,3}
> B = blk() = {4,5,6}
> swap(A[0], B[2])
> A
; A = blk() = {1,2,3}
; B = blk() = {4,5,6}
; swap(A[0], B[2])
; A
chunksize = 256, maxsize = 256, datalen = 3
060203
@@ -3078,12 +3501,12 @@ The following are the changes from calc version 2.10.3t5.11 to 2.10.3t5.27:
Blocks will expand when required by the copy() builtin function:
> f = fopen("help/full", "r")
> B = blk()
> B
; f = fopen("help/full", "r")
; B = blk()
; B
chunksize = 256, maxsize = 256, datalen = 0
> copy(B, f)
> B
; copy(B, f)
; B
chunksize = 256, maxsize = 310272, datalen = 310084
2a2a2a2a2a2a2a2a2a2a2a2a2a0a2a20696e74726f0a2a2a2a2a2a2a2a2a...
@@ -4003,11 +4426,11 @@ The following are the changes from calc version 2.10.2t25 to 2.10.2t32:
"global a" is read in the last line. Thus one may now use the
same name in several "static" areas as in:
> static a = 10;
> define f(x) = a + x;
> static a = 20;
> define g(x) = a + x;
> global a;
; static a = 10;
; define f(x) = a + x;
; static a = 20;
; define g(x) = a + x;
; global a;
The first "a" exists only for the definition of f(); the second
"a" only for the definition of g(). At the end one has only
@@ -4016,10 +4439,10 @@ The following are the changes from calc version 2.10.2t25 to 2.10.2t32:
Ending the scope of a static variable in this way is consistent
with the normal use of static variables as in:
> static a = 10;
> define f(x) {static a = 20; return a++ + x;}
> define g(x) = a + x;
> global a;
; static a = 10;
; define f(x) {static a = 20; return a++ + x;}
; define g(x) = a + x;
; global a;
The scope of the first "a" is temporarily interrupted by the
"static a" in the second line; the second "a" remains active
@@ -4035,12 +4458,12 @@ The following are the changes from calc version 2.10.2t25 to 2.10.2t32:
to me that its use must end the scope of any static "a". Thus
the changes I introduce are such that after:
> global a = 10;
> define f(x) = a + x;
> static a = 20;
> define g(x) = a + x;
> define h(x) {global a = 30; return a + x;}
> define i(x) = a + x;
; global a = 10;
; define f(x) = a + x;
; static a = 20;
; define g(x) = a + x;
; define h(x) {global a = 30; return a + x;}
; define i(x) = a + x;
g(x) will always return 20 + x, and until h(x) has been called,
f(x) and i(x) will return 10 + x; when h(x) is called, it
@@ -4187,8 +4610,8 @@ The following are the changes from calc version 2.10.2t4 to 2.10.2t24:
The show keyword is now a statement instead of a command:
> define demo() {local f = open("foo", "w"); show files; fclose(f);}
> demo()
; define demo() {local f = open("foo", "w"); show files; fclose(f);}
; demo()
Added a new trace option for display of links to real and complex
numbers. This is activated by config("trace", 4). The printing of
@@ -4667,13 +5090,13 @@ The following are the changes from calc version 2.10.1t21 to 2.10.2t0:
The param(n) builtin, then n > 0, may be used as an lvalue:
> define g() = (param(2) = param(1));
> define h() = (param(1)++, param(2)--);
> u = 5
> v = 10
> print g(u, &v), u, v;
; define g() = (param(2) = param(1));
; define h() = (param(1)++, param(2)--);
; u = 5
; v = 10
; print g(u, &v), u, v;
5 5 5
> print h(&u, &v), u, v;
; print h(&u, &v), u, v;
5 6 4
Missing args now evaluate to null as in:
@@ -5034,9 +5457,9 @@ The following are the changes from calc version 2.10.0t13 to 2.10.1t10:
C-style arbitrary precision calculator (version 2.10.1t3)
[Type "exit" to exit, or "help" for help.]
> files(5)
; files(5)
FILE 5 "descriptor[5]" (unknown_mode, pos 0)
> fgetline(files(5))
; fgetline(files(5))
"A line of text in the file on descriptor 5"
The -m mode flag now controls calc's ability to open files
@@ -5758,8 +6181,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.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 29.69 $
## @(#) $Id: CHANGES,v 29.69 2004/08/03 12:29:19 chongo Exp $
## @(#) $Revision: 29.83 $
## @(#) $Id: CHANGES,v 29.83 2006/06/25 22:58:54 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/CHANGES,v $
##
## 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
of this license document, but changing it is not allowed.
# @(#) $Revision: 29.7 $
# @(#) $Id: COPYING,v 29.7 2003/02/26 16:54:59 chongo Exp $
# @(#) $Revision: 29.8 $
# @(#) $Id: COPYING,v 29.8 2006/05/01 19:16:57 chongo Exp $
# @(#) $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
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
GNU Lesser General Public License, is itself Copyrighted by the

View File

@@ -10,14 +10,13 @@
# or less. It compiles with gcc -O3 -g3 as well. You can change all
# this by modifying the Makefile variables below.
#
# NOTE: You might want use the READLINE facility and the less pager if
# your system supports them. To do this, set:
# NOTE: You might want use the READLINE facility if your system
# has the GNU readline headers and libaraies:
#
# USE_READLINE= -DUSE_READLINE
# READLINE_LIB= -lreadline -lhistory -lncurses
# CALCPAGER= less
#
# Copyright (C) 1999-2004 Landon Curt Noll
# Copyright (C) 1999-2006 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
@@ -33,8 +32,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
#
MAKEFILE_REV= $$Revision: 29.73 $$
# @(#) $Id: Makefile.ship,v 29.73 2004/07/28 12:52:37 chongo Exp $
MAKEFILE_REV= $$Revision: 29.75 $$
# @(#) $Id: Makefile.ship,v 29.75 2006/05/19 13:54:05 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/Makefile.ship,v $
#
# Under source code control: 1990/02/15 01:48:41
@@ -794,6 +793,11 @@ READLINE_LIB=
#READLINE_LIB= -L/usr/gnu/lib -lreadline -lhistory -lncurses
#READLINE_LIB= -L/usr/local/lib -lreadline -lhistory -lncurses
#
# 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
#
READLINE_INCLUDE=
#READLINE_INCLUDE= -I/usr/gnu/include
#READLINE_INCLUDE= -I/usr/local/include
@@ -802,10 +806,10 @@ READLINE_INCLUDE=
#
# Select CALCPAGER= less.exe -ci for DJGPP.
#
CALCPAGER= more
#CALCPAGER= more
#CALCPAGER= pg
#CALCPAGER= cat
#CALCPAGER= less
CALCPAGER= less
#CALCPAGER= less.exe -ci
# Debug/Optimize options for ${CC} and ${LCC}
@@ -978,6 +982,9 @@ EXT=
#
# CCOPT are flags given to ${CC} for optimization
# CCWARN are flags given to ${CC} for warning message control
# CCWERR are flags given to ${CC} to make warnings fatal errors
# NOTE: CCWERR is only set in development Makefiles and must
# only be used with ${CC}, not ${LCC}.
# CCMISC are misc flags given to ${CC}
#
# CFLAGS are all flags given to ${CC} [[often includes CCOPT, CCWARN, CCMISC]]
@@ -996,6 +1003,7 @@ EXT=
# Tested on Red Hat 6.0 Linux but should run on almost any Linux release.
#
CCWARN= -Wall -W -Wno-comment
CCWERR=
CCOPT= ${DEBUG} ${NO_SHARED}
CCMISC=
#
@@ -1006,13 +1014,14 @@ LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
ILDFLAGS=
#
LCC= gcc
CC= ${PURIFY} ${LCC}
CC= ${PURIFY} ${LCC} ${CCWERR}
#
###
#
# gcc set (some call it gcc2, some call it gcc)
# gcc set
#
#CCWARN= -Wall -W -Wno-comment
#CCWERR=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC=
#
@@ -1023,8 +1032,7 @@ CC= ${PURIFY} ${LCC}
#ILDFLAGS=
#
#LCC= gcc
#LCC= gcc2
#CC= ${PURIFY} ${LCC}
#CC= ${PURIFY} ${LCC} ${CCWERR}
#
###
#
@@ -1034,6 +1042,7 @@ CC= ${PURIFY} ${LCC}
# If -O2 -g is not supported try: DEBUG= -O -g
#
#CCWARN=
#CCWERR=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC=
#
@@ -1044,7 +1053,7 @@ CC= ${PURIFY} ${LCC}
#ILDFLAGS=
#
#LCC= cc
#CC= ${PURIFY} ${LCC}
#CC= ${PURIFY} ${LCC} ${CCWERR}
#
###
#
@@ -1062,6 +1071,7 @@ CC= ${PURIFY} ${LCC}
# woff 1209: cancel 'controlling expression is constant' warnings
#
#CCWARN= -fullwarn -woff 1209
#CCWERR=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -rdata_shared
#
@@ -1072,7 +1082,7 @@ CC= ${PURIFY} ${LCC}
#ILDFLAGS=
#
#LCC= cc -n32 -xansi
#CC= ${PURIFY} ${LCC}
#CC= ${PURIFY} ${LCC} ${CCWERR}
#
###
#
@@ -1085,6 +1095,7 @@ CC= ${PURIFY} ${LCC}
# If 'make check' fails use: DEBUG= -g
#
#CCWARN=
#CCWERR=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= +e
#
@@ -1095,7 +1106,7 @@ CC= ${PURIFY} ${LCC}
#ILDFLAGS=
#
#LCC= cc
#CC= ${PURIFY} ${LCC}
#CC= ${PURIFY} ${LCC} ${CCWERR}
#
###
#
@@ -1105,6 +1116,7 @@ CC= ${PURIFY} ${LCC}
# If -O2 -g is not supported try: DEBUG= -O -g
#
#CCWARN=
#CCWERR=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -qlanglvl=ansi
#
@@ -1115,7 +1127,7 @@ CC= ${PURIFY} ${LCC}
#ILDFLAGS=
#
#LCC= cc
#CC= ${PURIFY} ${LCC}
#CC= ${PURIFY} ${LCC} ${CCWERR}
#
###
#
@@ -1128,6 +1140,7 @@ CC= ${PURIFY} ${LCC}
# to avoid the use of -Xc (which as a lose performance wise).
#
#CCWARN=
#CCWERR=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -DFORCE_STDC
#
@@ -1138,7 +1151,7 @@ CC= ${PURIFY} ${LCC}
#ILDFLAGS=
#
#LCC= cc
#CC= ${PURIFY} ${LCC}
#CC= ${PURIFY} ${LCC} ${CCWERR}
#
###
#
@@ -1147,6 +1160,7 @@ CC= ${PURIFY} ${LCC}
# For better performance, set the following: DEBUG= -std0 -fast -O4 -static
#
#CCWARN=
#CCWERR=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC=
#
@@ -1157,7 +1171,7 @@ CC= ${PURIFY} ${LCC}
#ILDFLAGS=
#
#LCC= cc
#CC= ${PURIFY} ${LCC}
#CC= ${PURIFY} ${LCC} ${CCWERR}
##############################################################################
#-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#

235
addop.c
View File

@@ -1,7 +1,7 @@
/*
* addop - add opcodes to a function being compiled
*
* Copyright (C) 1999-2004 David I. Bell and Ernest Bowen
* Copyright (C) 1999-2006 David I. Bell and Ernest Bowen
*
* Primary author: David I. Bell
*
@@ -19,8 +19,8 @@
* 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.5 $
* @(#) $Id: addop.c,v 29.5 2004/02/23 14:04:01 chongo Exp $
* @(#) $Revision: 29.13 $
* @(#) $Id: addop.c,v 29.13 2006/06/20 10:28:06 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/addop.c,v $
*
* Under source code control: 1990/02/15 01:48:10
@@ -184,7 +184,7 @@ void
endfunc(void)
{
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;
if (oldop != OP_RETURN) {
@@ -195,8 +195,8 @@ endfunc(void)
checklabels();
if (errorcount) {
printf("\"%s\": %ld error%s\n", newname, errorcount,
((errorcount == 1) ? "" : "s"));
scanerror(T_NULL,"Compilation of \"%s\" failed: %ld error(s)",
newname, errorcount);
return;
}
size = funcsize(curfunc->f_opcodecount);
@@ -211,7 +211,7 @@ endfunc(void)
if (newname[0] != '*' && (conf->traceflags & TRACE_FNCODES)) {
dumpnames = TRUE;
for (size = 0; size < fp->f_opcodecount; ) {
printf("%ld: ", (long)size);
printf("%ld: ", (unsigned long)size);
size += dumpop(&fp->f_opcodes[size]);
}
}
@@ -280,12 +280,13 @@ rmuserfunc(char *name)
index = findstr(&funcnames, name);
if (index < 0) {
fprintf(stderr, "%s() has never been defined\n",
name);
warning("No function named \"%s\" to be undefined", name);
return;
}
if (functions[index] == NULL)
if (functions[index] == NULL) {
warning("No defined function \"%s\" to be undefined", name);
return;
}
freenumbers(functions[index]);
free(functions[index]);
if ((inputisterminal() && conf->resource_debug & RSCDBG_STDIN_FUNC) ||
@@ -451,124 +452,122 @@ addop(long op)
* slightly optimize the code depending on the various combinations.
*/
switch (op) {
case OP_GETVALUE:
switch (oldop) {
case OP_NUMBER:
case OP_ZERO:
case OP_ONE:
case OP_IMAGINARY:
case OP_GETEPSILON:
case OP_SETEPSILON:
case OP_STRING:
case OP_UNDEF:
case OP_GETCONFIG:
case OP_SETCONFIG:
return;
case OP_DUPLICATE:
diff = 1;
oldop = OP_DUPVALUE;
break;
case OP_FIADDR:
diff = 1;
oldop = OP_FIVALUE;
break;
case OP_GLOBALADDR:
diff = 1 + PTR_SIZE;
oldop = OP_GLOBALVALUE;
break;
case OP_LOCALADDR:
oldop = OP_LOCALVALUE;
break;
case OP_PARAMADDR:
oldop = OP_PARAMVALUE;
break;
case OP_ELEMADDR:
oldop = OP_ELEMVALUE;
break;
default:
cut = FALSE;
case OP_GETVALUE:
switch (oldop) {
case OP_NUMBER:
case OP_ZERO:
case OP_ONE:
case OP_IMAGINARY:
case OP_GETEPSILON:
case OP_SETEPSILON:
case OP_STRING:
case OP_UNDEF:
case OP_GETCONFIG:
case OP_SETCONFIG:
return;
case OP_DUPLICATE:
diff = 1;
oldop = OP_DUPVALUE;
break;
case OP_FIADDR:
diff = 1;
oldop = OP_FIVALUE;
break;
case OP_GLOBALADDR:
diff = 1 + PTR_SIZE;
oldop = OP_GLOBALVALUE;
break;
case OP_LOCALADDR:
oldop = OP_LOCALVALUE;
break;
case OP_PARAMADDR:
oldop = OP_PARAMVALUE;
break;
case OP_ELEMADDR:
oldop = OP_ELEMVALUE;
break;
default:
cut = FALSE;
}
if (cut) {
fp->f_opcodes[count - diff] = oldop;
return;
}
}
if (cut) {
fp->f_opcodes[count - diff] = oldop;
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;
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;
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;
}
case OP_STRING:
sfree(findstring((long)fp->f_opcodes[count-1]));
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;
}
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;
warning("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 (oldoldop == OP_NUMBER) {
q1 = constvalue(fp->f_opcodes[count - 3]);
q2 = constvalue(fp->f_opcodes[count - 1]);
switch (op) {
case OP_DIV:
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:
case OP_DIV:
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;
}
if (cut) {
qfree(q1);

144
blkcpy.c
View File

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

View File

@@ -19,8 +19,8 @@
* 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: block.c,v 29.2 2000/06/07 14:02:13 chongo Exp $
* @(#) $Revision: 29.3 $
* @(#) $Id: block.c,v 29.3 2006/05/01 19:16:57 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/block.c,v $
*
* Under source code control: 1997/02/27 00:29:40
@@ -57,7 +57,7 @@ static void blkchk(BLOCK*);
*
* given:
* len - initial memory length of the block
* type - BLK_TYPE_XXX
* type - BLK_TYPE_XYZ
* chunk - allocation chunk size
*
* returns:

View File

@@ -18,8 +18,8 @@
# 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.15 $
# @(#) $Id: Makefile,v 29.15 2003/01/05 08:10:56 chongo Exp $
# @(#) $Revision: 29.20 $
# @(#) $Id: Makefile,v 29.20 2006/06/23 00:34:55 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/Makefile,v $
#
# 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 \
pollard.cal poly.cal psqrt.cal quat.cal regress.cal solve.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 \
test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \
test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \
beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \
randomrun.cal 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 alg_config.cal sumtimes.cal
# 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.
For example:
> read lucas
; read lucas
lucas(h,n) defined
gen_u0(h,n,v1) 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 lucas function:
> lucas(149,60)
; lucas(149,60)
1
> lucas(146,61)
; lucas(146,61)
0
shows that 149*2^60-1 is prime whereas 146*2^61-1 is not.
@@ -75,7 +75,7 @@ have meanings are as follows:
is displayed.
2 Show func will display more information about a functions
arguments as well as more argument sdummary information.
arguments as well as more argument summary information.
3 During execution, allow calc standard resource files
to output additional debugging information.
@@ -103,7 +103,7 @@ either of the bottom 2 bits set:
print "funcB(size, mass, ...) defined";
}
If your the resource file needs to output special debugging informatin,
If your the resource file needs to output special debugging information,
we recommend that you check for bit 3 of the config("resource_debug")
before printing the debug statement:
@@ -117,12 +117,68 @@ The following is a brief description of some of the calc resource files
that are shipped with calc. See above for example of how to read in
and execute these files.
alg_config.cal
global test_time
mul_loop(repeat,x) defined
mul_ratio(len) defined
best_mul2() defined
sq_loop(repeat,x) defined
sq_ratio(len) defined
best_sq2() defined
pow_loop(repeat,x,ex) defined
pow_ratio(len) defined
best_pow2() defined
These functions search for an optimal value of config("mul2"),
config("sq2"), and config("pow2"). The calc default values of these
configuration values were set by running this resource file on a
1.8GHz AMD 32-bit CPU of ~3406 BogoMIPS.
The best_mul2() function returns the optimal value of config("mul2").
The best_sq2() function returns the optimal value of config("sq2").
The best_pow2() function returns the optimal value of config("pow2").
The other functions are just support functions.
By design, best_mul2(), best_sq2(), and best_pow2() take a few
minutes to run. These functions increase the number of times a
given computational loop is executed until a minimum amount of CPU
time is consumed. To watch these functions progress, one can set
the config("user_debug") value.
Here is a suggested way to use this resource file:
; read alg_config
; config("user_debug",2),;
; best_mul2(); best_sq2(); best_pow2();
; best_mul2(); best_sq2(); best_pow2();
; best_mul2(); best_sq2(); best_pow2();
NOTE: It is perfectly normal for the optimal value returned to differ
slightly from run to run. Slight variations due to inaccuracy in
CPU timings will cause the best value returned to differ slightly
from run to run.
One can use a calc startup file to change the initial values of
config("mul2"), config("sq2"), and config("pow2"). For example one
can place into ~/.calcrc these lines:
config("mul2", 1780),;
config("sq2", 3388),;
config("pow2", 176),;
to automatically and silently change these config values.
See help/config and CALCRC in help/environment for more information.
beer.cal
Calc's contribution to the 99 Bottles of Beer web page:
http://www.ionet.net/~timtroyr/funhouse/beer.html#calc
NOTE: This resource produces a lot of output. :-)
bernoulli.cal
@@ -132,7 +188,7 @@ bernoulli.cal
NOTE: There is now a bernoulli() builtin function. This file is
left here for backward compatibility and now simply returns
the buildin function.
the builtin function.
bigprime.cal
@@ -153,9 +209,9 @@ chi.cal
The chi_prob() function does not work well with odd degrees of freedom.
It is reasonable with even degrees of freedom, although one must give
a sifficently small error term as the degress gets large (>100).
a sufficiently small error term as the degrees gets large (>100).
The Z(x) and P(x) are internal statistical funcions.
The Z(x) and P(x) are internal statistical functions.
eps is an optional epsilon() like error term.
@@ -180,6 +236,38 @@ deg.cal
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
efactor(iN, ia, B, force)
@@ -194,6 +282,8 @@ hello.cal
http://www.latech.edu/~acm/HelloWorld.shtml
http://www.latech.edu/~acm/helloworld/calc.html
NOTE: This resource produces a lot of output. :-)
intfile.cal
@@ -222,6 +312,14 @@ intfile.cal
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(h, n)
@@ -497,6 +595,58 @@ regress.cal
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(seed1, seed2, bitsize [,trials])
@@ -515,6 +665,24 @@ seedrandom.cal
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(low, high, epsilon)
@@ -533,6 +701,27 @@ sumsq.cal
4N+1, and always impossible for primes of the form 4N-1.
sumtimes.cal
timematsum(N)
timelistsum(N)
timematsort(N)
timelistsort(N)
timematreverse(N)
timelistreverse(N)
timematssq(N)
timelistssq(N)
timehmean(N,M)
doalltimes(N)
Give the runtimes for various ways of evaluating sums, sums of
squares, etc, for large lists and matrices. N is the size of
the list or matrix to use. The doalltimes() function will run
all fo the sumtimes tests. For example:
doalltimes(1e6);
surd.cal
surd(a, b)
@@ -825,8 +1014,8 @@ xx_print.cal
## 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.9 $
## @(#) $Id: README,v 29.9 2003/01/05 08:10:56 chongo Exp $
## @(#) $Revision: 29.15 $
## @(#) $Id: README,v 29.15 2006/06/23 00:34:55 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/README,v $
##
## Under source code control: 1990/02/15 01:50:32

1253
cal/alg_config.cal Normal file

File diff suppressed because it is too large Load Diff

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.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* @(#) $Revision: 29.2 $
* @(#) $Id: ellip.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.4 $
* @(#) $Id: ellip.cal,v 29.4 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/ellip.cal,v $
*
* Under source code control: 1990/02/15 01:50:33
@@ -28,16 +28,17 @@
*/
/*
* Attempt to factor numbers using elliptic functions.
* y^2 = x^3 + a*x + b (mod N).
* Attempt to factor numbers using elliptic functions:
*
* Many points (x,y) (mod N) are found that solve the above equation,
* y^2 = x^3 + a*x + b (mod ellip_N).
*
* Many points (x,y) (mod ellip_N) are found that solve the above equation,
* starting from a trivial solution and 'multiplying' that point together
* to generate high powers of the point, looking for such a point whose
* order contains a common factor with N. The order of the group of points
* varies almost randomly within a certain interval for each choice of a
* and b, and thus each choice provides an independent opportunity to
* factor N. To generate a trivial solution, a is chosen and then b is
* order contains a common factor with ellip_N. The order of the group of
* points varies almost randomly within a certain interval for each choice of
* a and b, and thus each choice provides an independent opportunity to
* factor ellip_N. To generate a trivial solution, a is chosen and then b is
* selected so that (1,1) is a solution. The multiplication is done using
* the basic fact that the equation is a cubic, and so if a line hits the
* curve in two rational points, then the third intersection point must
@@ -45,9 +46,9 @@
* the number of rational solutions can be made very large. When modular
* arithmetic is used, solving for the third point requires the taking of a
* modular inverse (instead of division), and if this fails, then the GCD
* of the failing value and N provides a factor of N. This description is
* only an approximation, read "A Course in Number Theory and Cryptography"
* by Neal Koblitz for a good explanation.
* of the failing value and ellip_N provides a factor of ellip_N.
* This description is only an approximation, read "A Course in Number
* Theory and Cryptography" by Neal Koblitz for a good explanation.
*
* efactor(iN, ia, B, force)
* iN is the number to be factored.
@@ -81,15 +82,15 @@
*
* If a factor is found, it is returned and is also saved in the global
* variable f. The number being factored is also saved in the global
* variable N.
* variable ellip_N.
*/
obj point {x, y};
global N; /* number to factor */
global a; /* first coefficient */
global b; /* second coefficient */
global f; /* found factor */
global ellip_N; /* number to factor */
global ellip_a; /* first coefficient */
global ellip_b; /* second coefficient */
global ellip_f; /* found factor */
define efactor(iN, ia, B, force)
@@ -103,28 +104,28 @@ define efactor(iN, ia, B, force)
if (isnull(ia))
ia = 1;
obj point x;
a = ia;
b = -ia;
N = iN;
C = isqrt(N);
ellip_a = ia;
ellip_b = -ia;
ellip_N = iN;
C = isqrt(ellip_N);
C = 2 * C + 2 * isqrt(C) + 1;
f = 0;
while (f == 0) {
print "A =", a;
ellip_f = 0;
while (ellip_f == 0) {
print "A =", ellip_a;
x.x = 1;
x.y = 1;
print 2, x;
x = x ^ (2 ^ (highbit(C) + 1));
for (p = 3; ((p < B) && (f == 0)); p += 2) {
for (p = 3; ((p < B) && (ellip_f == 0)); p += 2) {
if (!ptest(p, 1))
continue;
print p, x;
x = x ^ (p ^ ((highbit(C) // highbit(p)) + 1));
}
a++;
b--;
ellip_a++;
ellip_b--;
}
return f;
return ellip_f;
}
@@ -141,18 +142,18 @@ define point_mul(p1, p2)
if (p2 == 1)
return p1;
if (p1 == p2)
return point_square(&p1);
return point_square(`p1);
obj point r;
m = (minv(p2.x - p1.x, N) * (p2.y - p1.y)) % N;
m = (minv(p2.x - p1.x, ellip_N) * (p2.y - p1.y)) % ellip_N;
if (m == 0) {
if (f == 0)
f = gcd(p2.x - p1.x, N);
if (ellip_f == 0)
ellip_f = gcd(p2.x - p1.x, ellip_N);
r.x = 1;
r.y = 1;
return r;
}
r.x = (m^2 - p1.x - p2.x) % N;
r.y = ((m * (p1.x - r.x)) - p1.y) % N;
r.x = (m^2 - p1.x - p2.x) % ellip_N;
r.y = ((m * (p1.x - r.x)) - p1.y) % ellip_N;
return r;
}
@@ -162,16 +163,16 @@ define point_square(p)
local r, m;
obj point r;
m = ((3 * p.x^2 + a) * minv(p.y << 1, N)) % N;
m = ((3 * p.x^2 + ellip_a) * minv(p.y << 1, ellip_N)) % ellip_N;
if (m == 0) {
if (f == 0)
f = gcd(p.y << 1, N);
if (ellip_f == 0)
ellip_f = gcd(p.y << 1, ellip_N);
r.x = 1;
r.y = 1;
return r;
}
r.x = (m^2 - p.x - p.x) % N;
r.y = ((m * (p.x - r.x)) - p.y) % N;
r.x = (m^2 - p.x - p.x) % ellip_N;
r.y = ((m * (p.x - r.x)) - p.y) % ellip_N;
return r;
}
@@ -184,10 +185,10 @@ define point_pow(p, pow)
if (isodd(pow))
r = p;
t = p;
for (bit = 2; ((bit <= pow) && (f == 0)); bit <<= 1) {
t = point_square(&t);
for (bit = 2; ((bit <= pow) && (ellip_f == 0)); bit <<= 1) {
t = point_square(`t);
if (bit & pow)
r = point_mul(&t, &r);
r = point_mul(`t, `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.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* @(#) $Revision: 29.2 $
* @(#) $Id: natnumset.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.3 $
* @(#) $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 $
*
* 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)
{
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))
quit "Non-integer argument for interval";

View File

@@ -17,8 +17,8 @@
* 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: prompt.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.3 $
* @(#) $Id: prompt.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/prompt.cal,v $
*
* Under source code control: 1995/12/18 04:43:25
@@ -101,7 +101,7 @@ define adder() {
}
}
global x;
global prompt_x;
define showvalues(str) {
local s;
@@ -109,8 +109,8 @@ define showvalues(str) {
s = prompt("? ");
if (s == "end")
break;
x = eval(s);
if (!isnum(x)) {
prompt_x = eval(s);
if (!isnum(prompt_x)) {
print "Please enter a number";
continue;
}

View File

@@ -1,7 +1,7 @@
/*
* regress - calc regression and correctness test suite
*
* Copyright (C) 1999-2004 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
* 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.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* @(#) $Revision: 29.19 $
* @(#) $Id: regress.cal,v 29.19 2004/02/23 14:04:01 chongo Exp $
* @(#) $Revision: 29.34 $
* @(#) $Id: regress.cal,v 29.34 2006/06/25 20:33:26 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/regress.cal,v $
*
* Under source code control: 1990/02/15 01:50:36
@@ -201,7 +201,6 @@ define test_variables()
local x1, x2, x3;
global g1, g2;
local t;
global globalvar;
local x;
print '350: Beginning test_variables';
@@ -404,14 +403,14 @@ define test_config()
'512: config("trace") == 0');
vrfy(config("maxprint") == 16,
'513: config("maxprint") == 16');
vrfy(config("mul2") == 20,
'514: config("mul2") == 20');
vrfy(config("sq2") == 20,
'515: config("sq2") == 20');
vrfy(config("pow2") == 40,
'516: config("pow2") == 40');
vrfy(config("redc2") == 50,
'517: config("redc2") == 50');
vrfy(config("mul2") == 1780,
'514: config("mul2") == 1780');
vrfy(config("sq2") == 3388,
'515: config("sq2") == 3388');
vrfy(config("pow2") == 176,
'516: config("pow2") == 176');
vrfy(config("redc2") == 220,
'517: config("redc2") == 220');
vrfy(config("tilde"),
'518: config("tilde")');
vrfy(config("tab"),
@@ -1310,9 +1309,72 @@ define test_functions()
* verify sleep
*/
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())');
/*
* ssq use of lists
*/
vrfy(ssq(1,2, list(3,4,list(5,6)), list(), 7, 8) == 204,
'1156: ssq(1,2, list(3,4,list(5,6)), list(), 7, 8) == 204');
/*
* quomod 5th argument rounding tests
*/
vrfy(quomod(10,-3,a,b,0) == 1, '1157: vrfy(quomod(10,-3,a,b,0) == 1');
vrfy(a == -4, '1158: a == -4');
vrfy(b == -2, '1159: b == -2');
vrfy(quomod(-10,-3,a,b,1) == 1, '1160: vrfy(quomod(-10,-3,a,b,1) == 1');
vrfy(a == 4, '1161: a == 4');
vrfy(b == 2, '1162: b == 2');
vrfy(quomod(10,3,a,b,2) == 1, '1163: vrfy(quomod(10,3,a,b,2) == 1');
vrfy(a == 3, '1164: a == 3');
vrfy(b == 1, '1165: b == 1');
vrfy(quomod(-10,3,a,b,3) == 1, '1166: vrfy(quomod(-10,3,a,b,3) == 1');
vrfy(a == -4, '1167: a == -4');
vrfy(b == 2, '1168: b == 2');
vrfy(quomod(10,-3,a,b,4) == 1, '1169: vrfy(quomod(10,-3,a,b,4) == 1');
vrfy(a == -3, '1170: a == -3');
vrfy(b == 1, '1171: b == 1');
vrfy(quomod(-10,-3,a,b,5) == 1, '1172: vrfy(quomod(-10,-3,a,b,5) == 1');
vrfy(a == 3, '1173: a == 3');
vrfy(b == -1, '1174: b == -1');
vrfy(quomod(10,3,a,b,6) == 1, '1175: vrfy(quomod(10,3,a,b,6) == 1');
vrfy(a == 3, '1176: a == 3');
vrfy(b == 1, '1177: b == 1');
vrfy(quomod(-10,3,a,b,7) == 1, '1178: vrfy(quomod(-10,3,a,b,7) == 1');
vrfy(a == -4, '1179: a == -4');
vrfy(b == 2, '1180: b == 2');
vrfy(quomod(10,-3,a,b,8) == 1, '1181: vrfy(quomod(10,-3,a,b,8) == 1');
vrfy(a == -4, '1182: a == -4');
vrfy(b == -2, '1183: b == -2');
vrfy(quomod(-10,-3,a,b,9) == 1, '1184: vrfy(quomod(-10,-3,a,b,9) == 1');
vrfy(a == 3, '1185: a == 3');
vrfy(b == -1, '1186: b == -1');
vrfy(quomod(10,3,a,b,10) == 1, '1187: vrfy(quomod(10,3,a,b,10) == 1');
vrfy(a == 4, '1188: a == 4');
vrfy(b == -2, '1189: b == -2');
vrfy(quomod(-10,3,a,b,11) == 1, '1190: vrfy(quomod(-10,3,a,b,11) == 1');
vrfy(a == -4, '1191: a == -4');
vrfy(b == 2, '1192: b == 2');
vrfy(quomod(10,-3,a,b,12) == 1, '1193: vrfy(quomod(10,-3,a,b,12) == 1');
vrfy(a == -3, '1194: a == -3');
vrfy(b == 1, '1195: b == 1');
vrfy(quomod(-10,-3,a,b,13) == 1,'1196: vrfy(quomod(-10,-3,a,b,13) == 1');
vrfy(a == 4, '1197: a == 4');
vrfy(b == 2, '1198: b == 2');
vrfy(quomod(10,3,a,b,14) == 1, '1199: vrfy(quomod(10,3,a,b,14) == 1');
vrfy(a == 4, '1200: a == 4');
vrfy(b == -2, '1201: b == -2');
vrfy(quomod(-10,3,a,b,15) == 1, '1202: vrfy(quomod(-10,3,a,b,15) == 1');
vrfy(a == -4, '1203: a == -4');
vrfy(b == 2, '1204: b == 2');
print '1205: Ending test_functions';
}
print '017: parsed test_functions()';
@@ -1329,14 +1391,14 @@ define _test_underscore()
local _a = 27;
local __a = 23209;
print "1200: Beginning _test_underscore";
print "1290: Beginning _test_underscore";
vrfy(_a == 27, '1201: _a == 27');
vrfy(_ == 49, '1202: _ == 49');
vrfy(__ == 63, '1203: __ == 63');
vrfy(__a == 23209, '1204: __a == 23209');
vrfy(_a == 27, '1291: _a == 27');
vrfy(_ == 49, '1292: _ == 49');
vrfy(__ == 63, '1293: __ == 63');
vrfy(__a == 23209, '1294: __a == 23209');
print "1205: Ending _test_underscore";
print "1295: Ending _test_underscore";
}
print '020: parsed _test_underscore';
@@ -2571,6 +2633,49 @@ define test_2600()
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 '037: parsed test_2600()';
@@ -3356,11 +3461,12 @@ print '070: parsed test_redc()';
*/
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 C = "Curt";
local N = "Noll";
local LCN = "Landon\nCurt\nNoll\n";
local long = "0123456789abcdef0123456789abcdef";
print '4200: Beginning test_fileops';
@@ -3458,13 +3564,37 @@ define test_fileops()
vrfy(y == "Noll", '4258: y == "Noll"');
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
*/
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()';
@@ -3899,7 +4029,7 @@ print '088: parsed test_fileop()';
/*
* global and static assignment tests
*/
global a = 10, b, c d = 20, e, f;
global a = 10, b, c d = 20, e;
print '089: global a = 10, b, c d = 20, e, f';
vrfy(a == 10, '090: a == 10');
vrfy(b == 0, '091: b == 0');
@@ -4599,13 +4729,11 @@ print '137: parsed test_random()';
/*
* test_newsyn - test new command completion syntax and scope rules
*/
for (s5500 = 0, i = 0; i < 5; i++)
s5500 += i;
for (s5500 = 0, i = 0; i < 5; i++) s5500 += i;
print "138: for (s5500 = 0, i = 0; i < 5; i++) s5500 += i;";
vrfy(s5500 == 10, '139: s5500 == 10');
vrfy(i == 5, '140: i == 5');
for (s5500 = 0, i = 0; i < 9; i++)
{
for (s5500 = 0, i = 0; i < 9; i++) {
s5500 += i;
}
print "141: for (s5500 = 0, i = 0; i < 9; i++) { s5500 += i; }";
@@ -4653,7 +4781,6 @@ define test_newsyn()
vrfy(i == 3, '5509: i == 3');
/**/
{
local i;
for (s5500 = 0, i = 0; i < 11; i++)
s5500 += i;
vrfy(s5500 == 55, '5510: s5500 == 45');
@@ -5065,8 +5192,6 @@ print '156: parsed test_size()';
/*
* test_assign - test assignment of constants and variables
*/
global A, B; /* A, B for "constants" */
print '157: global A, B';
global X5800, Y5800; /* X5800, Y5800 for "variables" */
print '158: global X5800, Y5800';
obj xy5800 {x, y};
@@ -5088,7 +5213,7 @@ define test_assign(base, work)
Y5800 = base+4;
print base+4: ': Y5800 = base+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
@@ -5153,6 +5278,11 @@ define test_is()
local square; /* square of an odd prime */
local string; /* string */
local com; /* complex value */
local rndint; /* a random integer */
local rndexp; /* a random exponent */
local rndval; /* rndint ^ rndexp */
local i; /* integer value */
local ok; /* 1 ==> issq() tests were OK, 0 ==> failure */
print '5900: Beginning test_is';
@@ -5211,7 +5341,7 @@ define test_is()
prime = 3217;
print '5922: prime = 3217';
square = prime^2;
print '5923: square = prine^2';
print '5923: square = prime^2';
string = "a string";
print '5924: string = "a string"';
com = 3+4i;
@@ -6090,15 +6220,75 @@ define test_is()
vrfy(istype(matrix,odd) == 0, '6661: istype(matrix,odd) == 0');
vrfy(istype(a,odd) == 0, '6662: istype(a,odd) == 0');
/*
* perform more extensive issq() testing
*/
ok = 1;
for (i=0; i < 256; ++i) {
/* rndval will be a square - even powers>0 of x>1 */
rndexp = random(1, 16) * 2;
rndint = random(2, 4294967296);
if (issq(rndint)) {
++rndint;
}
rndval = rndint ^ rndexp;
if (issq(rndval) == 0) {
prob(strprintf("issq(%d^%d) returned 0",
rndint, rndexp));
ok = 0;
}
}
if (ok) {
print '6663: issq() on 256 squares';
} else {
print '****: failure(s): 6663: faiissq() on 256 squares';
}
for (i=0; i < 256; ++i) {
/* rndval will not be a square - 1 + even powers>0 of x>1 */
rndexp = random(1, 16) * 2;
rndint = random(2, 4294967296);
rndval = rndint ^ rndexp;
if (issq(rndval+1) != 0) {
prob(strprintf("issq(%d^%d)+1 returned non-zero",
rndint, rndexp));
ok = 0;
}
}
if (ok) {
print '6664: issq() on 256 squares+1';
} else {
print '****: failure(s): 6664: issq() on 256 squares+1';
}
print '6664: issq() on 256 squares+1';
for (i=0; i < 256; ++i) {
/* rndval will not be a square - odd powers>0 of x>1 */
rndexp = (random(1, 16) * 2) + 1;
rndint = random(2, 4294967296);
if (issq(rndint)) {
++rndint;
}
rndval = rndint ^ rndexp;
if (issq(rndval) != 0) {
prob(strprintf("issq(%d^%d) returned non-zero",
rndint, rndexp));
ok = 0;
}
}
if (ok) {
print '6665: issq() on 256 non-squares';
} else {
print '****: failure(s): 6665: issq() on 256 non-squares';
}
/*
* cleanup
*/
blkfree("blk5900");
print '6663: blkfree("blk5900")';
print '6666: blkfree("blk5900")';
fclose(ofd);
print '6664: fclose(ofd)';
print '6667: fclose(ofd)';
print '6665: Ending test_is';
print '6668: Ending test_is';
}
print '168: test_is()';
@@ -6210,7 +6400,7 @@ define test_blk()
/* A second named block */
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(sizeof(B1) == 20, '6748: sizeof(B1) == 20');
vrfy(test(B1) == 1, '6749: test(B1) == 1');
@@ -6605,10 +6795,10 @@ define test_sha()
0x21e42319a26787046c2b28b7ae70f1b54bf0ba2a,
'7122: sha(sha("this is", 7^19-8, ..., "hash")) == 0x21e4...');
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());';
vrfy(sha(z) == 0x36dcca3e51865c30a2cf738023cda446f1368340,
'7124: sha(z) == 0x36dcca3e51865c30a2cf738023cda446f1368340');
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(1e-100));';
vrfy(sha(z) == 257075527903934749824451356785709876382198951165,
'7124: sha(z) == 257075527903934749824451356785709876382198951165');
y = sha();
print '7125: y = sha()';
@@ -6616,8 +6806,8 @@ define test_sha()
print '7126: y = sha(y, list(1,2,3), "curds and whey")';
y = sha(y, 2^21701-1);
print '7127: y = sha(y, 2^21701-1)';
y = sha(y, pi());
print '7128: y = sha(y, pi())';
y = sha(y, pi(1e-100));
print '7128: y = sha(y, pi(1e-100))';
vrfy(y == z, '7129: y == z');
B = blk() = {"a", "b", "c"};
@@ -6676,10 +6866,10 @@ define test_sha1()
'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());
print '7210: z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi());';
vrfy(sha1(z) == 0xc19e7317675dbf71e293b4c41e117169e9da5b6f,
'7211: sha1(z) == 0xc19e7317675dbf71e293b4c41e117169e9da5b6f');
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(1e-100));';
vrfy(sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83,
'7211: sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83');
y = sha1();
print '7212: y = sha1();';
@@ -6687,8 +6877,8 @@ define test_sha1()
print '7213: y = sha1(y, list(1,2,3), "curds and whey");';
y = sha1(y, 2^21701-1);
print '7214: y = sha1(y, 2^21701-1);';
y = sha1(y, pi());
print '7215: y = sha1(y, pi());';
y = sha1(y, pi(1e-100));
print '7215: y = sha1(y, pi(1e-100));';
vrfy(y == z, '7216: y == z');
vrfy(sha1(sha1("a"))==0x86f7e437faa5a7fce15d1ddcb9eaeaea377667b8,
@@ -6764,18 +6954,18 @@ define test_md5()
'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());
print '7311: z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi());';
vrfy(md5(z) == 0x63d2b2fccae2de265227c30b05abb6b5,
'7312: md5(z) == 0x63d2b2fccae2de265227c30b05abb6b5');
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(1e-100));';
vrfy(md5(z) == 0x487462e577eabef0302dd13af6632546,
'7312: md5(z) == 0x487462e577eabef0302dd13af6632546');
y = md5();
print '7313: y = md5();';
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);
print '7315: y = md5(y, 2^21701-1);';
y = md5(y, pi());
print '7316: y = md5(y, pi());';
y = md5(y, pi(1e-100));
print '7316: y = md5(y, pi(1e-100));';
vrfy(y == z, '7317: y == z');
vrfy(md5(md5("a")) == 0x0cc175b9c0f1b6a831c399e269772661,
@@ -7312,7 +7502,7 @@ define test_somenew()
vrfy(size(char(0)) == 1, '8203: size(char(0)) == 1');
vrfy(strlen(char(0)) == 0, '8204: strlen(char(0)) == 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"');
@@ -7669,18 +7859,54 @@ print '8406: Ending test_quit';
* test_divmod - psuedo-random tests on the // and % with various rounding modes
*/
print;
print '8500: Starting test_divmod'
print '8500: Starting test of divmod'
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
*/
print;
print '8600: Starting test_1024args'
print '8600: Starting test of up to 1024 args'
read -once "test8600";
/* 86xx: Ending test_1024args is printed by test8600.cal */
/* 860x: Ending test of up to 1024 args is printed by test8600.cal */
/*
* dupvar_warn and redecl_warn testing
*/
print;
print '8650: Starting test of dupvar_warn and redecl_warn config parameters';
vrfy(config("redecl_warn",0), '8651: config("redecl_warn",0)');
vrfy(config("dupvar_warn",0), '8652: config("dupvar_warn",0)');
vrfy(u_glob == 6, '8653: u_glob == 6');
global u_glob = 555;
print '8654: reclare u_glob';
vrfy(u_glob == 555, '8655: u_glob == 555');
define func_8650(u_glob) { local u_glob; return u_glob; }
print '8656: u_glob as both local and parameter';
define func_8650a(u_glob) { static u_glob; return u_glob; }
print '8657: u_glob as both static and parameter';
vrfy(config("redecl_warn",1)==0, '8658: config("redecl_warn",1)==0');
vrfy(config("dupvar_warn",1)==0, '8659: config("dupvar_warn",1)==0');
/* 865x: 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;
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 */
/*
@@ -7760,7 +7986,28 @@ read -once varargs;
print '9827: read -once varargs';
read -once qtime;
print '9828: read -once qtime';
print '9829: Ending read of selected calc resource files';
read -once chi;
print '9829: read -once chi';
read -once intfile;
print '9830: read -once intfile';
read -once lucas;
print '9831: read -once lucas';
read -once lucas_tbl;
print '9832: read -once lucas_tbl';
read -once natnumset;
print '9833: read -once natnumset';
read -once repeat;
print '9834: read -once repeat';
read -once screen;
print '9835: read -once screen';
read -once linear;
print '9836: read -once linear';
print '9837: skipping read -once beer.cal because it is an infinite loop';
print '9838: skipping read -once hello.cal because it is an infinite loop';
print '9839: skipping read -once xx_print.cal because it is a printing demo';
read -once sumtimes;
print '9840: read -once sumtimes';
print '9841: Ending read of selected 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
}

404
cal/set8700.line Normal file
View File

@@ -0,0 +1,404 @@
##
## 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.2 $
## @(#) $Id: set8700.line,v 29.2 2006/06/20 09:29:16 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
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
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)
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})

186
cal/sumtimes.cal Normal file
View File

@@ -0,0 +1,186 @@
/*
* sumtimes - runtimes evaluating sums & squares of large lists and mats
*
* Copyright (C) 2006 Ernest Bowen
*
* 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: sumtimes.cal,v 29.1 2006/06/23 00:35:30 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/sumtimes.cal,v $
*
* Under source code control: 2006/06/22 17:29
* File existed as early as: 2006
*
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
global sumtimes_t0, sumtimes_t1, sumtimes_t2, sumtimes_t3;
global sumtimes_A, sumtimes_B;
config("tilde", 0),;
define timematsum(N) {
local n, s, p, ptop;
sumtimes_A = mat[N];
for (n = 0; n < N; n++) sumtimes_A[n] = rand(N);
ptop = &sumtimes_A[n-1];
sumtimes_t0 = runtime();
for (s = n = 0; n < N; n++) s += sumtimes_A[n];
sumtimes_t1 = runtime();
for (s = 0, p = &sumtimes_A[0]; p <= ptop; p++) s += *p;
sumtimes_t2 = runtime();
s = matsum(sumtimes_A);
sumtimes_t3 = runtime();
print "Matrix sum runtimes";
printf('\tStandard "for" loop:\t\t%.4f\n', sumtimes_t1 - sumtimes_t0);
printf('\t"For" loop using pointers:\t\t%.4f\n', sumtimes_t2 - sumtimes_t1);
printf('\tUsing builtin "matsum":\t\t%.4f\n', sumtimes_t3 - sumtimes_t2);
}
define timelistsum(N) {
local n, s;
sumtimes_A = makelist(N);
for (n = 0; n < N; n++) sumtimes_A[n] = rand(N);
sumtimes_t0 = runtime();
for (s = n = 0; n < N; n++) s += sumtimes_A[n];
sumtimes_t1 = runtime();
s = sum(sumtimes_A);
sumtimes_t2 = runtime();
print "List sum runtimes";
printf('\tStandard "for" loop:\t\t%.4f\n', sumtimes_t1 - sumtimes_t0);
printf('\tUsing builtin "sum":\t\t%.4f\n', sumtimes_t2 - sumtimes_t1);
}
define timematsort(N) {
local n;
sumtimes_A = mat[N];
for (n = 0; n < N; n++) sumtimes_A[n] = rand(N);
sumtimes_t0 = runtime();
sort(sumtimes_A);
sumtimes_t1 = runtime();
printf('\tMatrix sort runtime:\t\t%.4f\n', sumtimes_t1 - sumtimes_t0);
}
define timelistsort(N) {
local n;
sumtimes_A = makelist(N);
for (n = 0; n < N; n++) sumtimes_A[n] = rand(N);
sumtimes_t0 = runtime();
sort(sumtimes_A);
sumtimes_t1 = runtime();
printf('\tList sort runtime:\t\t%.4f\n', sumtimes_t1 - sumtimes_t0);
}
define timematreverse(N) {
local n;
sumtimes_A = mat[N];
for (n = 0; n < N; n++) sumtimes_A[n] = rand(N);
sumtimes_t0 = runtime();
reverse(sumtimes_A);
sumtimes_t1 = runtime();
printf('\tMatrix reverse runtime %.4f\n', sumtimes_t1 - sumtimes_t0);
}
define timelistreverse(N) {
local n;
sumtimes_A = makelist(N);
for (n = 0; n < N; n++) sumtimes_A[n] = rand(N);
sumtimes_t0 = runtime();
reverse(sumtimes_A);
sumtimes_t1 = runtime();
printf('\tList reverse runtime:\t\t%.4f\n', sumtimes_t1 - sumtimes_t0);
}
define timematssq(N) {
local n, s, p, ptop;
sumtimes_A = mat[N];
for (n = 0; n < N; n++) sumtimes_A[n] = rand(N);
ptop = &sumtimes_A[n-1];
sumtimes_t0 = runtime();
for (s = n = 0; n < N; n++) s += sumtimes_A[n]^2;
sumtimes_t1 = runtime();
for (s = 0, p = &sumtimes_A[0]; p <= ptop; p++) s += (*p)^2;
sumtimes_t2 = runtime();
print "Matrix sum of squares runtimes";
printf('\tStandard "for" loop:\t\t%.4f\n', sumtimes_t1 - sumtimes_t0);
printf('\t"For" loop using pointers:\t\t%.4f\n', sumtimes_t2 - sumtimes_t1);
}
define timelistssq(N) {
local n, s;
sumtimes_A = makelist(N);
for (n = 0; n < N; n++) sumtimes_A[n] = rand(N);
sumtimes_t0 = runtime();
for (s = n = 0; n < N; n++) s += sumtimes_A[n]^2;
sumtimes_t1 = runtime();
s = ssq(sumtimes_A);
sumtimes_t2 = runtime();
print "List sum of squares runtimes";
printf('\tStandard "for" loop:\t\t%.4f\n', sumtimes_t1 - sumtimes_t0);
printf('\tUsing builtin "ssq":\t\t%.4f\n', sumtimes_t2 - sumtimes_t1);
}
define timehmean(N, M = 10) {
local n, s, v1, v2;
sumtimes_A = makelist(N);
for (n = 0; n < N; n++) sumtimes_A[n] = rand(1, M);
sumtimes_t0 = runtime();
for (s = n = 0; n < N; n++) s += 1/sumtimes_A[n];
v1 = N/s;
sumtimes_t1 = runtime();
v2 = hmean(sumtimes_A);
sumtimes_t2 = runtime();
print v1, v2;
print "List harmonic meanruntimes";
printf('\tStandard "for" loop:\t\t%.4f\n', sumtimes_t1 - sumtimes_t0);
printf('\tUsing builtin "hmean":\t\t%.4f\n', sumtimes_t2 - sumtimes_t1);
}
define doalltimes(N) {
timematsum(N);
print;
timelistsum(N);
print;
timematssq(N);
print;
timelistssq(N);
print;
timematsort(N);
timelistsort(N);
timematreverse(N);
timelistreverse(N);
print;
}

View File

@@ -19,8 +19,8 @@
* 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: test2700.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.4 $
* @(#) $Id: test2700.cal,v 29.4 2006/06/25 22:06:23 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test2700.cal,v $
*
* Under source code control: 1995/11/01 22:52:25
@@ -41,8 +41,7 @@
*/
global defaultverbose = 1;
global err;
defaultverbose = 1;
define mknonnegreal() {
switch(rand(8)) {
@@ -89,11 +88,11 @@ define mkfrac() = rand(2) ? mkposfrac() : -mkposfrac();
define mksquarereal() = mknonnegreal()^2;
/*
* XXX - Should be able to do better than the following. For nonsquare
* positive integer less than 1e6, could use
* We might be able to do better than the following. For nonsquare
* positive integer less than 1e6, could use:
* x = rand(1, 1000);
* return rand(x^2 + 1, (x + 1)^2);
* Maybe could do
* Maybe could do:
* do
* x = mkreal_2700();
* while

View File

@@ -19,8 +19,8 @@
* 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: test3300.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.3 $
* @(#) $Id: test3300.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test3300.cal,v $
*
* Under source code control: 1995/12/02 04:27:41
@@ -30,8 +30,7 @@
*/
global defaultverbose = 1; /* default verbose value */
global err;
defaultverbose = 1; /* default verbose value */
define testi(str, n, N, verbose)
{

View File

@@ -19,8 +19,8 @@
* 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: test3400.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.3 $
* @(#) $Id: test3400.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test3400.cal,v $
*
* Under source code control: 1995/12/02 05:20:11
@@ -54,8 +54,7 @@
*/
global defaultverbose = 1; /* default verbose value */
global err;
defaultverbose = 1; /* default verbose value */
global pi1k = pi(1e-1000);

View File

@@ -19,8 +19,8 @@
* 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: test3500.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.3 $
* @(#) $Id: test3500.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test3500.cal,v $
*
* Under source code control: 1995/12/18 22:50:46
@@ -53,8 +53,7 @@
*/
global defaultverbose = 1; /* default verbose value */
global err;
defaultverbose = 1; /* default verbose value */
define testfrem(x,y,verbose)
{

View File

@@ -19,8 +19,8 @@
* 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: test4000.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.3 $
* @(#) $Id: test4000.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test4000.cal,v $
*
* Under source code control: 1996/03/13 02:38:45
@@ -75,8 +75,7 @@
*/
global defaultverbose = 1; /* default verbose value */
global err;
defaultverbose = 1; /* default verbose value */
/*
* test defaults

View File

@@ -19,8 +19,8 @@
* 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: test4100.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.4 $
* @(#) $Id: test4100.cal,v 29.4 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test4100.cal,v $
*
* Under source code control: 1996/03/13 03:53:22
@@ -70,18 +70,16 @@
*/
global defaultverbose = 1; /* default verbose value */
global err;
defaultverbose = 1; /* default verbose value */
/*
* test defaults
*/
global K1 = 2^17;
global K2 = 2^12;
global BASEB = 16;
global BASE = 2^BASEB;
global test4100_K1 = 2^17;
global test4100_K2 = 2^12;
global test4100_BASE = 2^config("baseb");
define rlen_4100(N) = rand(BASE^(N-1), BASE^N);
define rlen_4100(N) = rand(test4100_BASE^(N-1), test4100_BASE^N);
define olen(N)
{
@@ -234,7 +232,7 @@ define times(str,N,n,verbose)
m = olen(N);
m2 = m^2;
if (isnull(n)) {
n = ceil(K1/power(N,1.585));
n = ceil(test4100_K1/power(N,1.585));
if (verbose > 1)
printf("n = %d\n", n);
}
@@ -308,7 +306,7 @@ define powtimes(str, N1, N2, n, verbose)
N2 = 1;
if (isnull(n)) {
n = ceil(K2/power(N1, 1.585)/N2);
n = ceil(test4100_K2/power(N1, 1.585)/N2);
printf ("n = %d\n", n);
}
mat A[n];
@@ -316,8 +314,8 @@ define powtimes(str, N1, N2, n, verbose)
mat B[n];
v = olen(N1);
cp = config("pow2", 1);
crc = config("redc2", 1);
cp = config("pow2", 2);
crc = config("redc2", 2);
/* initialize redc and lastmod info */
@@ -346,7 +344,7 @@ define powtimes(str, N1, N2, n, verbose)
for (i = 0; i < n; i++)
z4 += rcpow(Ar[i], B[i], v);
trcsmall = round(runtime() - t, 4);
config("redc2", 1);
config("redc2", 2);
t = runtime();
for (i = 0; i < n; i++)
z5 += rcpow(Ar[i], B[i], v);
@@ -408,7 +406,7 @@ define inittimes(str,N,n,verbose)
}
m = 0;
if (isnull(n)) {
n = ceil(K1/N^2);
n = ceil(test4100_K1/N^2);
if (verbose > 1) {
printf ("n = %d\n", n);
}

View File

@@ -19,8 +19,8 @@
* 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.4 $
* @(#) $Id: test4600.cal,v 29.4 2001/04/10 22:09:02 chongo Exp $
* @(#) $Revision: 29.5 $
* @(#) $Id: test4600.cal,v 29.5 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test4600.cal,v $
*
* Under source code control: 1996/07/02 20:04:40
@@ -30,8 +30,7 @@
*/
global defaultverbose = 1 /* default verbose value */
global err;
defaultverbose = 1; /* default verbose value */
/*
* test globals

View File

@@ -19,8 +19,8 @@
* 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: test5100.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.3 $
* @(#) $Id: test5100.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test5100.cal,v $
*
* Under source code control: 1996/12/02 23:57:10
@@ -30,8 +30,7 @@
*/
global defaultverbose = 1; /* default verbose value */
global err;
defaultverbose = 1; /* default verbose value */
/*
* We test the new code generator declaration scope and order.

View File

@@ -19,8 +19,8 @@
* 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: test5200.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Revision: 29.3 $
* @(#) $Id: test5200.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test5200.cal,v $
*
* Under source code control: 1997/02/07 02:48:10
@@ -30,8 +30,7 @@
*/
global defaultverbose = 1; /* default verbose value */
global err;
defaultverbose = 1; /* default verbose value */
/*
* test the fix of a global/static bug

19
calc.c
View File

@@ -1,7 +1,7 @@
/*
* calc - arbitrary precision calculator
*
* Copyright (C) 1999-2004 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
*
@@ -19,8 +19,8 @@
* 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.11 $
* @(#) $Id: calc.c,v 29.11 2004/02/23 14:04:01 chongo Exp $
* @(#) $Revision: 29.13 $
* @(#) $Id: calc.c,v 29.13 2006/05/19 15:26:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.c,v $
*
* Under source code control: 1990/02/15 01:48:11
@@ -111,7 +111,7 @@ main(int argc, char **argv)
BOOL done = FALSE;
BOOL havearg;
BOOL haveendstr;
int len;
size_t len;
/*
* parse args
@@ -393,7 +393,7 @@ main(int argc, char **argv)
}
/* XXX What if *cp = '\''? */
*bp++ = '\'';
strcpy(bp, cp);
strncpy(bp, cp, len+1);
bp += len;
*bp++ = '\'';
cp += len;
@@ -452,16 +452,19 @@ main(int argc, char **argv)
}
while (index < maxindex) {
size_t cplen;
if (cmdlen > 0)
cmdbuf[cmdlen++] = ' ';
newcmdlen = cmdlen + strlen(cp);
cplen = strlen(cp);
newcmdlen = cmdlen + cplen;
if (newcmdlen > MAXCMD) {
fprintf(stderr,
"%s: commands too long\n",
program);
exit(1);
}
strcpy(cmdbuf + cmdlen, cp);
strncpy(cmdbuf + cmdlen, cp, cplen+1);
cmdlen = newcmdlen;
index++;
if (index < maxindex)
@@ -579,7 +582,7 @@ main(int argc, char **argv)
if (run_state == RUN_PRE_CMD_ARGS) {
if (havecommands) {
set_run_state(RUN_CMD_ARGS);
(void) openstring(cmdbuf, (long) strlen(cmdbuf));
(void) openstring(cmdbuf, strlen(cmdbuf));
getcommands(FALSE);
closeinput();
}

15
calc.h
View File

@@ -1,7 +1,7 @@
/*
* 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
* 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.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* @(#) $Revision: 29.11 $
* @(#) $Id: calc.h,v 29.11 2003/08/26 04:36:10 chongo Exp $
* @(#) $Revision: 29.18 $
* @(#) $Id: calc.h,v 29.18 2006/05/21 07:28:54 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.h,v $
*
* Under source code control: 1990/02/15 01:48:31
@@ -98,12 +98,13 @@
#define FILEID_STDIN ((FILEID) 0)
#define FILEID_STDOUT ((FILEID) 1)
#define FILEID_STDERR ((FILEID) 2)
#define FILEID_NONE ((FILEID) -1)
#define FILEID_NONE ((FILEID) -1) /* must be < 0 */
/*
* File I/O routines.
*/
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 BOOL validid(FILEID id);
extern DLL BOOL errorid(FILEID id);
@@ -148,7 +149,7 @@ extern DLL void trimconstants(void);
/*
* 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 opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok);
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 i_flag; /* TRUE => try to go interactive after error */
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 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 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 allow_read; /* FALSE => dont open any files for reading */

154
calc.man
View File

@@ -15,8 +15,8 @@
.\" 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.15 $
.\" @(#) $Id: calc.man,v 29.15 2004/08/03 05:06:22 chongo Exp $
.\" @(#) $Revision: 29.20 $
.\" @(#) $Id: calc.man,v 29.20 2006/06/01 12:04:16 chongo Exp $
.\" @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.man,v $
.\"
.\" Under source code control: 1991/07/23 05:48:26
@@ -51,7 +51,7 @@ calc \- arbitrary precision calculator
.RB [ \-s ]
.RB [ \-u ]
.RB [ \-v ]
.RB [ calc_cmd\ \&.\|.\|. ]
.RB [ [\-\-]\ calc_cmd\ \&.\|.\|. ]
.in -5n
.sp
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
@@ -63,8 +63,11 @@ CALC OPTIONS
.TP
.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.
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
For example:
.sp 1
@@ -76,7 +79,7 @@ calc read many_errors.cal
.sp 1
will cause
.B calc
to abort on the first error, whereas:
to abort on the first syntax error, whereas:
.sp 1
.in +5n
.nf
@@ -88,7 +91,7 @@ will
cause
.B calc
to try to process each line being read
despite the errors that it encounters.
despite the scan/parse errors that it encounters.
.sp 1
By default, calc startup resource files are silently
ignored if not found.
@@ -183,6 +186,80 @@ help config
Ignore any environment variables on startup.
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
.B \-h
Print a help message. This option implies
@@ -361,6 +438,21 @@ Disable buffering of stdin and stdout.
Print the
.B calc
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
\&
@@ -403,32 +495,50 @@ calc 23 + 47
.fi
.in -5n
.sp 1
should respond with display of 70, but
will print 70.
However, command lines will have problems:
.sp 1
.in +5n
.nf
calc 23 * 47
.sp 1
calc -23 + 47
.fi
.in -5n
.sp 1
may fail.
Such cases can usually be made to work as expected by
enclosing the command between single marks as in:
The first example above fails because the shell interprets the '*'
as a file glob.
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
.in +5n
.nf
calc "23 * 47"
.fi
.in -5n
calc '23 * 47'
.sp 1
and
.sp 1
.in +5n
.nf
calc "print sqrt(2), exp(1)"
.fi
.in -5n
.sp
.sp 1
or in parentheses and quotes to avoid leading \-'s as in:
.sp 1
.in +5n
.nf
calc '(-23 + 47)'
.fi
.in -5n
.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
shells like
.BI csh (1)
@@ -578,7 +688,7 @@ help config
.br
SHELL SCRIPT MODE
.PP
If first line of an executable file begins
If the first line of an executable file begins
.B #!
followed by the absolute pathname of the
.B calc
@@ -596,10 +706,10 @@ the rest of the file will be processed in
.BR "shell script mode" .
Note that
.B \-f
must be the first \-flag on the ``#!'' line.
must at the end of the intiial ``#!'' line.
Any other optional
.B "other_flags"
must come after
must come before
the
.BR \-f .
.sp 1
@@ -617,8 +727,6 @@ the later lines within the script itself.
In
.BR "shell script mode" ,
.B \-s
(lower case
.BR \-s )
is always assumed.
In addition,
.B \-d

View File

@@ -2,7 +2,7 @@
#
# calc.spec.in - template specfile for calc
#
# Copyright (C) 2003-2004 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
# 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.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
#
# @(#) $Revision: 29.13 $
# @(#) $Id: calc.spec.in,v 29.13 2004/02/23 14:04:01 chongo Exp $
# @(#) $Revision: 29.15 $
# @(#) $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 $
#
# Under source code control: 2003/02/16 20:21:39
@@ -30,7 +30,7 @@
# BUGS
# - 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
# header files are defined twice - rpmbuild bug or bug in specfile conf???
@@ -48,11 +48,11 @@ BuildRoot: %{_tmppath}/%{name}-root
%description
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
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
@@ -92,6 +92,7 @@ rm -rf %{buildroot}
%{_datadir}/%{name}/bindings
%{_datadir}/%{name}/README
%{_datadir}/%{name}/*.cal
%{_datadir}/%{name}/*.line
%files devel
%defattr(-, root, root)
@@ -100,6 +101,12 @@ rm -rf %{buildroot}
%attr(644, root, root) %{_libdir}/*.a
%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
- Release of calc-2.11.7-2
- Fixed attributes on include and lib calc-devel files

View File

@@ -1,7 +1,7 @@
#
# calcerr - error codes and messages
#
# Copyright (C) 1999 Ernest Bowen
# Copyright (C) 1999-2006 Ernest Bowen
#
# 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
@@ -17,8 +17,8 @@
# 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.4 $
# @(#) $Id: calcerr.tbl,v 29.4 2001/04/10 22:06:46 chongo Exp $
# @(#) $Revision: 29.9 $
# @(#) $Id: calcerr.tbl,v 29.9 2006/06/25 20:33:26 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/calcerr.tbl,v $
#
# 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_RSEARCH5 Cannot find fsize or fpos 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_STRERROR1 Bad argument type 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_COPY15 No-copy-from source 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_COPYF2 fseek or fsize failure for copy
E_COPYF3 fwrite error for copy
E_COPYF4 fread error for copy
E_PROTECT1 Non-variable first argument for protect
E_PROTECT2 Non-integer second argument for protect
E_PROTECT3 Out-of-range second argument for protect
E_PROTECT2 Bad second argument for protect
E_PROTECT3 Bad third argument for protect
E_MATFILL3 No-copy-to destination for matfill
E_MATFILL4 No-assign-from source for matfill
E_MATTRACE1 Non-matrix argument for mattrace
@@ -393,3 +393,55 @@ E_BERN Bad argument for bern
E_EULER Bad argument for euler
E_SLEEP Bad argument for sleep
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-lvalue argument for swap
E_QUOMOD1 Non-lvalue argument 3 or 4 for quomod
E_QUOMOD2 Non-real-number arg 1 or 2 or bad arg 5 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
#
# 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
# 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.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
#
# @(#) $Revision: 29.2 $
# @(#) $Id: check.awk,v 29.2 2000/06/07 14:02:13 chongo Exp $
# @(#) $Revision: 29.3 $
# @(#) $Id: check.awk,v 29.3 2006/05/20 19:43:39 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/check.awk,v $
#
# Under source code control: 1996/05/25 22:07:58
@@ -64,7 +64,7 @@ NF == 0 {
end_seen = 1;
}
$1 ~ /^[0-9]+:/ {
$1 ~ /^[0-9]+:/ || $1 ~ /^[0-9]+-[0-9]*:/ {
if (error > 0) {
if (havebuf2) {
print buf2;

93
cmath.h
View File

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

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

View File

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

164
config.c
View File

@@ -1,7 +1,7 @@
/*
* config - configuration routines
*
* Copyright (C) 1999-2004 David I. Bell and Landon Curt Noll
* Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
*
* Primary author: David I. Bell
*
@@ -19,8 +19,8 @@
* 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.14 $
* @(#) $Id: config.c,v 29.14 2004/02/25 23:56:13 chongo Exp $
* @(#) $Revision: 29.22 $
* @(#) $Id: config.c,v 29.22 2006/06/25 22:05:38 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/config.c,v $
*
* Under source code control: 1991/07/20 00:21:56
@@ -97,6 +97,9 @@ NAMETYPE configs[] = {
{"compile_custom", CONFIG_COMPILE_CUSTOM},
{"allow_custom", CONFIG_ALLOW_CUSTOM},
{"version", CONFIG_VERSION},
{"baseb", CONFIG_BASEB},
{"redecl_warn", CONFIG_REDECL_WARN},
{"dupvar_warn", CONFIG_DUPVAR_WARN},
{NULL, 0}
};
@@ -159,7 +162,10 @@ CONFIG oldstd = { /* backward compatible standard configuration */
FALSE, /* compiled without -DCUSTOM */
#endif
&allow_custom, /* *TRUE=> custom functions are enabled */
NULL /* version */
NULL, /* version */
BASEB, /* base for calculations */
TRUE, /* warn when redeclaring */
TRUE, /* warn when variable names collide */
};
CONFIG newstd = { /* new non-backward compatible configuration */
MODE_INITIAL, /* current output mode */
@@ -216,7 +222,10 @@ CONFIG newstd = { /* new non-backward compatible configuration */
FALSE, /* compiled without -DCUSTOM */
#endif
&allow_custom, /* *TRUE=> custom functions are enabled */
NULL /* version */
NULL, /* version */
BASEB, /* base for calculations */
TRUE, /* warn when redeclaring */
TRUE, /* warn when variable names collide */
};
CONFIG *conf = NULL; /* loaded in at startup - current configuration */
@@ -405,7 +414,8 @@ lookup_name(NAMETYPE *set, long val)
/*
* Check whether VALUE at vp is a LEN (32-bit signed integer) and if so,
* copy that integer to lp.
* Return: 1, 2, 0, or -1 XXX
*
* Return: 1 ==> not an integer, 2 ==> int > 2^31, 0 ==> OK, -1 ==> error
*/
static int
@@ -432,7 +442,7 @@ setconfig(int type, VALUE *vp)
NUMBER *q;
CONFIG *newconf; /* new configuration to set */
long temp;
LEN len;
LEN len = 0;
char *p;
switch (type) {
@@ -527,7 +537,7 @@ setconfig(int type, VALUE *vp)
break;
case CONFIG_MUL2:
if (getlen(vp, &len)) {
if (getlen(vp, &len) || len < 0 || len == 1) {
math_error("Bad value for mul2");
/*NOTREACHED*/
}
@@ -537,7 +547,7 @@ setconfig(int type, VALUE *vp)
break;
case CONFIG_SQ2:
if (getlen(vp, &len)) {
if (getlen(vp, &len) || len < 0 || len == 1) {
math_error("Bad value for sq2");
/*NOTREACHED*/
}
@@ -547,7 +557,7 @@ setconfig(int type, VALUE *vp)
break;
case CONFIG_POW2:
if (getlen(vp, &len)) {
if (getlen(vp, &len) || len < 0 || len == 1) {
math_error("Bad value for pow2");
/*NOTREACHED*/
}
@@ -557,7 +567,7 @@ setconfig(int type, VALUE *vp)
break;
case CONFIG_REDC2:
if (getlen(vp, &len)) {
if (getlen(vp, &len) || len < 0 || len == 1) {
math_error("Bad value for redc2");
/*NOTREACHED*/
}
@@ -722,7 +732,7 @@ setconfig(int type, VALUE *vp)
math_error("Cannot duplicate new prompt");
/*NOTREACHED*/
}
strcpy(p, vp->v_str->s_str);
strncpy(p, vp->v_str->s_str, vp->v_str->s_len + 1);
free(conf->prompt1);
conf->prompt1 = p;
break;
@@ -737,7 +747,7 @@ setconfig(int type, VALUE *vp)
math_error("Cannot duplicate new more prompt");
/*NOTREACHED*/
}
strcpy(p, vp->v_str->s_str);
strncpy(p, vp->v_str->s_str, vp->v_str->s_len + 1);
free(conf->prompt2);
conf->prompt2 = p;
break;
@@ -899,6 +909,38 @@ setconfig(int type, VALUE *vp)
math_error("The version config parameter is read-only");
/*NOTREACHED*/
case CONFIG_BASEB:
math_error("The baseb config parameter is read-only");
/*NOTREACHED*/
case CONFIG_REDECL_WARN:
if (vp->v_type == V_NUM) {
q = vp->v_num;
conf->redecl_warn = !qiszero(q);
} else if (vp->v_type == V_STR) {
temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) {
math_error("Illegal truth value for redecl_warn");
/*NOTREACHED*/
}
conf->redecl_warn = (int)temp;
}
break;
case CONFIG_DUPVAR_WARN:
if (vp->v_type == V_NUM) {
q = vp->v_num;
conf->dupvar_warn = !qiszero(q);
} else if (vp->v_type == V_STR) {
temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) {
math_error("Illegal truth value for dupvar_warn");
/*NOTREACHED*/
}
conf->dupvar_warn = (int)temp;
}
break;
default:
math_error("Setting illegal config parameter");
/*NOTREACHED*/
@@ -1110,20 +1152,12 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
break;
case CONFIG_TILDE:
if (cfg->tilde_ok) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
i = (cfg->tilde_ok ? 1 : 0);
break;
case CONFIG_TAB:
if (cfg->tab_ok) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
i = (cfg->tab_ok ? 1 : 0);
break;
case CONFIG_QUOMOD:
i = cfg->quomod;
@@ -1162,20 +1196,12 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
break;
case CONFIG_LEADZERO:
if (cfg->leadzero) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
i = (cfg->leadzero ? 1 : 0);
break;
case CONFIG_FULLZERO:
if (cfg->fullzero) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
i = (cfg->fullzero ? 1 : 0);
break;
case CONFIG_MAXSCAN:
i = cfg->maxscancount;
@@ -1196,12 +1222,8 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
break;
case CONFIG_BLKVERBOSE:
if (cfg->blkverbose) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
i = (cfg->blkverbose ? 1 : 0);
break;
case CONFIG_BLKBASE:
vp->v_type = V_STR;
@@ -1236,12 +1258,8 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
break;
case CONFIG_VERBOSE_QUIT:
if (cfg->verbose_quit) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
i = (cfg->verbose_quit ? 1 : 0);
break;
case CONFIG_CTRL_D:
vp->v_type = V_STR;
@@ -1272,40 +1290,24 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
return;
case CONFIG_WINDOWS:
if (cfg->windows) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
i = (cfg->windows ? 1 : 0);
break;
case CONFIG_CYGWIN:
if (cfg->cygwin) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
i = (cfg->cygwin ? 1 : 0);
break;
case CONFIG_COMPILE_CUSTOM:
if (cfg->compile_custom) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
i = (cfg->compile_custom ? 1 : 0);
break;
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;
i = (*(cfg->allow_custom) ? 1 : 0);
break;
case CONFIG_VERSION:
vp->v_type = V_STR;
@@ -1316,6 +1318,18 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
}
return;
case CONFIG_BASEB:
i = BASEB;
break;
case CONFIG_REDECL_WARN:
i = (cfg->redecl_warn ? 1 : 0);
break;
case CONFIG_DUPVAR_WARN:
i = (cfg->dupvar_warn ? 1 : 0);
break;
default:
math_error("Getting illegal CONFIG element");
/*NOTREACHED*/
@@ -1420,5 +1434,7 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
(cfg1->version == NULL && cfg2->version != NULL) ||
(cfg1->version != NULL && cfg2->version == NULL) ||
(cfg1->version != NULL && cfg2->version != NULL &&
strcmp(cfg1->version, cfg2->version) != 0);
strcmp(cfg1->version, cfg2->version) != 0) ||
cfg1->baseb != cfg2->baseb;
}

View File

@@ -19,8 +19,8 @@
* 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.17 $
* @(#) $Id: config.h,v 29.17 2004/02/25 23:56:13 chongo Exp $
* @(#) $Revision: 29.20 $
* @(#) $Id: config.h,v 29.20 2006/06/25 22:05:38 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/config.h,v $
*
* Under source code control: 1995/11/01 22:20:17
@@ -94,6 +94,9 @@
#define CONFIG_CYGWIN 40
#define CONFIG_COMPILE_CUSTOM 41
#define CONFIG_ALLOW_CUSTOM 42
#define CONFIG_BASEB 43
#define CONFIG_REDECL_WARN 44
#define CONFIG_DUPVAR_WARN 45
/*
@@ -150,8 +153,8 @@ struct config {
BOOL blkverbose; /* TRUE => print all lines if a block */
int blkbase; /* block output base */
int blkfmt; /* block output style */
long calc_debug; /* internal debug, see CALC_DEBUG_XXX below */
long resource_debug; /* resource debug, see RSCDBG_XXX below */
long calc_debug; /* internal debug, see CALC_DEBUG_XYZ below */
long resource_debug; /* resource debug, see RSCDBG_XYZ below */
long user_debug; /* user defined debug value: 0 default */
BOOL verbose_quit; /* TRUE => print Quit or abort executed msg */
int ctrl_d; /* see CTRL_D_xyz below */
@@ -162,6 +165,9 @@ struct config {
BOOL compile_custom; /* TRUE => compiled with -DCUSTOM */
BOOL *allow_custom; /* ptr to if custom functions are allowed */
char *version; /* calc version string */
int baseb; /* base for calculations */
BOOL redecl_warn; /* TRUE => warn of redeclating variables */
BOOL dupvar_warn; /* TRUE => warn of var name collisions */
};
typedef struct config CONFIG;

View File

@@ -1,7 +1,7 @@
/*
* 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
* the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,9 +17,9 @@
* 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.4 $
* @(#) $Id: custom.c,v 29.4 2004/02/25 23:54:40 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/../RCS/custom.c,v $
* @(#) $Revision: 29.6 $
* @(#) $Id: custom.c,v 29.6 2006/05/19 15:26:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/custom.c,v $
*
* Under source code control: 1997/03/03 04:53:08
* File existed as early as: 1997
@@ -189,7 +189,7 @@ customhelp(char *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) {
math_error("bad malloc of customname");
/*NOTREACHED*/

View File

@@ -41,7 +41,6 @@ Step 1: Do some background work
custom.c
custom.h
custom/custom.h
custom/custtbl.c
custom/c_*.[ch]
custom/*.cal
@@ -648,8 +647,8 @@ Step 12: Contribute
## 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.4 $
## @(#) $Id: HOW_TO_ADD,v 29.4 2004/07/29 08:38:05 chongo Exp $
## @(#) $Revision: 29.5 $
## @(#) $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 $
##
## Under source code control: 1997/03/10 03:03:21

View File

@@ -1,7 +1,7 @@
/*
* c_argv - a custom function display info about its args
*
* Copyright (C) 1999-2004 Landon Curt Noll
* Copyright (C) 1999-2006 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
@@ -17,8 +17,8 @@
* 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.4 $
* @(#) $Id: c_argv.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Revision: 29.8 $
* @(#) $Id: c_argv.c,v 29.8 2006/06/25 22:06:23 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_argv.c,v $
*
* Under source code control: 1997/03/09 20:27:37
@@ -123,12 +123,9 @@ c_argv(char UNUSED *name, int count, VALUE **vals)
case V_BLOCK: /* memory block */
type = "octet_block";
break;
#if 0
/* XXX - V_OCTET is subject to change */
case V_OCTET: /* octet (unsigned char) */
type = "octet";
break;
#endif
default:
type = "unknown";
break;
@@ -152,10 +149,10 @@ c_argv(char UNUSED *name, int count, VALUE **vals)
/* getsize error */
printf("\tsize=unknown");
}
printf("\tsizeof=%ld\n", lsizeof(vals[i]));
printf("\tsizeof=%ld\n", (long int)lsizeof(vals[i]));
} else {
printf("\tsize=%ld\tsizeof=%ld\n",
elm_count(vals[i]), lsizeof(vals[i]));
elm_count(vals[i]), (long int)lsizeof(vals[i]));
}
}

View File

@@ -17,8 +17,8 @@
* 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 $
* @(#) $Revision: 29.5 $
* @(#) $Id: c_pmodm127.c,v 29.5 2006/06/25 22:08:42 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_pmodm127.c,v $
*
* Under source code control: 2004/07/28 22:12:25
@@ -156,7 +156,11 @@ c_pmodm127(char UNUSED *name, int UNUSED count, VALUE **vals)
#else
zsquare(result.v_num->num, &temp); /* square */
#endif
/* XXX - we could manually shift to speed up a tiny bit */
/*
* We could manually shift here, but this would o speed
* up the operation only a very tiny bit at the expense
* of a bunch of special code.
*/
zfree(result.v_num->num);
zshift(temp, 1, &result.v_num->num); /* times 2 */
zfree(temp);

View File

@@ -17,8 +17,8 @@
* 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.10 $
* @(#) $Id: c_sysinfo.c,v 29.10 2004/03/31 05:02:10 chongo Exp $
* @(#) $Revision: 29.11 $
* @(#) $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 $
*
* Under source code control: 1997/03/09 23:14:40
@@ -191,6 +191,7 @@ c_sysinfo(char UNUSED *name, int count, VALUE **vals)
* we will return NULL if a value was not found
*/
result.v_type = V_NULL;
result.v_subtype = V_NOSUBTYPE;
/*
* case 0: if no args, then dump the table with no values

View File

@@ -17,8 +17,8 @@
* 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: custtbl.c,v 29.3 2004/07/29 08:37:53 chongo Exp $
* @(#) $Revision: 29.4 $
* @(#) $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 $
*
* Under source code control: 1997/03/09 02:28:54
@@ -106,7 +106,7 @@ CONST struct custom cust[] = {
{ "sysinfo", "return a calc #define value",
0, 1, c_sysinfo },
{ "pzasusb8", "print ZCALUE as USB8",
{ "pzasusb8", "print ZVALUE as USB8",
0, 1, c_pzasusb8 },
{ "pmodm127", "calculate q mod 2^(2^127-1)",

View File

@@ -19,7 +19,7 @@ DESCRIPTION
custom("sysinfo", "BASEB")
custom("sysinfo", "CALC_BYTE_ORDER")
foe details.
for details.
This custom function is intented for testing of the general
custom interface.
@@ -65,8 +65,8 @@ SEE ALSO
## 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: pzasusb8,v 29.2 2000/06/07 14:03:03 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: pzasusb8,v 29.3 2005/10/18 11:18:34 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/pzasusb8,v $
##
## Under source code control: 1999/10/06 04:05:43

691
file.c
View File

@@ -1,7 +1,7 @@
/*
* file - file I/O routines callable by users
*
* Copyright (C) 1999-2004 David I. Bell and Landon Curt Noll
* Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
*
* Primary author: David I. Bell
*
@@ -19,8 +19,8 @@
* 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.9 $
* @(#) $Id: file.c,v 29.9 2004/02/23 14:04:01 chongo Exp $
* @(#) $Revision: 29.15 $
* @(#) $Id: file.c,v 29.15 2006/05/22 19:04:45 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/file.c,v $
*
* 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] = {
{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,
"(stdout)", FALSE, TRUE, 'w', "w"},
"(stdout)", FALSE, TRUE, FALSE, FALSE, 'w', "w"},
{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
* 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
* FILEID_NONE if the open failed.
* init_fileio - initialize a FILEIO structure
*
* This function initializes a calc FILEIO structure. It will optionally
* 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:
* 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
openid(char *name, char *mode)
@@ -206,9 +333,9 @@ openid(char *name, char *mode)
struct stat sbuf; /* file status */
int i;
/* find the next open slot in the files array */
if (idnum >= MAXFILES)
return -E_FOPEN3;
return -E_MANYOPEN;
fiop = &files[3];
for (i = 3; i < MAXFILES; fiop++,i++) {
if (fiop->name == NULL)
@@ -217,8 +344,8 @@ openid(char *name, char *mode)
if (i == MAXFILES)
math_error("This should not happen in openid()!!!");
/* open the file */
fp = f_open(name, mode);
if (fp == NULL) {
return FILEID_NONE;
}
@@ -227,50 +354,88 @@ openid(char *name, char *mode)
/*NOTREACHED*/
}
fiop->name = (char *)malloc(strlen(name) + 1);
if (fiop->name == NULL) {
math_error("No memory for filename");
/*NOTREACHED*/
}
/* get a new FILEID */
id = ++lastid;
ioindex[idnum++] = i;
strcpy(fiop->name, name);
fiop->id = id;
fiop->fp = fp;
fiop->dev = sbuf.st_dev;
fiop->inode = sbuf.st_ino;
fiop->reading = TRUE;
fiop->writing = TRUE;
fiop->action = 0;
/* initialize FILEIO structure */
init_fileio(fiop, name, mode, &sbuf, id, fp);
/*
* 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;
/* return calc open file ID */
return id;
}
/*
* openpathid - open the specified abse filename, or relative filename along a search path
*
* given:
* name file name
* mode open mode (one of {r,w,a}{,b}{,+})
* pathlist list of colon separated paths (or NULL)
*
* 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
openpathid(char *name, char *mode, char *pathlist)
{
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;
}
@@ -279,16 +444,20 @@ openid(char *name, char *mode)
* reopenid - reopen a FILEID
*
* given:
* id FILEID to reopen
* mode new mode to open as
* name name of new file
* id FILEID to reopen
* mode new mode to open as
* 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
reopenid(FILEID id, char *mode, char *name)
{
FILEIO *fiop; /* file structure */
FILE *fp;
char *newname;
struct stat sbuf;
int i;
@@ -299,8 +468,8 @@ reopenid(FILEID id, char *mode, char *name)
/*NOTREACHED*/
}
/* reopen the file */
fiop = NULL;
for (i = 3; i < idnum; i++) {
fiop = &files[ioindex[i]];
if (fiop->id == id)
@@ -344,57 +513,23 @@ reopenid(FILEID id, char *mode, char *name)
return FILEID_NONE;
}
}
if (fstat(fileno(fp), &sbuf) < 0) {
math_error("bad fstat");
/*NOTREACHED*/
}
if (name) {
newname = (char *)malloc(strlen(name) + 1);
if (newname == NULL) {
math_error("No memory for filename");
/*NOTREACHED*/
/* initialize FILEIO structure */
if (name == NULL) {
if (fiop->name == NULL) {
math_error("old and new reopen filenames are NULL");
}
if (fiop->name)
free(fiop->name);
strcpy(newname, name);
fiop->name = newname;
} else if (fiop->name != NULL) {
free(fiop->name);
fiop->name = NULL;
}
fiop->fp = fp;
fiop->dev = sbuf.st_dev;
fiop->inode = sbuf.st_ino;
fiop->reading = TRUE;
fiop->writing = TRUE;
fiop->action = 0;
init_fileio(fiop, name, mode, &sbuf, id, fp);
/*
* 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 calc open file ID */
return id;
}
@@ -810,7 +945,7 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
VALUE *vp;
char *str;
int ch;
long len;
size_t len;
int oldmode, newmode;
long olddigits, newdigits;
long width, precision;
@@ -877,36 +1012,36 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
newdigits = precision;
switch (ch) {
case 's':
printstring = TRUE;
case 'c':
printchar = TRUE;
case 'd':
break;
case 'f':
newmode = MODE_REAL;
break;
case 'e':
newmode = MODE_EXP;
break;
case 'r':
newmode = MODE_FRAC;
break;
case 'o':
newmode = MODE_OCTAL;
break;
case 'x':
newmode = MODE_HEX;
break;
case 'b':
newmode = MODE_BINARY;
break;
case 0:
math_setfp(stdout);
return 0;
default:
math_chr(ch);
continue;
case 's':
printstring = TRUE;
case 'c':
printchar = TRUE;
case 'd':
break;
case 'f':
newmode = MODE_REAL;
break;
case 'e':
newmode = MODE_EXP;
break;
case 'r':
newmode = MODE_FRAC;
break;
case 'o':
newmode = MODE_OCTAL;
break;
case 'x':
newmode = MODE_HEX;
break;
case 'b':
newmode = MODE_BINARY;
break;
case 0:
math_setfp(stdout);
return 0;
default:
math_chr(ch);
continue;
}
if (--count < 0) {
@@ -927,41 +1062,41 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
if ((width == 0) ||
(vp->v_type == V_MAT) || (vp->v_type == V_LIST)) {
switch(vp->v_type) {
case V_OCTET:
if (printstring)
math_str((char *)vp->v_octet);
else if (printchar)
math_chr(*vp->v_octet);
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:
case V_OCTET:
if (printstring)
math_str((char *)vp->v_octet);
else if (printchar)
math_chr(*vp->v_octet);
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);
}
math_setmode(oldmode);
@@ -1014,13 +1149,13 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
if (strchr(str, '\n'))
width = 0;
len = strlen(str);
while (!didneg && (width > len)) {
while (!didneg && ((size_t)width > len)) {
width--;
math_chr(' ');
}
math_str(str);
free(str);
while (didneg && (width > len)) {
while (didneg && ((size_t)width > len)) {
width--;
math_chr(' ');
}
@@ -1414,52 +1549,52 @@ fseekid(FILEID id, ZVALUE offset, int whence)
/* seek depending on whence */
switch (whence) {
case 0:
/* construct seek position, off = offset */
if (zisneg(offset))
return -3;
off = z2filepos(offset);
case 0:
/* construct seek position, off = offset */
if (zisneg(offset))
return -3;
off = z2filepos(offset);
/* seek there */
ret = f_seek_set(fiop->fp, &off);
break;
/* seek there */
ret = f_seek_set(fiop->fp, &off);
break;
case 1:
/* construct seek position, off = cur+offset */
f_tell(fiop->fp, &off);
cur = filepos2z(off);
zadd(cur, offset, &tmp);
zfree(cur);
if (zisneg(tmp)) {
zfree(tmp);
return -3;
}
off = z2filepos(tmp);
case 1:
/* construct seek position, off = cur+offset */
f_tell(fiop->fp, &off);
cur = filepos2z(off);
zadd(cur, offset, &tmp);
zfree(cur);
if (zisneg(tmp)) {
zfree(tmp);
return -3;
}
off = z2filepos(tmp);
zfree(tmp);
/* seek there */
ret = f_seek_set(fiop->fp, &off);
break;
/* seek there */
ret = f_seek_set(fiop->fp, &off);
break;
case 2:
/* construct seek position, off = len+offset */
if (get_open_siz(fiop->fp, &cur) < 0)
return -4;
zadd(cur, offset, &tmp);
zfree(cur);
if (zisneg(tmp)) {
zfree(tmp);
return -3;
}
off = z2filepos(tmp);
case 2:
/* construct seek position, off = len+offset */
if (get_open_siz(fiop->fp, &cur) < 0)
return -4;
zadd(cur, offset, &tmp);
zfree(cur);
if (zisneg(tmp)) {
zfree(tmp);
return -3;
}
off = z2filepos(tmp);
zfree(tmp);
/* seek there */
ret = f_seek_set(fiop->fp, &off);
break;
/* seek there */
ret = f_seek_set(fiop->fp, &off);
break;
default:
return -5;
default:
return -5;
}
return ret;
}
@@ -1828,7 +1963,7 @@ showfiles(void)
FILE *fp;
struct stat sbuf;
ino_t inodes[MAXFILES];
long sizes[MAXFILES];
off_t sizes[MAXFILES];
int i, j;
for (i = 0; i < idnum; i++) {
@@ -1840,7 +1975,7 @@ showfiles(void)
sizes[i] = -1;
} else {
inodes[i] = sbuf.st_ino;
sizes[i] = (long) sbuf.st_size;
sizes[i] = sbuf.st_size;
}
}
for (i = 0; i < idnum; i++) {
@@ -1853,7 +1988,7 @@ showfiles(void)
math_chr('\n');
continue;
}
printf(" size = %ld\n", sizes[i]);
printf(" size = %lld\n", (long long int)sizes[i]);
for (j = i + 1; j < idnum; j++) {
if (listed[j] || sizes[j] == -1)
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 */
int width;
VALUE *var; /* lvalue to be assigned to */
short subtype; /* for var->v_subtype */
unsigned short subtype; /* for var->v_subtype */
FILEPOS cur; /* current location */
if (feof(fp))
@@ -2083,75 +2218,75 @@ fscanfile(FILE *fp, char *fmt, int count, VALUE **vals)
f = *fmt++;
}
switch (f) {
case 'c':
if (width == 0)
width = 1;
getscanfield(fp,skip,width,0,NULL,&str);
break;
case 's':
getscanwhite(fp,1,0,6,NULL);
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");
case 'c':
if (width == 0)
width = 1;
getscanfield(fp,skip,width,0,NULL,&str);
break;
case 's':
getscanwhite(fp,1,0,6,NULL);
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;
}
if (!skip) {
assnum++;

21
file.h
View File

@@ -1,7 +1,7 @@
/*
* 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
*
@@ -19,8 +19,8 @@
* 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.5 $
* @(#) $Id: file.h,v 29.5 2001/06/08 21:00:58 chongo Exp $
* @(#) $Revision: 29.8 $
* @(#) $Id: file.h,v 29.8 2006/05/19 15:26:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/file.h,v $
*
* Under source code control: 1996/05/24 05:55:58
@@ -53,8 +53,10 @@ typedef struct {
char *name; /* file name */
BOOL reading; /* TRUE if opened for reading */
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 mode[sizeof("rb+")];/* open mode */
char mode[sizeof("rb+")+1];/* open mode */
} FILEIO;
@@ -89,11 +91,12 @@ typedef struct {
/*
* external functions
*/
extern FILEIO * findid(FILEID id, int writable);
extern int fgetposid(FILEID id, FILEPOS *ptr);
extern int fsetposid(FILEID id, FILEPOS *ptr);
extern int get_open_siz(FILE *fp, ZVALUE *res);
extern char* findfname(FILEID);
extern DLL FILEIO * findid(FILEID id, int writable);
extern DLL int fgetposid(FILEID id, FILEPOS *ptr);
extern DLL int fsetposid(FILEID id, FILEPOS *ptr);
extern DLL int get_open_siz(FILE *fp, ZVALUE *res);
extern DLL char* findfname(FILEID);
extern DLL FILE *f_pathopen(char *name, char *mode, char *pathlist, char **openpath);
#endif /* !__FILE_H__ */

790
func.c

File diff suppressed because it is too large Load Diff

11
hash.c
View File

@@ -1,7 +1,7 @@
/*
* 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
* 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.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* @(#) $Revision: 29.6 $
* @(#) $Id: hash.c,v 29.6 2004/02/25 23:55:38 chongo Exp $
* @(#) $Revision: 29.10 $
* @(#) $Id: hash.c,v 29.10 2006/06/20 10:25:45 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/hash.c,v $
*
* Under source code control: 1995/11/23 05:13:11
@@ -596,7 +596,7 @@ hash_complex(int type, void *c, HASH *state)
HASH *
hash_str(int type, char *str, HASH *state)
{
USB32 len; /* string length */
size_t len; /* string length */
/*
* initialize if state is NULL
@@ -995,6 +995,9 @@ hash_value(int type, void *v, HASH *state)
state = hash_bool(type, FALSE, state);
}
state = hash_str(type, value->v_config->version, state);
state = hash_int(type, value->v_config->baseb, state);
state = hash_bool(type, value->v_config->redecl_warn, state);
state = hash_bool(type, value->v_config->dupvar_warn, state);
break;
case V_HASH:

View File

@@ -18,8 +18,8 @@
# 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.25 $
# @(#) $Id: Makefile,v 29.25 2004/07/28 12:21:05 chongo Exp $
# @(#) $Revision: 29.28 $
# @(#) $Id: Makefile,v 29.28 2006/05/07 12:59:51 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/help/RCS/Makefile,v $
#
# Under source code control: 1991/07/23 06:47:57
@@ -258,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.
#
# 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 \
appr arg argv arrow asec asech asin asinh assign atan atan2 atanh \
avg base base2 bernoulli bit blk blkcpy blkfree blocks bround btrunc \
calc_tty calclevel catalan ceil cfappr cfsim char cmdbuf cmp comb \
conj cos cosh cot coth count cp csc csch ctime delete den dereference \
det digit digits display dp epsilon errcount errmax errno error euler \
eval exp fact factor fclose fcnt feof ferror fflush fgetc fgetfield \
fgetline fgets fgetstr fib files floor fopen forall fprintf fputc \
fputs fputstr frac free freebernoulli freeeuler freeglobals freeredc \
freestatics frem freopen fscan fscanf fseek fsize ftell gcd gcdrem \
gd getenv hash head highbit hmean hnrmod hypot ilog ilog10 ilog2 \
im indices inputlevel insert int inverse iroot isassoc isatty isblk \
isconfig isdefined iserror iseven isfile ishash isident isint islist \
ismat ismult isnull isnum isobj isobjtype isodd isprime isptr isqrt \
isrand israndom isreal isrel issimple issq isstr istype jacobi join \
lcm lcmfact lfactor ln lowbit ltol makelist matdim matfill matmax \
matmin matsum mattrace mattrans max md5 memsize meq min minv mmin \
mne mod modify name near newerror nextcand nextprime norm null \
num oldvalue ord param perm pfact pi pix places pmod polar poly \
pop popcnt power prevcand prevprime printf prompt protect ptest \
push putenv quo quomod rand randbit random randombit randperm rcin \
rcmul rcout rcpow rcsq re remove reverse rewind rm root round rsearch \
runtime saveval scale scan scanf search sec sech seed segment select \
sgn sha sha1 sin sinh size sizeof sleep sort sqrt srand srandom \
ssq str strcat strerror strlen strpos strprintf strscan strscanf \
substr sum swap system tail tan tanh test time trunc version xor
det digit digits display dp epsilon errcount errmax errno error \
euler eval exp fact factor fclose fcnt feof ferror fflush fgetc \
fgetfield fgetline fgets fgetstr fib files floor fopen forall \
fpathopen fprintf fputc fputs fputstr frac free freebernoulli \
freeeuler freeglobals freeredc freestatics frem freopen fscan \
fscanf fseek fsize ftell gcd gcdrem gd getenv hash head highbit \
hmean hnrmod hypot ilog ilog10 ilog2 im indices inputlevel insert \
int inverse iroot isassoc isatty isblk isconfig isdefined iserror \
iseven isfile ishash isident isint islist ismat ismult isnull isnum \
isobj isobjtype isodd isprime isptr isqrt isrand israndom isreal \
isrel issimple issq isstr istype jacobi join lcm lcmfact lfactor \
ln log lowbit ltol makelist matdim matfill matmax matmin matsum \
mattrace mattrans max md5 memsize meq min minv mmin mne mod modify \
name near newerror nextcand nextprime norm null num oldvalue ord \
param perm pfact pi pix places pmod polar poly pop popcnt power \
prevcand prevprime printf prompt protect ptest push putenv quo \
quomod rand randbit random randombit randperm rcin rcmul rcout \
rcpow rcsq re remove reverse rewind rm root round rsearch runtime \
saveval scale scan scanf search sec sech seed segment select sgn \
sha sha1 sin sinh size sizeof sleep sort sqrt srand srandom ssq \
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
# built from DETAIL_HELP files.

View File

@@ -29,10 +29,10 @@ DESCRIPTION
the result will be the absolute value correct to n decimal places.
EXAMPLE
> print abs(3.4), abs(-3.4)
; print abs(3.4), abs(-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
LIMITS
@@ -60,8 +60,8 @@ SEE ALSO
## 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: abs,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: abs,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/abs,v $
##
## 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
implementations
> !rm -f junk
> access("junk")
; !rm -f junk
; access("junk")
System error 2
> strerror(.)
; strerror(.)
"No such file or directory"
> f = fopen("junk", "w")
> access("junk")
> fputs(f, "Alpha")
> fclose(f)
> !chmod u-w junk
> access("junk", "w")
; f = fopen("junk", "w")
; access("junk")
; fputs(f, "Alpha")
; fclose(f)
; !chmod u-w junk
; access("junk", "w")
System error 13
> strerror(.)
; strerror(.)
"Permission denied"
LIMITS
@@ -64,8 +64,8 @@ SEE ALSO
## 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: access,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: access,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/access,v $
##
## 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.
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
LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## 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: acos,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: acos,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acos,v $
##
## 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))
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
LIMITS
@@ -48,8 +48,8 @@ SEE ALSO
## 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: acosh,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: acosh,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acosh,v $
##
## 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.
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
LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## 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: acot,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: acot,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acot,v $
##
## 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
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
LIMITS
@@ -47,8 +47,8 @@ SEE ALSO
## 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: acoth,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: acoth,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acoth,v $
##
## 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.
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
LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## 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: acsc,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: acsc,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acsc,v $
##
## Under source code control: 1995/11/13 03:49:00

View File

@@ -20,7 +20,7 @@ DESCRIPTION
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
LIMITS
@@ -48,8 +48,8 @@ SEE ALSO
## 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: acsch,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: acsch,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acsch,v $
##
## Under source code control: 1995/11/13 03:49:01

View File

@@ -38,7 +38,7 @@ DESCRIPTION
&X with that component or element depends only on the continued existence
of the matrix or object. For example, after
> mat A[3]
; mat A[3]
the addresses &A[0], &A[1], &A[2] locate the three elements
of the matrix specified by A until another value is assigned to A, etc.
@@ -60,15 +60,15 @@ DESCRIPTION
results refer to octets in the same block or existing components of the
same matrix or object. For example, immediately after
> mat A[10]
> p = &A[5]
; mat A[10]
; p = &A[5]
it is permitted to use expressions like p + 4, p - 5, p++ .
Strings defined literally have fixed addresses, e.g., after
> p = &"abc"
> A = "abc"
; p = &"abc"
; A = "abc"
the address &*A of the value of A will be equal to p.
@@ -78,7 +78,7 @@ DESCRIPTION
be useable only while the variables retain these defined values.
For example, after
> B = C = strcat("a", "bc");
; B = C = strcat("a", "bc");
&*B and &*C will be different. If p is defined by p = &*B, p should
not be used after a new value is assigned to B, or B ceases to exist,
@@ -91,9 +91,9 @@ DESCRIPTION
so long as the number remains associated with at least one function or
lvalue. For example, after
> x = 27;
> y = 3 * 9;
> define f(a) = 27 + a;
; x = 27;
; y = 3 * 9;
; define f(a) = 27 + a;
the three occurrences of 27 have the same address which may be displayed
by any of &27, &*x, &*y and &f(0). If x and y are assigned
@@ -109,13 +109,13 @@ DESCRIPTION
non-zero value for a will be assigned to different addresses as can be
seen from printing &*A, &*B, &*C after
> A = f(2); B = f(2); C = f(2);
; A = f(2); B = f(2); C = f(2);
(the case of f(0) is exceptional since 27 + 0 simply copies the 27
rather than creating a new number value). Here it is clearly more
efficient to use
> A = B = C = f(2);
; A = B = C = f(2);
which, not only performs the addition in f() only once, but stores the
number values for A, B and C at the same address.
@@ -134,21 +134,21 @@ DESCRIPTION
EXAMPLE
Addresses for particular systems may differ from those displayed here.
> mat A[3]
> B = blk()
; mat A[3]
; B = blk()
> print &A, &A[0], &A[1]
; print &A, &A[0], &A[1]
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
> a = A[0] = 27
> print &*a, &*A[0]. &27
; a = A[0] = 27
; print &*a, &*A[0]. &27
n_ptr: 14003a850 n_ptr: 14003a850 n_ptr: 14003a850
> a = A[0] = "abc"
> print &*a, &*A[0], &"abc"
; a = A[0] = "abc"
; print &*a, &*A[0], &"abc"
s_ptr: 14004cae0 s_ptr: 14004cae0 s_ptr: 14004cae0
LIMITS
@@ -160,7 +160,7 @@ LINK LIBRARY
SEE ALSO
dereference, isptr
## 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
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -176,8 +176,8 @@ SEE ALSO
## 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: address,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Revision: 29.5 $
## @(#) $Id: address,v 29.5 2006/06/10 12:28:10 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/address,v $
##
## Under source code control: 1997/09/06 20:03:34

View File

@@ -35,23 +35,23 @@ DESCRIPTION
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
> 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
> 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
> 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
LIMITS
none
LINK LIBRARY
COMPLEX *cagd(COMPLEX *x, NUMBER *eps)
COMPLEX *c_agd(COMPLEX *x, NUMBER *eps)
SEE ALSO
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.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 29.2 $
## @(#) $Id: agd,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: agd,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/agd,v $
##
## 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, ...).
EXAMPLE
> x = list(2,3,4)
> append(x, 5, 6)
> print x
; x = list(2,3,4)
; append(x, 5, 6)
; print x
list (5 elements, 5 nonzero):
[[0]] = 2
@@ -30,8 +30,8 @@ EXAMPLE
[[3]] = 5
[[4]] = 6
> append(x, pop(x), pop(x))
> print x
; append(x, pop(x), pop(x))
; print x
list (5 elements, 5 nonzero):
[[0]] = 4
@@ -40,8 +40,8 @@ EXAMPLE
[[3]] = 2
[[4]] = 3
> append(x, (remove(x), 7))
> print x
; append(x, (remove(x), 7))
; print x
list (5 elements, 5 nonzero):
[[0]] = 4
@@ -57,9 +57,10 @@ LINK LIBRARY
none
SEE ALSO
delete, insert, islist, list, pop, push, remove, rsearch, search, size
delete, insert, islist, pop, push, remove, rsearch, search,
select, size
## 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
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -75,8 +76,8 @@ SEE ALSO
## 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: append,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: append,v 29.4 2006/06/25 22:16:55 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/append,v $
##
## 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.
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
> 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
> 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
> 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
> 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
> 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
> 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
> 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
> 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
> 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
> 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
> 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
> 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
> 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)
; 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)
2.70331-.55488i 2.70332-.55487i 2.70331-.55487i 2.70332-.55488i
LIMITS
@@ -167,8 +167,8 @@ SEE ALSO
## 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: appr,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: appr,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/appr,v $
##
## 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).
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
> 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
; 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
56.3099 135 -135
LIMITS
@@ -48,8 +48,8 @@ SEE ALSO
## 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: arg,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: arg,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arg,v $
##
## Under source code control: 1994/09/25 20:22:31

View File

@@ -38,8 +38,8 @@ DESCRIPTION
EXAMPLE
$ calc -s a bb ccc
> argc = argv();
> for (i = 0; i < argc; i++) print "argv[": i : '] = "': argv(i) : '"';
; argc = argv();
; for (i = 0; i < argc; i++) print "argv[": i : '] = "': argv(i) : '"';
argv[0] = "a"
argv[1] = "bb"
argv[2] = "ccc"
@@ -51,9 +51,9 @@ LINK LIBRARY
none
SEE ALSO
param, usage
param, system, usage
## 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
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -69,8 +69,8 @@ SEE ALSO
## 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: argv,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: argv,v 29.4 2006/06/25 22:16:55 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/argv,v $
##
## 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.
EXAMPLES
> obj pair {one, two}
> obj pair A, B
> p = &A
> p->one = 1; p->two = 2
> A
; obj pair {one, two}
; obj pair A, B
; p = &A
; p->one = 1; p->two = 2
; A
obj pair {1, 2}
> A->two = &B
> p->two->one = 3; p->two->two = 4
; A->two = &B
; p->two->one = 3; p->two->two = 4
> *p->ptwo
; *p->ptwo
obj pair {3, 4}
> B = {5,6}
> *p->two
; B = {5,6}
; *p->two
obj pair {5, 6}
@@ -66,8 +66,8 @@ SEE ALSO
## 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: arrow,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: arrow,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arrow,v $
##
## 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.
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
LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## 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: asec,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: asec,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asec,v $
##
## 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)
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
LIMITS
@@ -47,8 +47,8 @@ SEE ALSO
## 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: asech,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: asech,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asech,v $
##
## 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.
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
LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## 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: asin,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: asin,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asin,v $
##
## 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))
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
LIMITS
@@ -47,8 +47,8 @@ SEE ALSO
## 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: asinh,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: asinh,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asinh,v $
##
## Under source code control: 1994/03/19 01:40:25

View File

@@ -76,32 +76,32 @@ DESCRIPTION
EXAMPLE
> b = 3+1
> a = b
> print a, b
; b = 3+1
; a = b
; print a, b
4 4
> obj point {x,y}
> mat A[3] = {1, list(2,3), obj point = {4,5}}
; obj point {x,y}
; mat A[3] = {1, list(2,3), obj point = {4,5}}
> A[1][[0]] = 6; A[2].x = 7
> print A[1]
; A[1][[0]] = 6; A[2].x = 7
; print A[1]
list (2 elements, 2 nonzero):
[[0]] = 6
[[1]] = 3
> print A[2]
; print A[2]
obj point {7, 5}
> A = {A[2], , {9,10}}
> print A[0]
; A = {A[2], , {9,10}}
; print A[0]
obj point {7, 5}
> print A[2]
; print A[2]
obj point {9, 10}
> A = {, {2}}
; A = {, {2}}
print A[1]
list (2 elements, 2 nonzero):
@@ -133,8 +133,8 @@ SEE ALSO
## 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: assign,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: assign,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/assign,v $
##
## Under source code control: 1995/05/11 21:03:23

View File

@@ -60,12 +60,12 @@ DESCRIPTION
and are illegal.
EXAMPLE
> A = assoc(); print A
; A = assoc(); print A
assoc (0 elements):
> A["zero"] = 0; A["one"] = 1; A["two"] = 2; A["three"] = 3;
> A["smallest", "prime"] = 2;
> print A
; A["zero"] = 0; A["one"] = 1; A["two"] = 2; A["three"] = 3;
; A["smallest", "prime"] = 2;
; print A
assoc (5 elements);
["two"] = 2
["three"] = 3
@@ -98,8 +98,8 @@ SEE ALSO
## 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: assoc,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: assoc,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/assoc,v $
##
## 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.
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
LIMITS
@@ -45,8 +45,8 @@ SEE ALSO
## 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: atan,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: atan,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atan,v $
##
## Under source code control: 1994/03/19 01:40:25

View File

@@ -24,7 +24,7 @@ DESCRIPTION
returns 0.
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
LIMITS
@@ -52,8 +52,8 @@ SEE ALSO
## 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: atan2,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: atan2,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atan2,v $
##
## 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
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
LIMITS
@@ -47,8 +47,8 @@ SEE ALSO
## 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: atanh,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: atanh,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atanh,v $
##
## Under source code control: 1994/03/19 01:40:27

View File

@@ -27,12 +27,12 @@ DESCRIPTION
be averaged.
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
> mat x[2,2] = {1,2,3,4}
> mat y[2,2] = {1,2,4,8}
> avg(x,y)
; mat x[2,2] = {1,2,3,4}
; mat y[2,2] = {1,2,4,8}
; avg(x,y)
mat [2,2] (4 elements, 4 nonzero):
[0,0] = 1
@@ -41,7 +41,7 @@ EXAMPLE
[1,1] = 6
LIMITS
The number of arguments is not to exceed 100.
The number of arguments is not to exceed 1024.
LINK LIBRARY
none
@@ -49,7 +49,7 @@ LINK LIBRARY
SEE ALSO
hmean
## 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
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -65,8 +65,8 @@ SEE ALSO
## 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: avg,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: avg,v 29.4 2006/06/22 23:49:22 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/avg,v $
##
## Under source code control: 1994/09/25 20:22:31

View File

@@ -60,13 +60,13 @@ DESCRIPTION
listed in the table above.
EXAMPLE
> base()
; base()
10
> base(8)
; base(8)
012
> print 10
; print 10
012
LIMITS
@@ -97,8 +97,8 @@ SEE ALSO
## 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.5 $
## @(#) $Id: base,v 29.5 2002/12/29 09:17:54 chongo Exp $
## @(#) $Revision: 29.6 $
## @(#) $Id: base,v 29.6 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/base,v $
##
## Under source code control: 1994/09/30 00:09:39

View File

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

View File

@@ -28,8 +28,8 @@ DESCRIPTION
freebernoulli().
EXAMPLE
> config("mode", "frac"),;
> for (n = 0; n <= 6; n++) print bernoulli(n),; print;
; config("mode", "frac"),;
; for (n = 0; n <= 6; n++) print bernoulli(n),; print;
1 -1/2 1/6 0 -1/30 0 1/42
LIMITS
@@ -57,8 +57,8 @@ SEE ALSO
## 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.5 $
## @(#) $Id: bernoulli,v 29.5 2002/07/10 11:47:04 chongo Exp $
## @(#) $Revision: 29.6 $
## @(#) $Id: bernoulli,v 29.6 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bernoulli,v $
##
## Under source code control: 2000/07/13 01:33:00

View File

@@ -20,17 +20,17 @@ DESCRIPTION
return 1, otherwise return 0.
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
> print bit(9,4), bit(0,0), bit(9,-1)
; print bit(9,4), bit(0,0), bit(9,-1)
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
> p = pi()
> print bit(p, 1), bit(p, -2), bit(p, -3)
; p = pi()
; print bit(p, 1), bit(p, -2), bit(p, -3)
1 0 1
LIMITS
@@ -58,8 +58,8 @@ SEE ALSO
## 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: bit,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: bit,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bit,v $
##
## Under source code control: 1994/10/21 02:21:30

View File

@@ -14,7 +14,7 @@ TYPES
DESCRIPTION
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
octets, so the actual allocation size of len rounded up
to the next multiple of chunk.
@@ -26,7 +26,7 @@ DESCRIPTION
... , B[len-1], these all initially having zero value.
The octets B[i] for i >= len always have zero value. If B[i] with
some i >= len is referenced, len is increased by 1. For example:
some i >= len is referenced, size(B) is increased to i + 1. For example:
B[i] = x
@@ -56,7 +56,7 @@ DESCRIPTION
will append one octet to B and increment size(B).
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
same data, i.e. B1[i] == B2[i] for 0 <= i < len. Chunksizes
and maxsizes are ignored.
@@ -107,7 +107,7 @@ DESCRIPTION
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
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:
blk(A, len, chunk);
@@ -154,55 +154,55 @@ DESCRIPTION
EXAMPLE
> B = blk(15,10)
; B = blk(15,10)
> B[7] = 0xff
> B
; B[7] = 0xff
; B
chunksize = 10, maxsize = 20, datalen = 15
00000000000000ff00000000000000
> B[18] = 127
> B
; B[18] = 127
; B
chunksize = 10, maxsize = 20, datalen = 18
00000000000000ff0000000000000000007f
> B[20] = 2
; B[20] = 2
Index out of bounds for block
> print size(B), sizeof(B)
; print size(B), sizeof(B)
18 20
> B = blk(B, 100, 20)
> B
; B = blk(B, 100, 20)
; B
chunksize = 20, maxsize = 120, datalen = 100
00000000000000ff0000000000000000007f000000000000000000000000...
> C = blk(B, 10} = {1,2,3}
> C
; C = blk(B, 10} = {1,2,3}
; C
chunksize = 20, maxsize = 20, datalen = 10
01020300000000ff0000
> A1 = blk("alpha")
> A1
; A1 = blk("alpha")
; A1
block 0: alpha
chunksize = 256, maxsize = 256, datalen = 0
> A1[7] = 0xff
> A2 = A1
> A2[17] = 127
> A1
; A1[7] = 0xff
; A2 = A1
; A2[17] = 127
; A1
block 0: alpha
chunksize = 256, maxsize = 256, datalen = 18
00000000000000ff0000000000000000007f
> A1 = blk(A1, 1000)
> A1
; A1 = blk(A1, 1000)
; A1
block 0: alpha
chunksize = 256, maxsize = 1024, datalen = 1000
00000000000000ff0000000000000000007f000000000000000000000000...
> A1 = blk(A1, , 16)
> A1
; A1 = blk(A1, , 16)
; A1
block 0: alpha
chunksize = 16, maxsize = 1008, datalen = 1000
00000000000000ff0000000000000000007f000000000000000000000000...
@@ -213,12 +213,27 @@ LIMITS
1 <= chunk < 2^31
LINK LIBRARY
XXX
BLOCK *blkalloc(int len, int chunk)
void blk_free(BLOCK *blk)
BLOCK *blkrealloc(BLOCK *blk, int newlen, int newchunk)
void blktrunc(BLOCK *blk)
BLOCK *blk_copy(BLOCK *blk)
int blk_cmp(BLOCK *a, BLOCK *b)
void blk_print(BLOCK *blk)
void nblock_print(NBLOCK *nblk)
NBLOCK *reallocnblock(int id, int len, int chunk)
NBLOCK *createnblock(char *name, int len, int chunk)
int findnblockid(char * name)
int removenblock(int id)
int countnblocks(void)
void shownblocks(void)
NBLOCK *findnblock(int id)
BLOCK *copyrealloc(BLOCK *blk, int newlen, int newchunk)
SEE ALSO
blocks, blkfree
## 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
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -234,8 +249,8 @@ SEE ALSO
## 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: blk,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Revision: 29.5 $
## @(#) $Id: blk,v 29.5 2006/06/25 22:16:55 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blk,v $
##
## Under source code control: 1997/04/05 13:07:13

View File

@@ -19,7 +19,7 @@ TYPES
DESCRIPTION
A call to:
blkcpy(dst, src, num, dsi, ssi)
blkcpy(dst, src, num, dsi, ssi)
attempts to copy 'num' consecutive items (octets or values) starting
from the source item 'src' with index 'ssi'. By default, 'num'
@@ -27,7 +27,7 @@ DESCRIPTION
A call to:
copy(src, dst, ssi, num, dsi)
copy(src, dst, ssi, num, dsi)
does the same thing, but with a different arg order.
@@ -40,30 +40,30 @@ DESCRIPTION
The following pairs of source-type, destination-type are permitted:
block to
int
block
matrix
file
block to
int
block
matrix
file
matrix to
block
matrix
list
matrix to
block
matrix
list
string to
block
file
string to
block
file
list to
list
matrix
list to
list
matrix
file to
block
file to
block
int to
block
int to
block
In the above table, int refers to integer values. However if a
rational value is supplied, only the numerator is copied.
@@ -79,11 +79,11 @@ DESCRIPTION
sufficient memory allocated for the copying. For example, to copy
a matrix M of size 100 to a newly created list, one may use:
L = makelist(100);
copy(M, L);
; L = makelist(100);
; copy(M, L);
or:
L = makelist(100);
blkcpy(L, M);
; L = makelist(100);
; blkcpy(L, M);
For copying from a block B (named or unnamed), the total number of octets
available for copying is taken to the the datalen for that block,
@@ -108,74 +108,73 @@ DESCRIPTION
EXAMPLE
> A = blk() = {1,2,3,4}
> B = blk()
> blkcpy(B,A)
> B
; A = blk() = {1,2,3,4}
; B = blk()
; blkcpy(B,A)
; B
chunksize = 256, maxsize = 256, datalen = 4
01020304
>
> blkcpy(B,A)
> B
; blkcpy(B,A)
; B
chunksize = 256, maxsize = 256, datalen = 8
0102030401020304
> blkcpy(B, A, 2, 10)
> B
; blkcpy(B, A, 2, 10)
; B
chunksize = 256, maxsize = 256, datalen = 12
010203040102030400000102
> blkcpy(B,32767)
> B
; blkcpy(B,32767)
; B
chunksize = 256, maxsize = 256, datalen = 16
010203040102030400000102ff7f0000
> mat M[2,2]
> blkcpy(M, A)
> M
; mat M[2,2]
; blkcpy(M, A)
; M
mat [2,2] (4 elements, 4 nonzero):
[0,0] = 1
[0,1] = 2
[1,0] = 3
[1,1] = 4
> blkcpy(M, A, 2, 2)
> M
; blkcpy(M, A, 2, 2)
; M
mat [2,2] (4 elements, 4 nonzero):
[0,0] = 1
[0,1] = 2
[1,0] = 1
[1,1] = 2
> A = blk() = {1,2,3,4}
> B = blk()
> copy(A,B)
> B
; A = blk() = {1,2,3,4}
; B = blk()
; copy(A,B)
; B
chunksize = 256, maxsize = 256, datalen = 4
01020304
> copy(A,B)
> B
; copy(A,B)
; B
chunksize = 256, maxsize = 256, datalen = 8
0102030401020304
> copy(A,B,1,2)
> B
; copy(A,B,1,2)
; B
chunksize = 256, maxsize = 256, datalen = 10
01020304010203040203
> mat M[2,2]
> copy(A,M)
> M
; mat M[2,2]
; copy(A,M)
; M
mat [2,2] (4 elements, 4 nonzero):
[0,0] = 1
[0,1] = 2
[1,0] = 3
[1,1] = 4
> copy(A,M,2)
> M
; copy(A,M,2)
; M
mat [2,2] (4 elements, 4 nonzero):
[0,0] = 3
[0,1] = 4
[1,0] = 3
[1,1] = 4
> copy(A,M,0,2,2)
> M
; copy(A,M,0,2,2)
; M
mat [2,2] (4 elements, 4 nonzero):
[0,0] = 3
[0,1] = 4
@@ -191,7 +190,7 @@ LINK LIBRARY
SEE ALSO
blk, mat, file, list, str
## 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
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -207,8 +206,8 @@ SEE ALSO
## 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: blkcpy,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: blkcpy,v 29.4 2006/06/10 12:28:10 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blkcpy,v $
##
## Under source code control: 1997/04/05 14:08:50

View File

@@ -23,27 +23,27 @@ DESCRIPTION
EXAMPLE
> B1 = blk("foo")
> B2 = blk("Second block")
; B1 = blk("foo")
; B2 = blk("Second block")
show blocks
id name
---- -----
0 foo
1 Second block
> blkfree(B1)
> show blocks
; blkfree(B1)
; show blocks
id name
---- -----
1 Second block
> B1
; B1
block 0: foo
chunksize = 256, maxsize = 0, datalen = 0
NULL
> blk(B1); B[7] = 5
> B1
; blk(B1); B[7] = 5
; B1
block 0: foo
chunksize = 256, maxsize = 256, datalen = 8
0000000000000005
@@ -73,8 +73,8 @@ SEE ALSO
## 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: blkfree,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: blkfree,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blkfree,v $
##
## Under source code control: 1997/04/05 13:07:13

View File

@@ -20,17 +20,17 @@ DESCRIPTION
EXAMPLE
> A = blk("alpha")
> B = blk("beta") = {1,2,3}
> blocks()
; A = blk("alpha")
; B = blk("beta") = {1,2,3}
; blocks()
2
> blocks(1)
; blocks(1)
block 1: beta
chunksize = 256, maxsize = 256, datalen = 3
010203
> blocks(2)
; blocks(2)
Error 10211
> strerror()
; strerror()
"Non-allocated index number for blocks"
LIMITS
@@ -58,8 +58,8 @@ SEE ALSO
## 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: blocks,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: blocks,v 29.4 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blocks,v $
##
## 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.
EXAMPLES
> a = 7/32, b = -7/32
; a = 7/32, b = -7/32
> print a, b
; print a, b
.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
> 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
> 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
> 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
> 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
> 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
> c = 21875
> print round(c,-2,0), round(c,-2,1), round(c,-3,0), round(c,-3,16)
; c = 21875
; print round(c,-2,0), round(c,-2,1), round(c,-3,0), round(c,-3,16)
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
> A = list(1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8)
> print round(A,2,24)
; A = list(1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8)
; print round(A,2,24)
list(7 elements, 7 nonzero):
[[0]] = .12
@@ -138,8 +138,8 @@ SEE ALSO
## 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: bround,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: bround,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bround,v $
##
## Under source code control: 1994/09/30 00:22:35

View File

@@ -22,16 +22,16 @@ DESCRIPTION
int(x).
EXAMPLE
> print btrunc(pi()), btrunc(pi(), 10)
; print btrunc(pi()), btrunc(pi(), 10)
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
> 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
> print btrunc(55.123, -4), btrunc(-55.123, -4)
; print btrunc(55.123, -4), btrunc(-55.123, -4)
48 -48
LIMITS
@@ -59,8 +59,8 @@ SEE ALSO
## 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: btrunc,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: btrunc,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/btrunc,v $
##
## Under source code control: 1994/09/30 00:44:27

View File

@@ -13,12 +13,12 @@ DESCRIPTION
may occur when activity is resumed by an fg command after a ctrl-Z
interrupt, or by any of the three commands:
> !stty echo
> !stty -cbreak
> !stty echo -cbreak
; !stty echo
; !stty -cbreak
; !stty echo -cbreak
EXAMPLE
> calc_tty();
; calc_tty();
LIBRARY
none
@@ -26,7 +26,7 @@ LIBRARY
SEE ALSO
none
## Copyright (C) 2000 Ernest Bowen
## Copyright (C) 2000-2006 Ernest Bowen
##
## 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
@@ -42,8 +42,8 @@ SEE ALSO
## 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: calc_tty,v 29.1 2000/12/14 10:31:45 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: calc_tty,v 29.3 2006/06/10 12:28:10 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/calc_tty,v $
##
## 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.
EXAMPLE
> print catalan(2), catalan(3), catalan(4), catalan(20)
; print catalan(2), catalan(3), catalan(4), catalan(20)
2 5 14 6564120420
LIMITS
@@ -53,8 +53,8 @@ SEE ALSO
## 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: catalan,v 29.2 2000/12/17 12:27:58 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: catalan,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/catalan,v $
##
## Under source code control: 2000/12/14 01:33:00

View File

@@ -20,7 +20,7 @@ DESCRIPTION
by ceil(t).
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
LIMITS
@@ -48,8 +48,8 @@ SEE ALSO
## 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: ceil,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: ceil,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/ceil,v $
##
## 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).
EXAMPLE
> c = config("mode", "frac")
> 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)
; c = config("mode", "frac")
; 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)
10/7 13/9 1/210 1/90 1/63 10/7
> pi = pi(1e-10)
> print cfappr(pi, 100, 16), cfappr(pi, .01, 16), cfappr(pi, 1e-6, 16)
; pi = pi(1e-10)
; print cfappr(pi, 100, 16), cfappr(pi, .01, 16), cfappr(pi, 1e-6, 16)
311/99 22/7 355/113
> x = 17/12; u = cfappr(x,4,0); v = cfappr(x,4,1);
> print u, v, x - u, v - x, cfappr(x,4,16)
; x = 17/12; u = cfappr(x,4,0); v = cfappr(x,4,1);
; print u, v, x - u, v - x, cfappr(x,4,16)
4/3 3/2 1/12 1/12 3/2
LIMITS
@@ -104,8 +104,8 @@ SEE ALSO
## 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: cfappr,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: cfappr,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cfappr,v $
##
## 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).
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
> x = pi(1e-20); c = config("mode", "frac");
> while (!isint(x)) {x = cfsim(x,8); if (den(x) < 1e6) print x,:;}
; x = pi(1e-20); c = config("mode", "frac");
; while (!isint(x)) {x = cfsim(x,8); if (den(x) < 1e6) print x,:;}
1146408/364913 312689/99532 104348/33215 355/113 22/7 3
LIMITS
@@ -129,8 +129,8 @@ SEE ALSO
## 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: cfsim,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: cfsim,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cfsim,v $
##
## 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 "".
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
LIMITS
@@ -42,8 +42,8 @@ SEE ALSO
## 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: char,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: char,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/char,v $
##
## Under source code control: 1994/09/30 01:45:45

View File

@@ -26,9 +26,9 @@ LINK LIBRARY
none
SEE ALSO
XXX - fill in
argv, system
## 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
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -44,8 +44,8 @@ SEE ALSO
## 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: cmdbuf,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: cmdbuf,v 29.3 2006/06/25 22:16:55 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cmdbuf,v $
##
## Under source code control: 1995/07/09 04:05:58

View File

@@ -92,16 +92,16 @@ DESCRIPTION
for example, cmp(2, "2"), returns the null value.
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
> 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
> 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
> 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
LIMITS
@@ -130,8 +130,8 @@ SEE ALSO
## 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: cmp,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: cmp,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/cmp,v $
##
## 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.
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
> print comb(2^31+1,2^31-1)
; print comb(2^31+1,2^31-1)
2305843010287435776
LIMITS
@@ -36,9 +36,9 @@ LINK LIBRARY
void zcomb(ZVALUE x, ZVALUE y, ZVALUE *res)
SEE ALSO
fact, perm
fact, perm, randperm
## 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
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -54,8 +54,8 @@ SEE ALSO
## 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: comb,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.4 $
## @(#) $Id: comb,v 29.4 2006/06/25 22:16:55 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/comb,v $
##
## Under source code control: 1994/10/20 04:03:02

View File

@@ -18,75 +18,105 @@ Command sequence
-----------------
define function(params) { body }
define function(params) = expression
This first form defines a full function which can consist
of declarations followed by many statements which implement
the function.
The second form defines a simple function which calculates
the specified expression value from the specified parameters.
The expression cannot be a statement. However, the comma
and question mark operators can be useful. Examples of
simple functions are:
This first form defines a full function which can consist
of declarations followed by many statements which implement
the function.
define sumcubes(a, b) = a^3 + b^3
define pimod(a) = a % pi()
define printnum(a, n, p)
{
if (p == 0) {
print a: "^": n, "=", a^n;
} else {
print a: "^": n, "mod", p, "=", pmod(a,n,p);
}
The second form defines a simple function which calculates
the specified expression value from the specified parameters.
The expression cannot be a statement. However, the comma
and question mark operators can be useful. Examples of
simple functions are:
define sumcubes(a, b) = a^3 + b^3
define pimod(a) = a % pi()
define printnum(a, n, p)
{
if (p == 0) {
print a: "^": n, "=", a^n;
} else {
print a: "^": n, "mod", p, "=", pmod(a,n,p);
}
}
read calc commands
------------------
read $var
read -once $var
read filename
read -once filename
This reads definitions from the specified calc resource filename.
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.
This reads definitions from the specified calc resource filename.
The ".cal" extension is defaulted for input files, so that
if "filename" is not found, then "filename.cal" is then
searched for. The contents of the filename are command
sequences which can consist of expressions to evaluate or
functions to define, just like at the top level command level.
In the 1st and 2nd forms, if var is a global variable string
value, then the value of that variable is used as a filename.
When -once is given, the read command acts like the regular
read expect that it will ignore filename if is has been
previously read.
The following is equivalent to read lucas.cal or read "lucas.cal":
The read -once form is particularly useful in a resource
file that needs to read a 2nd resource file. By using the
READ -once command, one will not reread that 2nd resource
file, nor will once risk entering into a infinite READ loop
(where that 2nd resource file directly or indirectly does
a READ of the first resource file).
global var = "lucas.cal";
read $var;
If the -m mode disallows opening of files for reading,
this command will be disabled.
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
if "filename" is not found, then "filename.cal" is then
searched for. The contents of the filename are command
sequences which can consist of expressions to evaluate or
functions to define, just like at the top level command level.
When -once is given, the read command acts like the regular
read expect that it will ignore filename if is has been
previously read.
The read -once form is particularly useful in a resource
file that needs to read a 2nd resource file. By using the
READ -once command, one will not reread that 2nd resource
file, nor will once risk entering into a infinite READ loop
(where that 2nd resource file directly or indirectly does
a READ of the first resource file).
If the -m mode disallows opening of files for reading,
this command will be disabled.
write calc commands
-------------------
write $var
write filename
This writes the values of all global variables to the
specified filename, in such a way that the file can be
later read in order to recreate the variable values.
For speed reasons, values are written as hex fractions.
This command currently only saves simple types, so that
matrices, lists, and objects are not saved. Function
definitions are also not saved.
If the -m mode disallows opening of files for writing,
this command will be disabled.
This writes the values of all global variables to the
specified filename, in such a way that the file can be
later read in order to recreate the variable values.
For speed reasons, values are written as hex fractions.
This command currently only saves simple types, so that
matrices, lists, and objects are not saved. Function
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,
this command will be disabled.
quit or exit
@@ -95,105 +125,120 @@ Command sequence
quit string
exit
exit string
The action of these commands depends on where they are used.
At the interactive level, they will cause calc it edit.
This is the normal way to leave the calculator. In any
other use, they will stop the current calculation as if
an error had occurred.
If a string is given, then the string is printed as the reason
for quitting, otherwise a general quit message is printed.
The routine name and line number which executed the quit is
also printed in either case.
The action of these commands depends on where they are used.
At the interactive level, they will cause calc it edit.
This is the normal way to leave the calculator. In any
other use, they will stop the current calculation as if
an error had occurred.
Exit is an alias for quit.
If a string is given, then the string is printed as the reason
for quitting, otherwise a general quit message is printed.
The routine name and line number which executed the quit is
also printed in either case.
Quit is useful when a routine detects invalid arguments,
in order to stop a calculation cleanly. For example,
for a square root routine, an error can be given if the
supplied parameter was a negative number, as in:
Exit is an alias for quit.
define mysqrt(n)
{
if (! isnum(n))
quit "non-numeric argument";
if (n < 0)
quit "Negative argument";
return sqrt(n);
}
Quit is useful when a routine detects invalid arguments,
in order to stop a calculation cleanly. For example,
for a square root routine, an error can be given if the
supplied parameter was a negative number, as in:
See 'more information about abort and quit' below for
more information.
define mysqrt(n)
{
if (! isnum(n))
quit "non-numeric argument";
if (n < 0)
quit "Negative argument";
return sqrt(n);
}
See 'more information about abort and quit' below for
more information.
abort
-----
abort
abort string
This command behaves like QUIT except that it will attempt
to return to the interactive level if permitted, otherwise
calc exit.
See 'more information about abort and quit' below for
more information.
This command behaves like QUIT except that it will attempt
to return to the interactive level if permitted, otherwise
calc exit.
See 'more information about abort and quit' below for
more information.
change current directory
------------------------
cd
cd dir
Change the current directory to 'dir'. If 'dir' is ommitted,
change the current directory to the home directory, if $HOME
is set in the environment.
Change the current directory to 'dir'. If 'dir' is ommitted,
change the current directory to the home directory, if $HOME
is set in the environment.
show information
----------------
show item
This command displays some information where 'item' is
one of the following:
blocks unfreed named blocks
builtin built in functions
config config parameters and values
constants cache of numeric constants
custom custom functions if calc -C was used
errors new error-values created
files open files, file position and sizes
function user-defined functions
globaltypes global variables
objfunctions possible object functions
objtypes defined objects
opcodes func internal opcodes for function `func'
sizes size in octets of calc value types
realglobals numeric global variables
statics unscoped static variables
numbers calc number cache
redcdata REDC data defined
strings calc string cache
literals calc literal cache
This command displays some information where 'item' is
one of the following:
Only the first 4 characters of item are examined, so:
blocks unfreed named blocks
builtin built in functions
config config parameters and values
constants cache of numeric constants
custom custom functions if calc -C was used
errors new error-values created
files open files, file position and sizes
function user-defined functions
globaltypes global variables
objfunctions possible object functions
objtypes defined objects
opcodes func internal opcodes for function `func'
sizes size in octets of calc value types
realglobals numeric global variables
statics unscoped static variables
numbers calc number cache
redcdata REDC data defined
strings calc string cache
literals calc literal cache
show globals
show global
show glob
Only the first 4 characters of item are examined, so:
do the same thing.
show globals
show global
show glob
do the same thing.
calc help
---------
help
help $var
help name
This displays a help related to 'name' or general
help of none is given.
This displays a help related to 'name' or general
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.
=-=
more information about abort and quit
=====================================
@@ -244,7 +289,7 @@ Command sequence
after statment #1
start statment #2
abort from a()
> <==== calc interactive prompt
; <==== calc interactive prompt
because the '-i' calc causes ABORT to drop into an
interactive prompt. However typing a QUIT or ABORT
@@ -274,21 +319,21 @@ Command sequence
If one were to type in the contents of myfile.cal interactively,
calc will produce:
> print "start of myfile.cal";
; print "start of myfile.cal";
start of myfile.cal
> define q() {quit "quit from q()"; print "end of q()"}
; define q() {quit "quit from q()"; print "end of q()"}
q() defined
> define a() {abort "abort from a()"}
; define a() {abort "abort from a()"}
a() defined
> x = 3;
> {print "start #1"; if (x > 1) q()} print "after #1";
; x = 3;
; {print "start #1"; if (x > 1) q()} print "after #1";
start statment #1
quit from q()
after statment #1
> {print "start #2"; if (x > 1) a()} print "after #2";
; {print "start #2"; if (x > 1) a()} print "after #2";
start statment #2
abort from a()
> {print "start #3"; if (x > 1) quit "quit from 3rd statement"}
; {print "start #3"; if (x > 1) quit "quit from 3rd statement"}
start #3
quit from 3rd statement
@@ -298,16 +343,14 @@ Command sequence
The QUIT (after the if (x > 1) ...) will cause calc to exit
because it was given at the interactive prompt level.
=-=
Also see the help topic:
statement flow control and declaration statements
usage how to invoke the calc command and calc -options
statement flow control and declaration statements
usage how to invoke the calc command and calc -options
## 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
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -323,8 +366,8 @@ Command sequence
## 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: command,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.5 $
## @(#) $Id: command,v 29.5 2006/06/10 12:28:10 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/command,v $
##
## Under source code control: 1991/07/21 04:37:17

View File

@@ -1,12 +1,24 @@
Configuration parameters
NAME
config - configuration parameters
Configuration parameters affect how the calculator performs certain
SYNOPSIS
config(parameter [,value])
TYPES
parameter string
value int, string, config state
return config state
DESCRIPTION
The config() builtin affects how the calculator performs certain
operations. Among features that are controlled by these parameters
are the accuracy of some calculations, the displayed format of results,
the choice from possible alternative algorithms, and whether or not
debugging information is displayed. The parameters are
read or set using the "config" built-in function; they remain in effect
until their values are changed by a config or equivalent instruction.
The following parameters can be specified:
"all" all configuration values listed below
@@ -38,13 +50,13 @@ Configuration parameters
"prompt" default interactive prompt
"more" default interactive multi-line input prompt
"blkmaxprint" number of block octets to print, 0 means all
"blkverbose" TRUE=>print all lines, FALSE=>skip duplicates
"blkverbose" TRUE => print all lines, FALSE=>skip duplicates
"blkbase" block output base
"blkfmt" block output format
"calc_debug" controls internal calc debug information
"resource_debug" controls resource file debug information
"user_debug" for user defined debug information
"verbose_quit" TRUE=>print message on empty quit or abort
"verbose_quit" TRUE => print message on empty quit or abort
"ctrl_d" The interactive meaning of ^D (Control D)
"program" Read-only calc program or shell script path
"basename" Read-only basename of the program value
@@ -53,6 +65,9 @@ Configuration parameters
"compile_custom" TRUE=>calc was compiled with custom functions
"allow_custom" TRUE=>custom functions are enabled
"version" Read-only calc version
"baseb" bits in calculation base, a read-only value
"redecl_warn" TRUE => warn when redeclaring
"dupvar_warn" TRUE => warn when variable names collide
The "all" config value allows one to save/restore the configuration
set of values. The return of:
@@ -120,9 +135,6 @@ Configuration parameters
config("tilde", 0) disable roundoff tilde printing
config("tab", "off") disable leading tab printing
Detailed config descriptions
=-=
config("trace", bitflag)
@@ -254,16 +266,36 @@ Detailed config descriptions
runs in a time of O(N^2). The second method is a recursive and
complicated method which runs in a time of O(N^1.585). The argument
for these parameters is the number of binary words at which the
second algorithm begins to be used. The minimum value is 2, and
second algorithm begins to be used. The minimum value is 2, and
the maximum value is very large. If 2 is used, then the recursive
algorithm is used all the way down to single digits, which becomes
slow since the recursion overhead is high. If a number such as
1000000 is used, then the recursive algorithm is never used, causing
calculations for large numbers to slow down. For a typical example
on a 386, the two algorithms are about equal in speed for a value
of 20, which is about 100 decimal digits. A value of zero resets
the parameter back to its default value. Usually there is no need
to change these parameters.
1000000 is used, then the recursive algorithm is almost never used,
causing calculations for large numbers to slow down.
Units refer to internal calculation digits where each digit
is BASEB bits in length. The value of BASEB is returned by
config("baseb").
The default value for config("sq2") is 3388. This default was
established on a 1.8GHz AMD 32-bit CPU of ~3406 BogoMIPS when
the two algorithms are about equal in speed. For that CPU test,
config("baseb") was 32. This means that by default numbers up to
(3388*32)+31 = 108447 bits in length (< 32645 decimal digits) use
the 1st algorithm, for squaring.
The default value for config("mul2") is 1780. This default was
established on a 1.8GHz AMD 32-bit CPU of ~3406 BogoMIPS when
the two algorithms are about equal in speed. For that CPU test,
config("baseb") was 32. This means that by default numbers up to
(1779*32)+31 = 56927 bits in length (< 17137 decimal digits) use
the 1st algorithm, for multiplication.
A value of zero resets the parameter back to their default values.
The value of 1 and values < 0 are reserved for future use.
Usually there is no need to change these parameters.
=-=
@@ -277,6 +309,23 @@ Detailed config descriptions
which avoids divisions. The argument for pow2 is the size of the
modulus at which the second algorithm begins to be used.
Units refer to internal calculation digits where each digit
is BASEB bits in length. The value of BASEB is returned by
config("baseb").
The default value for config("pow2") is 176. This default was
established on a 1.8GHz AMD 32-bit CPU of ~3406 BogoMIPS when
the two algorithms are about equal in speed. For that CPU test,
config("baseb") was 32. This means that by default numbers up to
(176*32)+31 = 5663 bits in length (< 1704 decimal digits) use the
1st algorithm, for calculating powers modulo another number.
A value of zero resets the parameter back to their default values.
The value of 1 and values < 0 are reserved for future use.
Usually there is no need to change these parameters.
=-=
config("redc2", int)
@@ -289,6 +338,23 @@ Detailed config descriptions
O(N^1.585). The argument for redc2 is the size of the modulus at
which the second algorithm begins to be used.
Units refer to internal calculation digits where each digit
is BASEB bits in length. The value of BASEB is returned by
config("baseb").
The default value for config("redc2") is 220. This default was
established as 5/4 (the historical ratio of config("pow2") to
config("pow2")) of the config("pow2") value. This means that if
config("baseb") is 32, then by default numbers up to (220*32)+31 =
7071 bits in length (< 2128 decimal digits) use the REDC algorithm,
for calculating powers modulo another number.
A value of zero resets the parameter back to their default values.
The value of 1 and values < 0 are reserved for future use.
Usually there is no need to change these parameters.
=-=
config("tilde", boolean)
@@ -364,9 +430,15 @@ Detailed config descriptions
by the various kinds of printing to the output: bits 0, 1, 3 and 4
are used in the same way as for the functions round and bround.
The C language method of modulus and integer division is:
config("quomod", 2)
config("quo", 2)
config("mod", 2)
=-=
config("leadzero", bool)
config("leadzero", boolean)
The "leadzero" parameter controls whether or not a 0 is printed
before the decimal point in non-zero fractions with absolute value
@@ -375,7 +447,7 @@ Detailed config descriptions
=-=
config("fullzero", bool)
config("fullzero", boolean)
The "fullzero" parameter controls whether or not in decimal floating-
point printing, the digits are padded with zeros to reach the
@@ -426,7 +498,7 @@ Detailed config descriptions
=-=
config("blkverbose", bool)
config("blkverbose", boolean)
The "blkverbose" determines if all lines, including duplicates
should be printed. If TRUE, then all lines are printed. If false,
@@ -560,11 +632,12 @@ Detailed config descriptions
3 During execution, allow calc standard resource files
to output additional debugging information.
The value for config("resource_debug") in both oldstd and newstd is 3,
but if calc is invoked with the -d flag, its initial value is zero.
Thus, if calc is started without the -d flag, until config("resource_debug")
is changed, a message will be output when a function is defined
either interactively or during the reading of a file.
The value for config("resource_debug") in both oldstd and newstd
is 3, but if calc is invoked with the -d flag, its initial value
is zero. Thus, if calc is started without the -d flag, until
config("resource_debug") is changed, a message will be output when
a function is defined either interactively or during the reading of
a file.
The name config("lib_debug") is equivalent to config("resource_debug")
and is included for backward compatibility.
@@ -591,7 +664,7 @@ Detailed config descriptions
=-=
config("verbose_quit", bool)
config("verbose_quit", boolean)
The "verbose_quit" controls the print of the message:
@@ -601,7 +674,7 @@ Detailed config descriptions
A quit of abort without an argument does not display a message when
invoked at the interactive level.
By deafult, "verbose_quit" is false.
By default, "verbose_quit" is false.
=-=
@@ -756,7 +829,122 @@ Detailed config descriptions
This config parameter is read-only and cannot be set.
## Copyright (C) 1999 Landon Curt Noll
=-=
config("baseb") <== NOTE: This is a read-only config value
Returns the number of bits in the fundamental base in which
internal calculations are performed. For example, a value of
32 means that calc will perform many internal calculations in
base 2^32 with digits that are 32 bits in length.
For libcalc programmers, this is the value of BASEB as defined
in the zmath.h header file.
This config parameter is read-only and cannot be set.
=-=
config("redecl_warn", boolean)
Config("redecl_warn") controls whether or not a warning is issued
when redeclaring variables.
The initial "redecl_warn" value is 1.
=-=
config("dupvar_warn", boolean)
Config("dupvar_warn") controls whether or not a warning is issued
when a variable name collides with an exist name of a higher scope.
Examples of collisions are when:
* both local and static variables have the same name
* both local and global variables have the same name
* both function parameter and local variables have the same name
* both function parameter and global variables have the same name
The initial "redecl_warn" value is 1.
EXAMPLE
; current_cfg = config("all");
; config("tilde", off),;
; config("calc_debug", 15),;
; config("all") == current_cfg
0
; config("all", current_cfg),;
; config("all") == current_cfg
1
; config("version")
"2.12.0"
; config("all")
mode "real"
mode2 "off"
display 20
epsilon 0.00000000000000000001
trace 0
maxprint 16
mul2 20
sq2 20
pow2 40
redc2 50
tilde 1
tab 1
quomod 0
quo 2
mod 0
sqrt 24
appr 24
cfappr 0
cfsim 8
outround 24
round 24
leadzero 1
fullzero 0
maxscan 20
prompt "; "
more ";; "
blkmaxprint 256
blkverbose 0
blkbase "hexadecimal"
blkfmt "hd_style"
resource_debug 3
lib_debug 3
calc_debug 0
user_debug 0
verbose_quit 0
ctrl_d "virgin_eof"
program "calc"
basename "calc"
windows 0
cygwin 0
compile_custom 1
allow_custom 0
version "2.12.0"
baseb 32
redecl_warn 1
dupvar_warn 1
; display()
20
; config("display", 50),;
; display()
50
LIMITS
none
LINK LIBRARY
n/a
SEE ALSO
usage, custom, custom_cal, usage, epsilon, display
## Copyright (C) 1999-2006 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
@@ -772,8 +960,8 @@ Detailed config descriptions
## 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.10 $
## @(#) $Id: config,v 29.10 2004/07/27 23:45:52 chongo Exp $
## @(#) $Revision: 29.17 $
## @(#) $Id: config,v 29.17 2006/06/24 19:06:58 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/config,v $
##
## Under source code control: 1991/07/21 04:37:17

View File

@@ -28,7 +28,7 @@ DESCRIPTION
conjugate of the corresponding component of a.
EXAMPLE
> print conj(3), conj(3 + 4i)
; print conj(3), conj(3 + 4i)
3 3-4i
LIMITS
@@ -56,8 +56,8 @@ SEE ALSO
## 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: conj,v 29.2 2000/06/07 14:02:33 chongo Exp $
## @(#) $Revision: 29.3 $
## @(#) $Id: conj,v 29.3 2006/05/07 07:25:46 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/conj,v $
##
## 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