Compare commits

...

28 Commits

Author SHA1 Message Date
Landon Curt Noll
a6a37f9cad Release calc version 2.11.10 2017-05-21 15:38:45 -07:00
Landon Curt Noll
42b089a87c Release calc version 2.11.9.3 2017-05-21 15:38:44 -07:00
Landon Curt Noll
8c5e9e62fa Release calc version 2.11.9.2 2017-05-21 15:38:44 -07:00
Landon Curt Noll
29e956819c Release calc version 2.11.9.1 2017-05-21 15:38:44 -07:00
Landon Curt Noll
66c3d26611 Release calc version 2.11.9 2017-05-21 15:38:44 -07:00
Landon Curt Noll
b4952bd44f Release calc version 2.11.8.1 2017-05-21 15:38:44 -07:00
Landon Curt Noll
0d06d90751 Release calc version 2.11.8 2017-05-21 15:38:43 -07:00
Landon Curt Noll
e1a3dfda0b Release calc version 2.11.7 2017-05-21 15:38:43 -07:00
Landon Curt Noll
8db4e7af47 Release calc version 2.11.6.3 2017-05-21 15:38:43 -07:00
Landon Curt Noll
bb5c624382 Release calc version 2.11.6.1 2017-05-21 15:38:43 -07:00
Landon Curt Noll
8aedcf801a Release calc version 2.11.6.2 2017-05-21 15:38:43 -07:00
Landon Curt Noll
b60eec99bb Release calc version 2.11.6 2017-05-21 15:38:42 -07:00
Landon Curt Noll
383290a844 Release calc version 2.11.5.8 2017-05-21 15:38:42 -07:00
Landon Curt Noll
7e40db44e3 Release calc version 2.11.5.7 2017-05-21 15:38:42 -07:00
Landon Curt Noll
a57ee19ca5 Release calc version 2.11.5.6 2017-05-21 15:38:42 -07:00
Landon Curt Noll
a6e226fa80 Release calc version 2.11.5.5 2017-05-21 15:38:42 -07:00
Landon Curt Noll
86e0f98c8f Release calc version 2.11.5t4.5 2017-05-21 15:38:41 -07:00
Landon Curt Noll
e4dcbf7ecf Release calc version 2.11.5t4.4 2017-05-21 15:38:41 -07:00
Landon Curt Noll
10c0bd2d95 Release calc version 2.11.5t4.3 2017-05-21 15:38:41 -07:00
Landon Curt Noll
ad44f1e3ab Release calc version 2.11.5t4.2 2017-05-21 15:38:41 -07:00
Landon Curt Noll
fd436d7c15 Release calc version 2.11.5t4.1 2017-05-21 15:38:40 -07:00
Landon Curt Noll
d2cb9c81d5 Release calc version 2.11.5t4 2017-05-21 15:38:40 -07:00
Landon Curt Noll
a0aba073a6 Release calc version 2.11.5t3 2017-05-21 15:38:40 -07:00
Landon Curt Noll
59837e385c Release calc version 2.11.5t2.1 2017-05-21 15:38:40 -07:00
Landon Curt Noll
bea726fc16 Release calc version 2.11.5t2 2017-05-21 15:38:40 -07:00
Landon Curt Noll
fc0a3dd183 Release calc version 2.11.5t1.1 2017-05-21 15:38:39 -07:00
Landon Curt Noll
63d9b22067 Release calc version 2.11.5t1.0 2017-05-21 15:38:39 -07:00
Landon Curt Noll
fc85ac3791 Release calc version 2.11.5t0 2017-05-21 15:38:39 -07:00
173 changed files with 12297 additions and 3507 deletions

145
BUGS
View File

@@ -29,18 +29,25 @@ The calc web site is located at:
=-= =-=
If you have tried all of the above and things still are not right, If you have tried all of the above and things still are not right,
then it may be time to send in a bug report. You can send bug reports to: then it may be time to send in a bug report. You can send bug
and bug fixes reports to:
calc-bugs at asthe dot com calc-bugs at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] [[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe', the web site URL uses 'isthe' ]] [[ NOTE: The EMail address uses 'asthe', the web site URL uses 'isthe' ]]
Your subject must contain the words:
calc bug report
You may have additional words in your subject line.
When you send your report, please include the following information: When you send your report, please include the following information:
* a description of the problem * a description of the problem
* the version of calc you are using (if you cannot get calc * the version of calc you are using (if you cannot get calc
it to run, then send us the 4 #define lines from version.c) to run, then send us the 4 #define lines from version.c)
* if you modified calc from an official patch, send me the mods you made * if you modified calc from an official patch, send me the mods you made
* the type of system you were using * the type of system you were using
* the type of compiler you were using * the type of compiler you were using
@@ -54,18 +61,8 @@ When you send your report, please include the following information:
Stack traces from core dumps are useful to send as well. Stack traces from core dumps are useful to send as well.
=-= Fell free to use the above address to send in big fixes (in the form
of a context diff patch).
Send any comments, compiler warning messages, suggestions and most
importantly, fixes (in the form of a context diff patch) to:
calc-bugs at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe', the web site URL uses 'isthe' ]]
You should use the above calc-bugs address for bug reports, if you are
not currently a member of the calc-tester mailing list.
=-= =-=
@@ -75,14 +72,104 @@ Known bugs:
us know! See the above for details on how to report and were to us know! See the above for details on how to report and were to
EMail your bug reports and hopefully patches to fix them. EMail your bug reports and hopefully patches to fix them.
=-=
Problems with known work-a-rounds: 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:
compiled optimized (-O, -O1, -O2 or -O3)
AND
compiled with debugging (-g or -g3)
AND
when calc is compiled with readline (see USE_READLINE,
READLINE_LIB and READLINE_INCLUDE in the Makefile)
On Redhat, the gcc -v which has this problem is:
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-85)
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
* There is a bug in gcc-2.95 that causes calc, when compiled with -O2, * There is a bug in gcc-2.95 that causes calc, when compiled with -O2,
to fail the regression test. The work-a-round is to compile with -O to fail the regression test. The work-a-round is to compile with -O
or to use gcc-2.96 or later. or to use gcc-2.96 or later.
This bug has been observed on the Sparc and the PowerPC machine.
On the PowerPC with gcc-2.95 when compiled with -O2, the following
patch seems to help:
*** zfunc.c.orig Fri Feb 23 18:18:39 2001
--- zfunc.c Fri Feb 23 18:39:33 2001
***************
*** 1481,1487 ****
{
HALF *a, *A, *b, *a0, u;
int i, j, j1, j2, k, k1, m, m0, m1, n, n0, o;
! FULL d, e, f, g, h, s, t, x, topbit;
int remsign;
BOOL up, onebit;
ZVALUE sqrt;
--- 1481,1488 ----
{
HALF *a, *A, *b, *a0, u;
int i, j, j1, j2, k, k1, m, m0, m1, n, n0, o;
! volatile FULL d;
! FULL e, f, g, h, s, t, x, topbit;
int remsign;
BOOL up, onebit;
ZVALUE sqrt;
*** zmath.c 2000/06/07 14:02:13 29.2
--- zmath.c 2001/03/13 19:47:03
***************
*** 1608,1614 ****
void
zbitvalue(long n, ZVALUE *res)
{
! ZVALUE z;
if (n < 0) n = 0;
z.sign = 0;
--- 1608,1614 ----
void
zbitvalue(long n, ZVALUE *res)
{
! volatile ZVALUE z;
if (n < 0) n = 0;
z.sign = 0;
* Solaris cc somtimes barfs while compiling zrand.c. In particular, calc * 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 barfs on on the SVAL macro. The work-a-round is to use the Solaric cc
Makefile set sets -DFORCE_STDC. I.e,: Makefile set sets -DFORCE_STDC. I.e,:
@@ -163,6 +250,28 @@ Problems with known work-a-rounds:
or performance. The work-a-round is to ignore these warnings or performance. The work-a-round is to ignore these warnings
under BSDI. 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 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
@@ -179,8 +288,8 @@ Problems with known work-a-rounds:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.5 $ ## @(#) $Revision: 29.18 $
## @(#) $Id: BUGS,v 29.5 2000/06/07 14:02:13 chongo Exp $ ## @(#) $Id: BUGS,v 29.18 2004/07/26 05:56:40 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/BUGS,v $ ## @(#) $Source: /usr/local/src/cmd/calc/RCS/BUGS,v $
## ##
## Under source code control: 1994/03/18 14:06:13 ## Under source code control: 1994/03/18 14:06:13

876
CHANGES

File diff suppressed because it is too large Load Diff

49
COPYING
View File

@@ -12,8 +12,8 @@ This file is Copyrighted
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
# @(#) $Revision: 29.3 $ # @(#) $Revision: 29.7 $
# @(#) $Id: COPYING,v 29.3 2000/12/14 09:18:06 chongo Exp $ # @(#) $Id: COPYING,v 29.7 2003/02/26 16:54:59 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/COPYING,v $ # @(#) $Source: /usr/local/src/cmd/calc/RCS/COPYING,v $
=-= =-=
@@ -55,13 +55,18 @@ Calc is covered by the GNU Lesser General Public License
The contact addresses for calc is as follows: The contact addresses for calc is as follows:
Web: http://www.isthe.com/chongo/tech/comp/calc/index.html Web: http://www.isthe.com/chongo/tech/comp/calc/email.html
EMail: calc-contrib at asthe dot com
To join the calc-tester mailing list. Send a request to: To join the low volume calc mailing list. Send a EMail message to:
calc-tester-request at asthe dot com calc-tester-request at asthe dot com
Your subject must contain the words:
calc mailing list subscription
You may have additional words in your subject line.
Your message body (not the subject) should consist of: Your message body (not the subject) should consist of:
subscribe calc-tester address subscribe calc-tester address
@@ -71,13 +76,23 @@ Calc is covered by the GNU Lesser General Public License
where ``address'' is your EMail address and ``your_full_name'' is where ``address'' is your EMail address and ``your_full_name'' is
your full name. your full name.
Calc bug reports, however should be sent to: Feel free to follow the name line with additional EMail text as desired.
=-=
Calc bug reports and calc bug fixes should be sent to:
calc-bugs at asthe dot com calc-bugs at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] [[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]] [[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
Your subject must contain the words:
calc bug report
You may have additional words in your subject line.
=-= =-=
Calc's relationship to the GNU Lesser General Public License Calc's relationship to the GNU Lesser General Public License
@@ -140,7 +155,7 @@ Calc copyrights and exception files
----------------------------------- -----------------------------------
With the exception of the files listed below, Calc is covered under With the exception of the files listed below, Calc is covered under
the following Copyrights: the following GNU Lesser General Public License Copyrights:
Copyright (C) year David I. Bell Copyright (C) year David I. Bell
Copyright (C) year David I. Bell and Landon Curt Noll Copyright (C) year David I. Bell and Landon Curt Noll
@@ -149,13 +164,13 @@ Calc copyrights and exception files
Copyright (C) year Landon Curt Noll Copyright (C) year Landon Curt Noll
Copyright (C) year Ernest Bowen and Landon Curt Noll Copyright (C) year Ernest Bowen and Landon Curt Noll
Copyright (C) year Ernest Bowen Copyright (C) year Ernest Bowen
Copyright (C) year Petteri Kettunen and Landon Curt Noll
A few files are not covered under the GNU Lesser General Public These files are not covered under one of the Copyrights listed above:
License. The source files not covered are:
shs1.c shs1.h shs.c shs.h shs1.c shs1.h shs.c shs.h
md5.c md5.h lib/qtime.cal COPYING md5.c md5.h COPYING COPYING-LGPL
COPYING-LGPL cal/qtime.cal
The file COPYING-LGPL, which contains a copy of the version 2.1 The file COPYING-LGPL, which contains a copy of the version 2.1
GNU Lesser General Public License, is itself Copyrighted by the GNU Lesser General Public License, is itself Copyrighted by the
@@ -168,10 +183,12 @@ Calc copyrights and exception files
verbatim copies of this file but you may not modify this file. verbatim copies of this file but you may not modify this file.
Some of these exception files are in the public domain. Other Some of these exception files are in the public domain. Other
exception files have non-LGPL Copyrights. In all cases one may exception files have non-LGPL Copyrights. Other files are under a
use and distribute these exception files freely. And because one LGPL Copyright but have different authors.
may freely distribute the LGPL covered files, the entire calc
source may be freely used and distributed. In all cases one may use and distribute these exception files freely.
And because one may freely distribute the LGPL covered files, the
entire calc source may be freely used and distributed.
=-= =-=

View File

@@ -1,34 +1,130 @@
Installing calc in 4 easy steps: Installing calc from the gziped tarball in 4 easy steps:
1) Look at the makefile, and adjust it to suit your needs. 0) If your platform supports i686 RPMs, you may want to go to:
Here are some Makefile hints: http://www.isthe.com/chongo/src/calc/
Select a compiler set by commenting in the appropriate set and use these RPMs:
of cc options. As shipped the Makefile assumes a gcc-like
environment such as Linux. If a more appropriate cc set if
found below, comment out the Linux set and comment in that
set or edit the gcc set or the common cc set as needed.
You may or may not need RANLIB when building libraries. * calc*.i686.rpm
As shipped the Makefile assumes RANLIB is needed. - all that is needed if you just want to use calc
Comment the in/out the RANLIB value if ranlib does
not work or does not exist.
You may want to change the default pager used by calc. * calc-devel-*.i686.rpm
As shipped the Makefile assumes 'more'. On your system - calc *.h header and *.a lib files for use in other programs
you may find 'less' to be a better pager.
Set TOPDIR to be the place under which help files, calc, * calc.*.src.rpm
include files and calc libs are to be installed. As shipped - calc source in RPM package form
the Makefile assumes a TOPDIR of /usr/local/lib.
Set BINDIR to the place where calc is installed. As shipped The following 4 steps apply to calc source tree that comes from either:
the Makefile assumes a BINDIR /usr/local/bin.
gunzip -c calc-*.tar.gz | tar -xvf -
or from:
rpm -ivh calc-*.src.rpm
cd /var/tmp
gunzip -c /usr/src/redhat/SOURCES/calc-*.tar.gz | tar -xvf -
1) Look at the makefile, and adjust it to suit your needs.
The Makefile, as shipped, is suitable for installation under
Linux and Un*x-like environments. For the most part, the default
values should work. If in doubt, follow the 'When in doubt'
suggestion.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! If you are building under Windoz or a Windoz-like environment !
! (such as Cygwin or DJGPP), read the README.WINDOWS file. !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
You should determine if these Makefile variables are reasonable:
INCDIR Where the system include (.h) files are kept.
BINDIR Where to install calc binary files.
LIBDIR Where to install calc link library (*.a) files.
CALC_SHAREDIR Where to install calc help, .cal, startup, and
config files.
You may want to change the default installation locations for
these values, which are based on the 4 values listed above:
HELPDIR where the help directory is installed
CALC_INCDIR where the calc include files are installed
CUSTOMCALDIR where custom *.cal files are installed
CUSTOMHELPDIR where custom help files are installed
CUSTOMINCPDIR where custom .h files are installed
SCRIPTDIR where calc shell scripts are installed
If you want to install calc files under a top level directory,
then set the T value:
The calc install is performed under $T, the calc build is
performed under /. The purpose for $T is to allow someone
to install calc somewhere other than into the system area.
For example, if:
BINDIR= /usr/bin
LIBDIR= /usr/lib
CALC_SHAREDIR= /usr/share/calc
and if:
T= /var/tmp/testing
Then the installation locations will be:
calc binary files: /var/tmp/testing/usr/bin
calc link library: /var/tmp/testing/usr/lib
calc help, .cal ...: /var/tmp/testing/usr/share/calc
... etc ... /var/tmp/testing/...
If $T is empty, calc is installed under /, which is the same
top of tree for which it was built. If $T is non-empty, then
calc is installed under $T, as if one had to chroot under
$T for calc to operate.
Look for the section that starts:
################
# compiler set #
################
Select a compiler set by commenting in the appropriate set
of cc options. As shipped the Makefile assumes a gcc-like
environment such as Linux. If a more appropriate cc set if
found below, comment out the Linux set and comment in that
set or edit the gcc set or the common cc set as needed.
You may want to change these Makrfile variables from their defaults:
RANLIB
You may or may not need RANLIB when building libraries.
As shipped the Makefile assumes RANLIB is needed.
Comment the in/out the RANLIB value if ranlib does
not work or does not exist.
CALCPAGER
You may want to change the default pager used by calc.
As shipped the Makefile assumes 'more'. On your system
you may find 'less' to be a better pager.
DEBUG
Some compilers (to put it mildly) have bugs. Sometimes the
DEBUG Makefile variable causes the compiler / optimizer to
produce bad code. Other compilers do just fine.
If possible try to use DEBUG=-O3 -g3 (maximum optimization
and debug symbols). If the calc test fails (see step 3),
try lowering either the -O value and/or the -g3. Also try
using -Osomething without -g.
Adjust other Makefile variables as needed. Adjust other Makefile variables as needed.
2) build calc: 2) build calc:
make all make all
@@ -36,13 +132,14 @@ Installing calc in 4 easy steps:
you may find. See the BUGS file if you find any compiler you may find. See the BUGS file if you find any compiler
warning or errors. warning or errors.
3) test calc: 3) test calc:
make check make check
==> If you run into problems, follow the BUGS file instructions. ==> If you run into problems, read the BUGS file and follow
the instructions found in there.
4) install calc: 4) install calc:
make install make install
@@ -65,8 +162,8 @@ the calc help subsystem. See the README file for details.
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.7 $
## @(#) $Id: HOWTO.INSTALL,v 29.2 2000/06/07 14:02:13 chongo Exp $ ## @(#) $Id: HOWTO.INSTALL,v 29.7 2003/04/15 03:38:34 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/HOWTO.INSTALL,v $ ## @(#) $Source: /usr/local/src/cmd/calc/RCS/HOWTO.INSTALL,v $
## ##
## Under source code control: 1999/09/27 20:48:44 ## Under source code control: 1999/09/27 20:48:44

28
LIBRARY
View File

@@ -48,12 +48,30 @@ convenient for outside use. So you should read the source for a routine
to see if it really does what you think it does. I won't guarantee that to see if it really does what you think it does. I won't guarantee that
obscure internal routines won't change or disappear in future releases! obscure internal routines won't change or disappear in future releases!
When calc is installed, all of the include files needed to build When calc is installed, all of libraries are installed into ${LIBDIR}.
libcalc.a along with the link library itself are installed into ${LIBDIR}. All of the calc header files are installed under ${INCDIRCALC}.
If CALC_SRC is defined, then the calc header files will assume that
they are in or under the current directory. However, most external
programs most likely will not be located under calc'c source tree.
External programs most likely want to use the installed calc header
files under ${INCDIRCALC}. External programs most likely NOT want
to define CALC_SRC.
External programs may want to compile with: External programs may want to compile with:
-I${LIBDIR} -L${LIBDIR} -lcalc -L${LIBDIR} -lcalc
If custom functions are also used, they may want to compile with:
-L${LIBDIR} -lcalc -lcustcalc
The CALC_SRC symbol should NOT be defined by default. However if you are
feeling pedantic you may want to force CALC_SRC to be undefined:
-UCALC_SRC
as well.
-------------- --------------
ERROR HANDLING ERROR HANDLING
@@ -471,8 +489,8 @@ need call libcalc_call_me_last() only once.
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.5 $
## @(#) $Id: LIBRARY,v 29.2 2000/06/07 14:02:13 chongo Exp $ ## @(#) $Id: LIBRARY,v 29.5 2001/06/08 22:57:35 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/LIBRARY,v $ ## @(#) $Source: /usr/local/src/cmd/calc/RCS/LIBRARY,v $
## ##
## Under source code control: 1993/07/30 19:44:49 ## Under source code control: 1993/07/30 19:44:49

2120
Makefile

File diff suppressed because it is too large Load Diff

24
README
View File

@@ -73,13 +73,19 @@ for a wish/todo list. Code contributions are welcome.
=-= =-=
To join the calc-tester mailing list. Send a request to: To join the calc-tester mailing list. Send an EMail message to:
calc-tester-request at asthe dot com calc-tester-request at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] [[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]] [[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
Your subject must contain the words:
calc mailing list subscription
You may have additional words in your subject line.
Your message body (not the subject) should consist of: Your message body (not the subject) should consist of:
subscribe calc-tester address subscribe calc-tester address
@@ -89,7 +95,11 @@ Your message body (not the subject) should consist of:
where ``address'' is your EMail address and ``your_full_name'' is where ``address'' is your EMail address and ``your_full_name'' is
your full name. your full name.
Calc bug reports, however should be sent to: Feel free to follow the name line with additional EMail text as desired.
=-=
Send Calc bug and bug fixes to:
calc-bugs at asthe dot com calc-bugs at asthe dot com
@@ -98,6 +108,12 @@ Calc bug reports, however should be sent to:
but see the BUGS file first. but see the BUGS file first.
Your subject must contain the words:
calc bug report
You may have additional words in your subject line.
The calc web site is located at: The calc web site is located at:
http://www.isthe.com/chongo/tech/comp/calc/ http://www.isthe.com/chongo/tech/comp/calc/
@@ -118,8 +134,8 @@ The calc web site is located at:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: README,v 29.2 2000/06/07 14:02:13 chongo Exp $ ## @(#) $Id: README,v 29.3 2001/06/01 11:26:53 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/README,v $ ## @(#) $Source: /usr/local/src/cmd/calc/RCS/README,v $
## ##
## Under source code control: 1995/10/25 05:27:59 ## Under source code control: 1995/10/25 05:27:59

169
README.WINDOWS Normal file
View File

@@ -0,0 +1,169 @@
Dear calc user on a Windoz based system,
See the HOWTO.INSTALL file for information on how to build and install calc.
See also the README file.
NOTE: The main developers do not have access to a Windoz based platform.
While we will make an effort to not break calc Windoz based system,
our lack of a Windoz test environment will mean we will make mistakes
from time to time. Hopefully Windowz users can overcome these mistakes.
Of course you are welcome to send us any patches that fix your
Windoz build environment.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-= compiling under DJGPP =-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
You might want to try using the DJGPP system to compile calc. See:
http://www.delorie.com/djgpp/
for DJGPP details and availability.
To compile with DJGPP, one needs to select a number of Makefile
variable changes. Eli Zaretskii <eliz at is dot elta dot co dot il>
recommends the following settings:
TERMCONTROL= -DUSE_TERMIOS
BYTE_ORDER= -DLITTLE_ENDIAN
LONG_BITS= 32
HAVE_FPOS_POS= -DHAVE_NO_FPOS_POS
FPOS_BITS= 32
OFF_T_BITS= 32
DEV_BITS= 32
INODE_BITS= 32
HAVE_USTAT= -DHAVE_NO_USTAT
HAVE_GETSID= -DHAVE_NO_GETSID
HAVE_GETPGID= -DHAVE_NO_GETPGID
HAVE_GETTIME= -DHAVE_NO_GETTIME
HAVE_GETPRID= -DHAVE_NO_GETPRID
HAVE_URANDOM_H= NO
ALIGN32= -UMUST_ALIGN32
HAVE_MALLOC_H= YES
HAVE_STDLIB_H= YES
HAVE_STRING_H= YES
HAVE_TIMES_H= NO
HAVE_SYS_TIMES_H= YES
HAVE_TIME_H= YES
HAVE_SYS_TIME_H= YES
HAVE_UNISTD_H= YES
BINDIR= /dev/env/DJDIR/bin
INCDIR= /dev/env/DJDIR/include
LIBDIR= /dev/env/DJDIR/lib
MANDIR= /dev/env/DJDIR/man/man1
CATDIR= /dev/env/DJDIR/man/cat1
NROFF= groff
CALCPATH= .;./cal;~/.cal;${CALC_SHAREDIR};${CUSTOMCALDIR}
CALCRC= ${CALC_SHAREDIR}/startup;~/.calcrc;./.calcinit
CALCPAGER= less.exe -ci
DEBUG= -O2 -gstabs+
The 'Linux set' or 'gcc set' (see the Select your compiler type section)
should work for DJGPP systems if you set the above Makefile variables.
Look for Makefile comments of the form:
# Select ...something... for DJGPP.
Follow those recommendations. In cases where they conflict with
the above Makefile list, follow the recommendation in the Makefile.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-= compiling with Cygwin =-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
An effort is being made to allow windows users to compile calc using the
Cygwin project (http://sources.redhat.com/cygwin/) with the GCC compiler
and Un*x tools for Windows.
The major porting work was performed by Thomas Jones-Low
(tjoneslo at softstart dot com). He said:
I had previous stated to this group that I have successfully managed
to port a version of Calc to Windows, and promised some point to
post what was required, so here it is.
One obvious manner of doing this port is to get the latest version
of the Cygwin project (http://sources.redhat.com/cygwin/) with the
GCC compiler and Un*x tools for Windows and recompile.
I built my working version using Calc ... I am using Visual C++
version 7.0, which is an older version of the Microsoft development
tools. The make file provided with Calc is not compatible with
NMAKE, so I used the Visual Studio tools to generate another one
(not included). Calc is built in two parts, calc.dll, which is the
library, and calc.exe which is the command line interface.
He recommended that you generate by hand all of the header files that
by the Makefile. This has been done for you via the makefile rule:
make win32_hsrc
which uses the Makefile variables in win32.mkdef to form these header
files under win32 directory.
You will find generated versions of these files located in the win32
sub-directory. These files may be appropriate for your Cygwin building
needs.
In particular:
Just copy the win32/*.[ch] files up into the top level calc
source directory, edit them (if needed) and build using the
Cygwin GCC compiler and Cygwin build environment.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-= calc maintenance folk =-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
People who maintain calc need to keep in mind the following:
The following was added to opcodes.h, config.h, zmath.h and value.h:
#if defined(_WIN32)
#ifdef _EXPORTING
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif
#else /* Windoz free systems */
#define DLL
#endif /* Windoz free systems */
Then DLL was added in front of all the exported functions. For example:
extern int configtype(char*);
was changed to:
DLL extern int configtype(char*);
## Copyright (C) 2002 Landon Curt Noll and Thomas Jones-Low
##
## 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.12 $
## @(#) $Id: README.WINDOWS,v 29.12 2004/07/28 12:52:01 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/RCS/README.WINDOWS,v $
##
## Under source code control: 2001/02/25 14:00:05
## File existed as early as: 2001
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

14
addop.c
View File

@@ -1,7 +1,7 @@
/* /*
* addop - add opcodes to a function being compiled * addop - add opcodes to a function being compiled
* *
* Copyright (C) 1999 David I. Bell and Ernest Bowen * Copyright (C) 1999-2004 David I. Bell and Ernest Bowen
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.5 $
* @(#) $Id: addop.c,v 29.3 2000/07/17 15:35:49 chongo Exp $ * @(#) $Id: addop.c,v 29.5 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/addop.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/addop.c,v $
* *
* Under source code control: 1990/02/15 01:48:10 * Under source code control: 1990/02/15 01:48:10
@@ -44,7 +44,7 @@
#define OPCODEALLOCSIZE 100 /* reallocate size for opcodes in functions */ #define OPCODEALLOCSIZE 100 /* reallocate size for opcodes in functions */
static long maxopcodes; /* number of opcodes available */ static unsigned long maxopcodes;/* number of opcodes available */
static long newindex; /* index of new function */ static long newindex; /* index of new function */
static char *newname; /* name of new function */ static char *newname; /* name of new function */
static long oldop; /* previous opcode */ static long oldop; /* previous opcode */
@@ -185,7 +185,7 @@ endfunc(void)
{ {
register FUNC *fp; /* function just finished */ register FUNC *fp; /* function just finished */
unsigned long size; /* size of just created function */ unsigned long size; /* size of just created function */
long index; unsigned long index;
if (oldop != OP_RETURN) { if (oldop != OP_RETURN) {
addop(OP_UNDEF); addop(OP_UNDEF);
@@ -302,7 +302,7 @@ void
freefunc(FUNC *fp) freefunc(FUNC *fp)
{ {
long index; long index;
long i; unsigned long i;
if (fp == NULL) if (fp == NULL)
return; return;
@@ -383,7 +383,7 @@ clearopt(void)
FUNC * FUNC *
findfunc(long index) findfunc(long index)
{ {
if ((unsigned long) index >= funccount) { if (index >= funccount) {
math_error("Undefined function"); math_error("Undefined function");
/*NOTREACHED*/ /*NOTREACHED*/
} }

19
alloc.h
View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: alloc.h,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: alloc.h,v 29.4 2001/06/08 21:00:58 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/alloc.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/alloc.h,v $
* *
* Under source code control: 1990/02/15 01:48:29 * Under source code control: 1990/02/15 01:48:29
@@ -32,10 +32,17 @@
#define __ALLOC_H__ #define __ALLOC_H__
#include "have_malloc.h" #if defined(CALC_SRC) /* if we are building from the calc source tree */
#include "have_newstr.h" # include "have_malloc.h"
#include "have_string.h" # include "have_newstr.h"
#include "have_memmv.h" # include "have_string.h"
# include "have_memmv.h"
#else
# include <calc/have_malloc.h>
# include <calc/have_newstr.h>
# include <calc/have_string.h>
# include <calc/have_memmv.h>
#endif
#ifdef HAVE_MALLOC_H #ifdef HAVE_MALLOC_H
# include <malloc.h> # include <malloc.h>

View File

@@ -1,7 +1,7 @@
/* /*
* blkcpy - general values and related routines used by the calculator * blkcpy - general values and related routines used by the calculator
* *
* Copyright (C) 1999 Landon Curt Noll and Ernest Bowen * Copyright (C) 1999-2004 Landon Curt Noll and Ernest Bowen
* *
* Primary author: Landon Curt Noll * Primary author: Landon Curt Noll
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.5 $
* @(#) $Id: blkcpy.c,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: blkcpy.c,v 29.5 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/blkcpy.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/blkcpy.c,v $
* *
* Under source code control: 1997/04/18 20:41:26 * Under source code control: 1997/04/18 20:41:26
@@ -287,13 +287,13 @@ copymat2mat(MATRIX *smat, long ssi, long num, MATRIX *dmat, long dsi)
if (num < 0) if (num < 0)
num = smat->m_size - ssi; num = smat->m_size - ssi;
if ((USB32) ssi + num > smat->m_size) if (ssi + num > smat->m_size)
return E_COPY5; return E_COPY5;
if (num == 0) if (num == 0)
return 0; return 0;
if (dsi < 0) if (dsi < 0)
dsi = 0; dsi = 0;
if ((USB32) dsi + num > dmat->m_size) if (dsi + num > dmat->m_size)
return E_COPY7; return E_COPY7;
vtemp = (VALUE *) malloc(num * sizeof(VALUE)); vtemp = (VALUE *) malloc(num * sizeof(VALUE));
if (vtemp == NULL) { if (vtemp == NULL) {
@@ -335,13 +335,13 @@ copyblk2mat(BLOCK *blk, long ssi, long num, MATRIX *dmat, long dsi)
return E_COPY2; return E_COPY2;
if (num < 0) if (num < 0)
num = blk->datalen - ssi; num = blk->datalen - ssi;
if ((USB32) ssi + num > blk->datalen) if (ssi + num > blk->datalen)
return E_COPY5; return E_COPY5;
if (num == 0) if (num == 0)
return 0; return 0;
if (dsi < 0) if (dsi < 0)
dsi = 0; dsi = 0;
if ((USB32) dsi + num > dmat->m_size) if (dsi + num > dmat->m_size)
return E_COPY7; return E_COPY7;
op = blk->data + ssi; op = blk->data + ssi;
vtemp = (VALUE *) malloc(num * sizeof(VALUE)); vtemp = (VALUE *) malloc(num * sizeof(VALUE));
@@ -389,7 +389,7 @@ copymat2blk(MATRIX *smat, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
num = smat->m_size - ssi; num = smat->m_size - ssi;
if (num == 0) if (num == 0)
return 0; return 0;
if ((USB32) ssi + num > smat->m_size) if (ssi + num > smat->m_size)
return E_COPY5; return E_COPY5;
if (dsi < 0) if (dsi < 0)
dsi = dblk->datalen; dsi = dblk->datalen;
@@ -436,11 +436,11 @@ copymat2list(MATRIX *smat, long ssi, long num, LIST *lp, long dsi)
num = smat->m_size - ssi; num = smat->m_size - ssi;
if (num == 0) if (num == 0)
return 0; return 0;
if ((USB32) ssi + num > smat->m_size) if (ssi + num > smat->m_size)
return E_COPY5; return E_COPY5;
if (dsi < 0) if (dsi < 0)
dsi = 0; dsi = 0;
if ((USB32) dsi + num > lp->l_count) if (dsi + num > lp->l_count)
return E_COPY7; return E_COPY7;
vtemp = (VALUE *) malloc(num * sizeof(VALUE)); vtemp = (VALUE *) malloc(num * sizeof(VALUE));
if (vtemp == NULL) { if (vtemp == NULL) {
@@ -484,11 +484,11 @@ copylist2mat(LIST *lp, long ssi, long num, MATRIX *dmat, long dsi)
num = lp->l_count - ssi; num = lp->l_count - ssi;
if (num == 0) if (num == 0)
return 0; return 0;
if ((USB32) ssi + num > lp->l_count) if (ssi + num > lp->l_count)
return E_COPY5; return E_COPY5;
if (dsi < 0) if (dsi < 0)
dsi = 0; dsi = 0;
if ((USB32) dsi + num > dmat->m_size) if (dsi + num > dmat->m_size)
return E_COPY7; return E_COPY7;
vtemp = (VALUE *) malloc(num * sizeof(VALUE)); vtemp = (VALUE *) malloc(num * sizeof(VALUE));
if (vtemp == NULL) { if (vtemp == NULL) {
@@ -533,11 +533,11 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
num = slp->l_count - ssi; num = slp->l_count - ssi;
if (num == 0) if (num == 0)
return 0; return 0;
if ((USB32) ssi + num > slp->l_count) if (ssi + num > slp->l_count)
return E_COPY5; return E_COPY5;
if (dsi < 0) if (dsi < 0)
dsi = 0; dsi = 0;
if ((USB32) dsi + num > dlp->l_count) if (dsi + num > dlp->l_count)
return E_COPY7; return E_COPY7;
vtemp = (VALUE *) malloc(num * sizeof(VALUE)); vtemp = (VALUE *) malloc(num * sizeof(VALUE));
if (vtemp == NULL) { if (vtemp == NULL) {
@@ -572,7 +572,7 @@ copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
{ {
FILEIO *fiop; FILEIO *fiop;
FILE *fp; FILE *fp;
unsigned int numw; long numw;
if (ssi > sblk->datalen) if (ssi > sblk->datalen)
return E_COPY2; return E_COPY2;
@@ -581,7 +581,7 @@ copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
if (num == 0) if (num == 0)
return 0; return 0;
fiop = findid(id, 'w'); fiop = findid(id, TRUE);
if (fiop == NULL) if (fiop == NULL)
return E_COPYF1; return E_COPYF1;
fp = fiop->fp; fp = fiop->fp;
@@ -609,7 +609,7 @@ copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
{ {
FILEIO *fiop; FILEIO *fiop;
FILE *fp; FILE *fp;
unsigned int numw; long numw;
ZVALUE fsize; ZVALUE fsize;
long filelen; long filelen;
long newlen; long newlen;
@@ -618,7 +618,7 @@ copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
if (id < 3) /* excludes copying from stdin */ if (id < 3) /* excludes copying from stdin */
return E_COPYF1; return E_COPYF1;
fiop = findid(id, 'r'); fiop = findid(id, FALSE);
if (fiop == NULL) if (fiop == NULL)
return E_COPYF1; return E_COPYF1;
@@ -639,7 +639,7 @@ copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
num = filelen - ssi; num = filelen - ssi;
if (num == 0) if (num == 0)
return 0; return 0;
if ((USB32) ssi + num > filelen) if (ssi + num > filelen)
return E_COPY5; return E_COPY5;
if (fseek(fp, ssi, 0)) /* using system fseek XXX */ if (fseek(fp, ssi, 0)) /* using system fseek XXX */
return E_COPYF2; return E_COPYF2;
@@ -677,7 +677,7 @@ copystr2file(STRING *str, long ssi, long num, FILEID id, long dsi)
{ {
long len; long len;
FILEIO *fiop; FILEIO *fiop;
unsigned int numw; long numw;
FILE *fp; FILE *fp;
len = str->s_len; len = str->s_len;
@@ -688,9 +688,9 @@ copystr2file(STRING *str, long ssi, long num, FILEID id, long dsi)
num = len - ssi; num = len - ssi;
if (num <= 0) /* Nothing to be copied */ if (num <= 0) /* Nothing to be copied */
return 0; return 0;
if ((USB32) ssi + num > len) if (ssi + num > len)
return E_COPY5; /* Insufficient memory in str */ return E_COPY5; /* Insufficient memory in str */
fiop = findid(id, 'w'); fiop = findid(id, TRUE);
if (fiop == NULL) if (fiop == NULL)
return E_COPYF1; return E_COPYF1;
fp = fiop->fp; fp = fiop->fp;
@@ -726,7 +726,7 @@ copyblk2blk(BLOCK *sblk, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc
num = sblk->datalen - ssi; num = sblk->datalen - ssi;
if (num == 0) /* Nothing to be copied */ if (num == 0) /* Nothing to be copied */
return 0; return 0;
if ((unsigned int) ssi + num > sblk->datalen) if (ssi + num > sblk->datalen)
return E_COPY5; return E_COPY5;
if (dsi < 0) if (dsi < 0)
dsi = dblk->datalen; dsi = dblk->datalen;
@@ -888,7 +888,7 @@ copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
if (ssi > len) if (ssi > len)
return E_COPY2; return E_COPY2;
if (num < 0 || (unsigned long) ssi + num > len) if (num < 0 || ssi + num > len)
num = len - ssi; num = len - ssi;
if (num <= 0) /* Nothing to be copied */ if (num <= 0) /* Nothing to be copied */
return 0; return 0;
@@ -991,7 +991,7 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
num = snum->num.len - ssi; num = snum->num.len - ssi;
if (num == 0) /* Nothing to be copied */ if (num == 0) /* Nothing to be copied */
return 0; return 0;
if ((unsigned long) ssi + num > snum->num.len) if (ssi + num > snum->num.len)
return E_COPY5; return E_COPY5;
if (dsi < 0) if (dsi < 0)
dsi = dblk->datalen; dsi = dblk->datalen;
@@ -1044,7 +1044,7 @@ copyblk2num(BLOCK *sblk, long ssi, long num, NUMBER *dnum, long dsi, NUMBER **re
num = sblk->datalen - ssi; num = sblk->datalen - ssi;
if (num == 0) /* Nothing to be copied */ if (num == 0) /* Nothing to be copied */
return 0; return 0;
if ((unsigned long) ssi + num > sblk->datalen) if (ssi + num > sblk->datalen)
return E_COPY5; return E_COPY5;
if (dsi < 0) if (dsi < 0)
dsi = dnum->num.len; dsi = dnum->num.len;

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: byteswap.h,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: byteswap.h,v 29.4 2001/06/08 21:00:58 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/byteswap.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/byteswap.h,v $
* *
* Under source code control: 1995/10/11 04:44:01 * Under source code control: 1995/10/11 04:44:01
@@ -33,7 +33,11 @@
#define __BYTESWAP_H__ #define __BYTESWAP_H__
#include "longbits.h" #if defined(CALC_SRC) /* if we are building from the calc source tree */
# include "longbits.h"
#else
# include <calc/longbits.h>
#endif
/* /*

View File

@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.3 $ # @(#) $Revision: 29.15 $
# @(#) $Id: Makefile,v 29.3 2000/12/15 14:42:52 chongo Exp $ # @(#) $Id: Makefile,v 29.15 2003/01/05 08:10:56 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/Makefile,v $
# #
# Under source code control: 1991/07/21 05:00:54 # Under source code control: 1991/07/21 05:00:54
@@ -36,15 +36,120 @@
SHELL = /bin/sh SHELL = /bin/sh
MAKE_FILE = Makefile MAKE_FILE = Makefile
####
# Normally, the upper level makefile will set these values. We provide # Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory. # a default here just in case you want to build from this directory.
# ####
# where to install things
TOPDIR= /usr/local/lib
#TOPDIR= /usr/lib
#TOPDIR= /usr/libdata
LIBDIR= ${TOPDIR}/calc # Where the system include (.h) files are kept
#
# For DJGPP, select:
#
# INCDIR= /dev/env/DJDIR/include
#
# If in doubt, set:
#
# INCDIR= /usr/include
#
#INCDIR= /usr/local/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# where to install calc realted things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
# ${CALC_SHAREDIR} where to install calc help, .cal, startup, config files
#
# NOTE: The install rule prepends installation paths with $T, which
# by default is empty. If $T is non-empty, then installation
# locations will be relative to the $T directory.
#
# For DJGPP, select:
#
# BINDIR= /dev/env/DJDIR/bin
# LIBDIR= /dev/env/DJDIR/lib
# CALC_SHAREDIR= /dev/env/DJDIR/share/calc
#
# If in doubt, set:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= /usr/local/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= /usr/local/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= /usr/local/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
# By default, these values are based CALC_SHAREDIR, INCDIR, BINDIR
# ---------------------------------------------------------------
# ${HELPDIR} where the help directory is installed
# ${CALC_INCDIR} where the calc include files are installed
# ${CUSTOMCALDIR} where custom *.cal files are installed
# ${CUSTOMHELPDIR} where custom help files are installed
# ${CUSTOMINCPDIR} where custom .h files are installed
# ${SCRIPTDIR} where calc shell scripts are installed
#
# NOTE: The install rule prepends installation paths with $T, which
# by default is empty. If $T is non-empty, then installation
# locations will be relative to the $T directory.
#
# If in doubt, set:
#
# HELPDIR= ${CALC_SHAREDIR}/help
# CALC_INCDIR= ${INCDIR}/calc
# CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
# CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
# CUSTOMINCDIR= ${CALC_INCDIR}/custom
# SCRIPTDIR= ${BINDIR}/cscript
#
HELPDIR= ${CALC_SHAREDIR}/help
CALC_INCDIR= ${INCDIR}/calc
CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
CUSTOMINCDIR= ${CALC_INCDIR}/custom
SCRIPTDIR= ${BINDIR}/cscript
# T - top level directory under which calc will be installed
#
# The calc install is performed under $T, the calc build is
# performed under /. The purpose for $T is to allow someone
# to install calc somewhere other than into the system area.
#
# For example, if:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
# and if:
#
# T= /var/tmp/testing
#
# Then the installation locations will be:
#
# calc binary files: /var/tmp/testing/usr/bin
# calc link library: /var/tmp/testing/usr/lib
# calc help, .cal ...: /var/tmp/testing/usr/share/calc
# ... etc ... /var/tmp/testing/...
#
# If $T is empty, calc is installed under /, which is the same
# top of tree for which it was built. If $T is non-empty, then
# calc is installed under $T, as if one had to chroot under
# $T for calc to operate.
#
# If in doubt, use T=
#
T=
# Makefile debug # Makefile debug
# #
@@ -57,6 +162,7 @@ Q=@
# standard tools # standard tools
# #
CHMOD= chmod CHMOD= chmod
CMP= cmp
# The calc files to install # The calc files to install
# #
@@ -69,8 +175,8 @@ CALC_FILES= README bigprime.cal deg.cal ellip.cal lucas.cal lucas_chk.cal \
test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \ test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \
test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \ test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \
beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \ beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \
randomrun.cal xx_print.cal natnumset.cal qtime.cal test8400.cal \ randomrun.cal repeat.cal xx_print.cal natnumset.cal qtime.cal \
test8500.cal test8600.cal test8400.cal test8500.cal test8600.cal chi.cal intfile.cal
# These files are found (but not built) in the distribution # These files are found (but not built) in the distribution
# #
@@ -102,8 +208,10 @@ all: ${CALC_FILES} ${MAKE_FILE} .all
## ##
distlist: ${DISTLIST} distlist: ${DISTLIST}
${Q}for i in ${DISTLIST}; do \ ${Q}for i in ${DISTLIST} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo cal/$$i; \ echo cal/$$i; \
fi; \
done done
distdir: distdir:
@@ -116,34 +224,54 @@ calcliblist:
fi; \ fi; \
done done
##
#
# rpm rules
#
##
echo_inst_files:
${Q}for i in ${CALC_FILES} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo __file__ ${CALC_SHAREDIR}/$$i; \
fi; \
done
##
#
# Utility rules
#
##
clean: clean:
clobber: clobber:
rm -f .all rm -f .all
install: all install: all
-${Q}if [ ! -d ${TOPDIR} ]; then \ -${Q}if [ ! -d $T${CALC_SHAREDIR} ]; then \
echo mkdir ${TOPDIR}; \ echo mkdir $T${CALC_SHAREDIR}; \
mkdir ${TOPDIR}; \ mkdir $T${CALC_SHAREDIR}; \
if [ ! -d "$T${CALC_SHAREDIR}" ]; then \
echo mkdir -p "$T${CALC_SHAREDIR}"; \
mkdir -p "$T${CALC_SHAREDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${CALC_SHAREDIR}; \
${CHMOD} 0755 $T${CALC_SHAREDIR}; \
else \ else \
true; \ true; \
fi fi
-${Q}if [ ! -d ${LIBDIR} ]; then \ ${Q}for i in ${CALC_FILES} /dev/null; do \
echo mkdir ${LIBDIR}; \ if [ "$$i" = "/dev/null" ]; then \
mkdir ${LIBDIR}; \ continue; \
else \ fi; \
true; \ if ${CMP} -s $$i $T${CALC_SHAREDIR}/$$i; then \
fi true; \
${Q}for i in ${CALC_FILES}; do \ else \
echo rm -f ${LIBDIR}/$$i; \ rm -f $T${CALC_SHAREDIR}/$$i.new; \
rm -f ${LIBDIR}/$$i; \ cp -f $$i $T${CALC_SHAREDIR}/$$i.new; \
echo cp $$i ${LIBDIR}; \ ${CHMOD} 0444 $T${CALC_SHAREDIR}/$$i.new; \
cp $$i ${LIBDIR}; \ mv -f $T${CALC_SHAREDIR}/$$i.new $T${CALC_SHAREDIR}/$$i; \
echo ${CHMOD} 0444 ${LIBDIR}/$$i; \ echo "installed $T${CALC_SHAREDIR}/$$i"; \
${CHMOD} 0444 ${LIBDIR}/$$i; \ fi; \
done done
${Q}echo remove files that are obsolete
-rm -f nextprime.cal nextprim.cal
-rm -f test1000.cal test2000.cal ${LIBDIR}/test2000.cal
-rm -f ${LIBDIR}/nextprime.cal ${LIBDIR}/nextprim.cal
-rm -f ${LIBDIR}/test1000.cal ${LIBDIR}/cryrand.cal

View File

@@ -64,7 +64,7 @@ Zero value of config("resource_debug") means that no such information
is displayed. For other values, the non-zero bits which currently is displayed. For other values, the non-zero bits which currently
have meanings are as follows: have meanings are as follows:
n Meaning of bit n of config("resource_debug") n Meaning of bit n of config("resource_debug")
0 When a function is defined, redefined or undefined at 0 When a function is defined, redefined or undefined at
interactive level, a message saying what has been done interactive level, a message saying what has been done
@@ -74,6 +74,12 @@ have meanings are as follows:
the reading of a file, a message saying what has been done the reading of a file, a message saying what has been done
is displayed. is displayed.
2 Show func will display more information about a functions
arguments as well as more argument sdummary information.
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, 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. 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") Thus, if calc is started without the -d flag, until config("resource_debug")
@@ -97,6 +103,14 @@ either of the bottom 2 bits set:
print "funcB(size, mass, ...) defined"; print "funcB(size, mass, ...) defined";
} }
If your the resource file needs to output special debugging informatin,
we recommend that you check for bit 3 of the config("resource_debug")
before printing the debug statement:
if (config("resource_debug") & 8) {
print "DEBUG: This a sample debug statement";
}
=-= =-=
The following is a brief description of some of the calc resource files The following is a brief description of some of the calc resource files
@@ -128,6 +142,24 @@ bigprime.cal
A prime test, base a, on p*2^x+1 for even x>m. A prime test, base a, on p*2^x+1 for even x>m.
chi.cal
Z(x[, eps])
P(x[, eps])
chi_prob(chi_sq, v[, eps])
Computes the Probability, given the Null Hypothesis, that a given
Chi squared values >= chi_sq with v degrees of freedom.
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).
The Z(x) and P(x) are internal statistical funcions.
eps is an optional epsilon() like error term.
chrem.cal chrem.cal
chrem(r1,m1 [,r2,m2, ...]) chrem(r1,m1 [,r2,m2, ...])
@@ -163,6 +195,33 @@ hello.cal
http://www.latech.edu/~acm/helloworld/calc.html http://www.latech.edu/~acm/helloworld/calc.html
intfile.cal
file2be(filename)
Read filename and return an integer that is built from the
octets in that file in Big Endian order. The first octets
of the file become the most significant bits of the integer.
file2le(filename)
Read filename and return an integer that is built from the
octets in that file in Little Endian order. The first octets
of the file become the most significant bits of the integer.
be2file(v, filename)
Write the absolute value of v into filename in Big Endian order.
The v argument must be on integer. The most significant bits
of the integer become the first octets of the file.
le2file(v, filename)
Write the absolute value of v into filename in Little Endian order.
The v argument must be on integer. The least significant bits
of the integer become the last octets of the file.
lucas.cal lucas.cal
lucas(h, n) lucas(h, n)
@@ -421,6 +480,16 @@ randrun.cal
This tests the a55 generator. This tests the a55 generator.
repeat.cal
repeat(digit_set, repeat_count)
Return the value of the digit_set repeated repeat_count times.
Both digit_set and repeat_count must be integers > 0.
For example repeat(423,5) returns the value 423423423423423,
which is the digit_set 423 repeated 5 times.
regress.cal regress.cal
@@ -756,8 +825,8 @@ xx_print.cal
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.4 $ ## @(#) $Revision: 29.9 $
## @(#) $Id: README,v 29.4 2000/12/17 12:26:04 chongo Exp $ ## @(#) $Id: README,v 29.9 2003/01/05 08:10:56 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/README,v $ ## @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/README,v $
## ##
## Under source code control: 1990/02/15 01:50:32 ## Under source code control: 1990/02/15 01:50:32

251
cal/chi.cal Normal file
View File

@@ -0,0 +1,251 @@
/*
* chi - chi^2 probabilities with degrees of freedom for null hypothesis
*
* Copyright (C) 2001 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: chi.cal,v 29.2 2001/04/08 10:21:23 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/chi.cal,v $
*
* Under source code control: 2001/03/27 14:10:11
* File existed as early as: 2001
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* Z(x)
*
* From Handbook of Mathematical Functions
* 10th printing, Dec 1972 with corrections
* National Bureau of Standards
*
* Section 26.2.1, p931.
*/
define Z(x, eps_term)
{
local eps; /* error term */
/* obtain the error term */
if (isnull(eps_term)) {
eps = epsilon();
} else {
eps = eps_term;
}
/* compute Z(x) value */
return exp(-x*x/2, eps) / sqrt(2*pi(eps), eps);
}
/*
* P(x[, eps]) asymtotic P(x) expansion for x>0 to an given epsilon error term
*
* NOTE: If eps is omitted, the stored epsilon value is used.
*
* From Handbook of Mathematical Functions
* 10th printing, Dec 1972 with corrections
* National Bureau of Standards
*
* 26.2.11, p932:
*
* P(x) = 1/2 + Z(x) * sum(n=0; n < infinity){x^(2*n+1)/(1*3*5*...(2*n+1)};
*
* We continue the fraction until it is less than epsilon error term.
*
* Also note 26.2.5:
*
* P(x) + Q(x) = 1
*/
define P(x, eps_term)
{
local eps; /* error term */
local s; /* sum */
local x2; /* x^2 */
local x_term; /* x^(2*r+1) */
local odd_prod; /* 1*3*5* ... */
local odd_term; /* next odd value to multiply into odd_prod */
local term; /* the recent term added to the sum */
/* obtain the error term */
if (isnull(eps_term)) {
eps = epsilon();
} else {
eps = eps_term;
}
/* firewall */
if (x <= 0) {
if (x == 0) {
return 0; /* hack */
} else {
quit "Q(x[,eps]) 1st argument must be >= 0";
}
}
if (eps <= 0) {
quit "Q(x[,eps]) 2nd argument must be > 0";
}
/*
* aproximate sum(n=0; n < infinity){x^(2*n+1)/(1*3*5*...(2*n+1)}
*/
x2 = x*x;
x_term = x;
s = x_term; /* 1st term */
odd_term = 1;
odd_prod = 1;
do {
/* compute the term */
odd_term += 2;
odd_prod *= odd_term;
x_term *= x2;
term = x_term / odd_prod;
s += term;
} while (term >= eps);
/* apply term and factor */
return 0.5 + Z(x,eps)*s;
}
/*
* chi_prob(chi_sq, v[, eps]) - Prob of >= chi^2 with v degrees of freedom
*
* Computes the Probability, given the Null Hypothesis, that a given
* Chi squared values >= chi_sq with v degrees of freedom.
*
* 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).
*
* NOTE: This function does not work well with odd degrees of freedom.
* Can somebody help / find a bug / provide a better method of
* this odd degrees of freedom case?
*
* NOTE: This function works well with even degrees of freedom. However
* when the even degrees gets large (say, as you approach 100), you
* need to increase your error term.
*
* From Handbook of Mathematical Functions
* 10th printing, Dec 1972 with corrections
* National Bureau of Standards
*
* Section 26.4.4, p941:
*
* For odd v:
*
* Q(chi_sq, v) = 2*Q(chi) + 2*Z(chi) * (
* sum(r=1, r<=(r-1)/2) {(chi_sq^r/chi) / (1*3*5*...(2*r-1)});
*
* chi = sqrt(chi_sq)
*
* NOTE: Q(x) = 1-P(x)
*
* Section 26.4.5, p941.
*
* For even v:
*
* Q(chi_sq, v) = sqrt(2*pi()) * Z(chi) * ( 1 +
* sum(r=1, r=((v-2)/2)) { chi_sq^r / (2*4*...*(2r)) } );
*
* chi = sqrt(chi_sq)
*
* Observe that:
*
* Z(x) = exp(-x*x/2) / sqrt(2*pi()); (Section 26.2.1, p931)
*
* and thus:
*
* sqrt(2*pi()) * Z(chi) =
* sqrt(2*pi()) * Z(sqrt(chi_sq)) =
* sqrt(2*pi()) * exp(-sqrt(chi_sq)*sqrt(chi_sq)/2) / sqrt(2*pi()) =
* exp(-sqrt(chi_sq)*sqrt(chi_sq)/2) =
* exp(-sqrt(-chi_sq/2)
*
* So:
*
* Q(chi_sq, v) = exp(-sqrt(-chi_sq/2) * ( 1 + sum(....){...} );
*/
define chi_prob(chi_sq, v, eps_term)
{
local eps; /* error term */
local r; /* index in finite sum */
local r_lim; /* limit value for r */
local s; /* sum */
local d; /* demoninator (2*4*6*... or 1*3*5...) */
local chi_term; /* chi_sq^r */
local ret; /* return value */
/* obtain the error term */
if (isnull(eps_term)) {
eps = epsilon();
} else {
eps = eps_term;
}
/*
* odd degrees of freedom
*/
if (isodd(v)) {
local chi; /* sqrt(chi_sq) */
/* setup for sum */
s = 1;
d = 1;
chi = sqrt(abs(chi_sq), eps);
chi_term = chi;
r_lim = (v-1)/2;
/* compute sum(r=1, r=((v-1)/2)) {(chi_sq^r/chi) / (1*3*5...*(2r-1))} */
for (r=2; r <= r_lim; ++r) {
chi_term *= chi_sq;
d *= (2*r)-1;
s += chi_term/d;
}
/* apply term and factor, Q(x) = 1-P(x) */
ret = 2*(1-P(chi)) + 2*Z(chi)*s;
/*
* even degrees of freedom
*/
} else {
/* setup for sum */
s =1;
d = 1;
chi_term = 1;
r_lim = (v-2)/2;
/* compute sum(r=1, r=((v-2)/2)) { chi_sq^r / (2*4*...*(2r)) } */
for (r=1; r <= r_lim; ++r) {
chi_term *= chi_sq;
d *= r*2;
s += chi_term/d;
}
/* apply factor - see observation in the main comment above */
ret = exp(-chi_sq/2, eps) * s;
}
return ret;
}

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: deg.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $ * @(#) $Id: deg.cal,v 29.4 2003/01/26 19:32:41 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/deg.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/deg.cal,v $
* *
* Under source code control: 1990/02/15 01:50:33 * Under source code control: 1990/02/15 01:50:33
@@ -42,7 +42,7 @@ define dms(deg, min, sec)
ans.deg = deg; ans.deg = deg;
ans.min = min; ans.min = min;
ans.sec = sec; ans.sec = sec;
fixdms(&ans); fixdms(ans);
return ans; return ans;
} }
@@ -66,7 +66,7 @@ define dms_add(a, b)
ans.sec += b.sec; ans.sec += b.sec;
} else } else
ans.deg += b; ans.deg += b;
fixdms(&ans); fixdms(ans);
return ans; return ans;
} }
@@ -75,9 +75,9 @@ define dms_neg(a)
{ {
local obj dms ans; local obj dms ans;
ans.deg = -ans.deg; ans.deg = -a.deg;
ans.min = -ans.min; ans.min = -a.min;
ans.sec = -ans.sec; ans.sec = -a.sec;
return ans; return ans;
} }
@@ -103,7 +103,7 @@ define dms_mul(a, b)
ans.min = b.min * a; ans.min = b.min * a;
ans.sec = b.sec * a; ans.sec = b.sec * a;
} }
fixdms(&ans); fixdms(ans);
return ans; return ans;
} }

222
cal/intfile.cal Normal file
View File

@@ -0,0 +1,222 @@
/*
* intfile - integer to file and file to integer conversion
*
* Copyright (C) 2001 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.5 $
* @(#) $Id: intfile.cal,v 29.5 2001/04/10 22:09:34 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/intfile.cal,v $
*
* Under source code control: 2001/03/31 08:13:11
* File existed as early as: 2001
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* NOTE: Because leading HALF values are trimmed from integer, a file
* that begins with lots of 0 bits (in the case of big endian)
* or that ends with lots of 0 bits (in the case of little endian)
* will be changed when the subsequent integer is written back.
*/
/*
* file2be - convert a file into an big endian integer
*
* given:
* filename filename to read
*
* returns:
* integer read from its contents on big endian order
*/
define file2be(filename)
{
local fd; /* open file */
local ret; /* integer to return */
local c; /* character read from the file */
local i;
/*
* open the file for reading
*/
fd = fopen(filename, "rb");
if (!isfile(fd)) quit "file2be: cannot open file for reading";
/*
* read the contents of the file
*
* The first octets become the most significant bits of the integer.
*/
ret = 0;
while (! isnull(c = fgetc(fd))) {
ret <<= 8;
ret += ord(c);
}
/*
* cleanup and return the integer
*/
fclose(fd);
return ret;
}
/*
* file2le - convert a file into an little endian integer
*
* given:
* filename filename to read
*
* returns:
* integer read from its contents on little endian order
*/
define file2le(filename)
{
local fd; /* open file */
local ret; /* integer to return */
local c; /* character read from the file */
local shft; /* bit shift for the c value */
local i;
/*
* open the file for reading
*/
fd = fopen(filename, "rb");
if (!isfile(fd)) quit "file2le: cannot open file for reading";
/*
* read the contents of the file into a string
*
* The first octets become are the least significant bits of the integer.
*/
ret = 0;
shft = 0;
while (! isnull(c = fgetc(fd))) {
ret |= (ord(c) << shft);
shft += 8;
}
/*
* cleanup and return the integer
*/
fclose(fd);
return ret;
}
/*
* be2file - convert a big endian integer into a file
*
* given:
* v integer to write to the file
* filename filename to write
*
* returns:
* The number of octets written to the file.
*
* NOTE: The absolute value of the integer is written to the file.
*/
define be2file(v, filename)
{
local fd; /* open file */
local octlen; /* length of v in octets */
local i;
/*
* firewall
*/
if (!isint(v)) {
quit "be2file: 1st arg not an integer";
}
v = abs(v);
/*
* open the file for writing
*/
fd = fopen(filename, "wb");
if (!isfile(fd)) quit "be2file: cannot open file for writing";
/*
* write the octets to the file
*
* The most significant bits of the integer become the first file octets.
*/
octlen = int((highbit(v)+8) / 8);
for (i=octlen-1; i >= 0; --i) {
fputc(fd, char(v >> (i*8)));
}
/*
* cleanup
*/
fclose(fd);
return octlen;
}
/*
* le2file - convert a little endian integer into a file
*
* given:
* v integer to write to the file
* filename filename to write
*
* returns:
* The number of octets written to the file.
*
* NOTE: The absolute value of the integer is written to the file.
*/
define le2file(v, filename)
{
local fd; /* open file */
local cnt; /* octets written */
/*
* firewall
*/
if (!isint(v)) {
quit "be2file: 1st arg not an integer";
}
v = abs(v);
/*
* open the file for writing
*/
fd = fopen(filename, "wb");
if (!isfile(fd)) quit "le2file: cannot open file for writing";
/*
* Write the octets to the file.
*
* The least significant bits of the integer become the first file octets.
*/
cnt = 0;
while (v > 0) {
fputc(fd, char(v));
v >>= 8;
++cnt;
}
/*
* cleanup
*/
fclose(fd);
return cnt;
}

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.6 $
* @(#) $Id: lucas.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $ * @(#) $Id: lucas.cal,v 29.6 2002/07/10 09:43:46 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/lucas.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/lucas.cal,v $
* *
* Under source code control: 1990/05/03 16:49:51 * Under source code control: 1990/05/03 16:49:51
@@ -28,6 +28,16 @@
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/ * Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/ */
/*
* NOTE: This is a standard calc resource file. For information on calc see:
*
* http://www.isthe.com/chongo/tech/comp/calc/index.html
*
* To obtain your own copy of calc, see:
*
* http://www.isthe.com/chongo/tech/comp/calc/calc-download.html
*/
/* /*
* HISTORICAL NOTE: * HISTORICAL NOTE:
* *
@@ -52,12 +62,19 @@
* *
* At the time of discovery, this was the largest known twin prime pair. * At the time of discovery, this was the largest known twin prime pair.
* *
* See:
*
* http://www.isthe.com/chongo/tech/math/prime/amdahl6.html
*
* for more information on the Amdahl 6 group.
*
* NOTE: Both largest known and largest known twin prime records have been * NOTE: Both largest known and largest known twin prime records have been
* broken. Rather than update this file each time, I'll just * broken. Rather than update this file each time, I'll just
* congratulate the finders and encourage others to try for * congratulate the finders and encourage others to try for
* larger finds. Records were made to be broken afterall! * larger finds. Records were made to be broken afterall!
* */
* ON GAINING A WORLD RECORD:
/* ON GAINING A WORLD RECORD:
* *
* The routines in calc were designed to be portable, and to work on * The routines in calc were designed to be portable, and to work on
* numbers of 'sane' size. The Amdahl 6 team used a 'ultra-high speed * numbers of 'sane' size. The Amdahl 6 team used a 'ultra-high speed
@@ -73,7 +90,7 @@
* *
* test numbers of the form h*2^n-1 * test numbers of the form h*2^n-1
* fix a value of n and vary the value h * fix a value of n and vary the value h
* n mod 128 == 0 * n mod 2^x == 0 for some value of x, say > 7 or more
* h*2^n-1 is not divisible by any small prime < 2^40 * h*2^n-1 is not divisible by any small prime < 2^40
* 0 < h < 2^39 * 0 < h < 2^39
* h*2^n+1 is not divisible by any small prime < 2^40 * h*2^n+1 is not divisible by any small prime < 2^40
@@ -1030,7 +1047,7 @@ gen_v1(h, n)
define define
ldebug(funct, str) ldebug(funct, str)
{ {
if (config("resource_debug") & 3) { if (config("resource_debug") & 8) {
print "DEBUG:", funct:":", str; print "DEBUG:", funct:":", str;
} }
return; return;

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: lucas_chk.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $ * @(#) $Id: lucas_chk.cal,v 29.3 2001/03/31 13:31:34 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/lucas_chk.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/lucas_chk.cal,v $
* *
* Under source code control: 1991/01/11 05:41:43 * Under source code control: 1991/01/11 05:41:43
@@ -336,7 +336,7 @@ lucas_chk(high_n, quiet)
/* skip primes where h>=2^n */ /* skip primes where h>=2^n */
if (highbit(h_p[i]) >= n_p[i]) { if (highbit(h_p[i]) >= n_p[i]) {
if (config("resource_debug") & 3) { if (config("resource_debug") & 8) {
print "h>=2^n skip:", h_p[i]:"*2^":n_p[i]:"-1"; print "h>=2^n skip:", h_p[i]:"*2^":n_p[i]:"-1";
} }
continue; continue;

View File

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

View File

@@ -1,24 +1,46 @@
/* /*
* qtime - Display time as English sentence * qtime - Display time as English sentence
* *
* Copyright (C) 1999 Klaus Alexander Seistrup and Landon Curt Noll
*
* Written by: Klaus Alexander Seistrup <kseis@magnetic-ink.dk>
* With mods by: Landon Curt Noll <http://www.isthe.com/chongo/>
*
* 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.4 $
* @(#) $Id: qtime.cal,v 29.4 2000/12/18 10:18:40 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/qtime.cal,v $
*
* Under source code control: 1999/10/13 04:10:33
* File existed as early as: 1999
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* usage: * usage:
* qtime(utc_hr_offset) * qtime(utc_hr_offset)
* *
* utc_hr_offset Offset from UTC in hours. * utc_hr_offset Offset from UTC in hours.
* *
* Written by: Klaus Alexander Seistrup <kseis@magnetic-ink.dk>
* With minor mods by: Landon Curt Noll <http://www.isthe.com/chongo/>
*
* See: * See:
* http://www.magnetic-ink.dk/download/qtime.html * http://www.magnetic-ink.dk/download/qtime.html
* *
* for examples of qtime() written on other languages. * for examples of qtime() written on other languages.
*
* @(#) $Revision: 29.2 $
* @(#) $Id: qtime.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/qtime.cal,v $
*
* This file is not covered under version 2.1 of the GNU LGPL.
*/ */

View File

@@ -1,7 +1,7 @@
/* /*
* regress - calc regression and correctness test suite * regress - calc regression and correctness test suite
* *
* Copyright (C) 1999 David I. Bell * Copyright (C) 1999-2004 David I. Bell and Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.6 $ * @(#) $Revision: 29.19 $
* @(#) $Id: regress.cal,v 29.6 2000/12/17 12:26:42 chongo Exp $ * @(#) $Id: regress.cal,v 29.19 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/regress.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/regress.cal,v $
* *
* Under source code control: 1990/02/15 01:50:36 * Under source code control: 1990/02/15 01:50:36
@@ -52,7 +52,8 @@ errmax(-1),; /* prevent errcount from abouting */
global ecnt; /* expected value of errcount() */ global ecnt; /* expected value of errcount() */
ecnt = 0; /* clear expected errcount() value */ ecnt = 0; /* clear expected errcount() value */
initcfg = config("all", "oldstd"); /* set config to startup default */ initcfg = config("all", "newstd"); /* set config to startup default */
defcfg = config("all"); /* capture the default config */
config("resource_debug", 0),; /* disable resource startup messages */ config("resource_debug", 0),; /* disable resource startup messages */
config("calc_debug", 0),; /* disable internal debugging */ config("calc_debug", 0),; /* disable internal debugging */
config("verbose_quit", 0),; /* disable quit messages */ config("verbose_quit", 0),; /* disable quit messages */
@@ -380,19 +381,19 @@ define test_config()
/* check the set and return of all config */ /* check the set and return of all config */
callcfg = config("all"); callcfg = config("all");
print '501: callcfg = config("all")'; print '501: callcfg = config("all")';
vrfy(callcfg == startcfg, '502: callcfg == startcfg');
callcfg = config("all", "oldstd"); callcfg = config("all", "oldstd");
print '502: callcfg = config("all","oldstd")'; print '503: callcfg = config("all","oldstd")';
oldcfg = config("all", "newstd");
print '503: oldcfg = config("all","newstd")';
vrfy(callcfg == startcfg, '504: callcfg == startcfg'); vrfy(callcfg == startcfg, '504: callcfg == startcfg');
newcfg = config("all"); oldcfg = config("all");
print '505: newcfg = config("all")'; print '505: oldcfg = config("all");';
vrfy(config("all") == newcfg, '506: config("all") == newcfg'); vrfy(config("all") == oldcfg, '506: config("all") == oldcfg');
vrfy(config("all", oldcfg) == newcfg, vrfy(oldcfg==config("all","newstd"),
'507: config("all", oldcfg) == newcfg'); '507: oldcfg==config("all","newstd")');
vrfy(defcfg == config("all"), '508: defcfg == config("all")');
/* vrfy the state of the default config */ /* vrfy the state of the default config */
vrfy(config("all") == oldcfg, '508: config("all") == oldcfg');
vrfy(config("mode") == "real", vrfy(config("mode") == "real",
'509: config("mode") == "real"'); '509: config("mode") == "real"');
vrfy(config("display") == 20, vrfy(config("display") == 20,
@@ -411,10 +412,10 @@ define test_config()
'516: config("pow2") == 40'); '516: config("pow2") == 40');
vrfy(config("redc2") == 50, vrfy(config("redc2") == 50,
'517: config("redc2") == 50'); '517: config("redc2") == 50');
vrfy(config("tilde") == "true", vrfy(config("tilde"),
'518: config("tilde") == "true"'); '518: config("tilde")');
vrfy(config("tab") == "true", vrfy(config("tab"),
'519: config("tab") == "true"'); '519: config("tab")');
vrfy(config("quomod") == 0, vrfy(config("quomod") == 0,
'520: config("quomod") == 0'); '520: config("quomod") == 0');
vrfy(config("quo") == 2, vrfy(config("quo") == 2,
@@ -429,58 +430,59 @@ define test_config()
'525: config("cfappr") == 0'); '525: config("cfappr") == 0');
vrfy(config("cfsim") == 8, vrfy(config("cfsim") == 8,
'526: config("cfsim") == 8'); '526: config("cfsim") == 8');
vrfy(config("outround") == 2, vrfy(config("outround") == 24,
'527: config("outround") == 2'); '527: config("outround") == 24');
vrfy(config("round") == 24, vrfy(config("round") == 24,
'528: config("round") == 24'); '528: config("round") == 24');
vrfy(config("leadzero") == "false", vrfy(config("leadzero") == 1,
'529: config("leadzero") == "false"'); '529: config("leadzero") == 1');
vrfy(config("fullzero") == "false", vrfy(config("fullzero") == 0,
'530: config("fullzero") == "false"'); '530: config("fullzero") == 0');
vrfy(config("maxscan") == 20, vrfy(config("maxscan") == 20,
'531: config("maxscan") == 20'); '531: config("maxscan") == 20');
vrfy(config("prompt") == "> ", vrfy(config("prompt") == "; ",
'532: config("prompt") == "> "'); '532: config("prompt") == "; "');
vrfy(config("more") == ">> ", vrfy(config("more") == ";; ",
'533: config("more") == ">> "'); '533: config("more") == ";; "');
/* convert to "newstd" config by individual changes */ /* convert to "oldstd" config by individual changes */
vrfy(config("display", 10) == 20, print '534: test unused';
'534: config("display") == 20'); vrfy(config("outround", 2) == 24,
vrfy(config("epsilon",1e-10)==1e-20, '535: config("outround", 2) == 24');
'535: config("epsilon",1e-10)==1e-20'); vrfy(config("leadzero","n") == 1,
vrfy(config("quo", 0) == 2, '536: config("quo", 0) == 2'); '536: config("leadzero","n") == 1');
vrfy(config("outround", 24) == 2, print '537: test unused';
'537: config("outround", 24) == 2'); vrfy(config("prompt", "> ") == "; ",
vrfy(config("leadzero","y") == "false", '538: config("prompt", "> ") == "; "');
'538: config("leadzero","y") == "false"'); vrfy(config("more", ">> ") == ";; ",
vrfy(config("fullzero", 1) == "false", '539: config("more", ">> ") == ";; "');
'539: config("fullzero", 1) == "false"'); vrfy(config("all") == oldcfg, '540: config("all") == oldcfg');
vrfy(config("prompt", "; ") == "> ",
'540: config("prompt", "; ") == "> "');
vrfy(config("more", ";; ") == ">> ",
'541: config("more", ";; ") == ">> "');
vrfy(config("all") == newcfg, '542: config("all") == newcfg');
/* check on the new config("fullzero") effect */ /* restore the configation at the start of this function */
vrfy(config("all","oldstd") == newcfg, vrfy(config("all",callcfg) == oldcfg,
'543: config("all",callcfg) == newcfg'); '541: config("all",callcfg) == oldcfg');
/* display and fullzero tests */
vrfy(config("display",2) == 20, vrfy(config("display",2) == 20,
'544: config("display",2) == 20'); '542: config("display",2) == 20');
vrfy(config("fullzero",1) == "false", vrfy(config("leadzero",0) == 1,
'545: config("fullzero",1) == "false"'); '543: config("leadzero",0) == 1');
vrfy(config("fullzero",1) == 0,
'544: config("fullzero",1) == 0');
vrfy(strprintf("%d %d %d", 0, 1, 2) == ".00 1.00 2.00", vrfy(strprintf("%d %d %d", 0, 1, 2) == ".00 1.00 2.00",
'546: strprintf("%d %d %d", 0, 1, 2) == ".00 1.00 2.00"'); '545: strprintf("%d %d %d", 0, 1, 2) == ".00 1.00 2.00"');
vrfy(config("display",20) == 2, vrfy(config("display",20) == 2,
'547: config("display",20) == 2'); '546: config("display",20) == 2');
vrfy(config("fullzero",0) == "true", vrfy(config("leadzero",1) == 0,
'548: config("fullzero",0) == "true"'); '547: config("leadzero",1) == 0');
vrfy(config("fullzero",0) == 1,
'548: config("fullzero",0) == 1');
vrfy(strprintf("%d %d %d", 0, 1, 2) == "0 1 2", vrfy(strprintf("%d %d %d", 0, 1, 2) == "0 1 2",
'549: strprintf("%d %d %d", 0, 1, 2) == "0 1 2"'); '549: strprintf("%d %d %d", 0, 1, 2) == "0 1 2"');
/* restore calling config */ /* restore calling config */
vrfy(config("all",callcfg) == oldcfg, vrfy(config("all",callcfg) == startcfg,
'550: config("all",callcfg) == oldcfg'); '550: config("all",callcfg) == startcfg');
vrfy(config("all") == callcfg, '551: config("all") == callcfg'); vrfy(config("all") == callcfg, '551: config("all") == callcfg');
vrfy(config("all") == startcfg, '552: config("all") == startcfg'); vrfy(config("all") == startcfg, '552: config("all") == startcfg');
@@ -492,7 +494,11 @@ define test_config()
vrfy(strlen(config("version")) > 0, vrfy(strlen(config("version")) > 0,
'555: strlen(config("version")) > 0'); '555: strlen(config("version")) > 0');
print '556: Ending test_config'; /* mode2 is off by default */
vrfy(config("mode2") == "off",
'556: config("mode2") == "off"');
print '557: Ending test_config';
} }
print '010: parsed test_config()'; print '010: parsed test_config()';
@@ -755,7 +761,7 @@ define test_functions()
vrfy(den(17) == 1, '712: den(17) == 1'); vrfy(den(17) == 1, '712: den(17) == 1');
vrfy(den(3/7) == 7, '713: den(3/7) == 7'); vrfy(den(3/7) == 7, '713: den(3/7) == 7');
vrfy(den(-2/3) == 3, '714: den(-2/3) == 3'); vrfy(den(-2/3) == 3, '714: den(-2/3) == 3');
vrfy(digits(0) == 0, '715: digits(0) == 0'); vrfy(digits(0) == 1, '715: digits(0) == 1');
vrfy(digits(9) == 1, '716: digits(9) == 1'); vrfy(digits(9) == 1, '716: digits(9) == 1');
vrfy(digits(10) == 2, '717: digits(10) == 2'); vrfy(digits(10) == 2, '717: digits(10) == 2');
vrfy(digits(-691) == 3, '718: digits(-691) == 3'); vrfy(digits(-691) == 3, '718: digits(-691) == 3');
@@ -996,8 +1002,13 @@ define test_functions()
vrfy(strpos(a, "abc") == 1, '946: strpos(a, "abc") == 1'); vrfy(strpos(a, "abc") == 1, '946: strpos(a, "abc") == 1');
vrfy(strpos(a, "xyz") == 0, '947: strpos(a, "xyz") == 0'); vrfy(strpos(a, "xyz") == 0, '947: strpos(a, "xyz") == 0');
vrfy(strpos(a, a) == 1, '948: strpos(a, a) == 1'); vrfy(strpos(a, a) == 1, '948: strpos(a, a) == 1');
vrfy(system("") == 0, '949: system("") == 0'); if (config("windows") || config("cygwin")) {
vrfy(system("true") == 0, '950: system("true") == 0'); print '949: test skipped for windows or cygwin systems';
print '950: test skipped for windows or cygwin systems';
} else {
vrfy(system("") == 0, '949: system("") == 0');
vrfy(system("true") == 0, '950: system("true") == 0');
}
print '951: test disabled due to stdin dependency'; print '951: test disabled due to stdin dependency';
print '952: test removed'; print '952: test removed';
print '953: test removed'; print '953: test removed';
@@ -1029,8 +1040,8 @@ define test_functions()
vrfy(digit(a,-1) == 4, '974: digit(a,-1) == 4'); vrfy(digit(a,-1) == 4, '974: digit(a,-1) == 4');
vrfy(digit(a,-2) == 2, '975: digit(a,-2) == 2'); vrfy(digit(a,-2) == 2, '975: digit(a,-2) == 2');
vrfy(digit(a,-3) == 8, '976: digit(a,-3) == 8'); vrfy(digit(a,-3) == 8, '976: digit(a,-3) == 8');
vrfy(digits(0) == 0, '977: digits(0) == 0'); vrfy(digits(0) == 1, '977: digits(0) == 1');
vrfy(digits(0.0123) == 0, '978: digits(0.0123) == 0'); vrfy(digits(0.0123) == 1, '978: digits(0.0123) == 1');
vrfy(digits(3.7) == 1, '979: digits(3.7) == 1'); vrfy(digits(3.7) == 1, '979: digits(3.7) == 1');
vrfy(digits(-27) == 2, '980: digits(-27) == 2'); vrfy(digits(-27) == 2, '980: digits(-27) == 2');
vrfy(digits(-99.7) == 2, '981: digits(-99.7) == 2'); vrfy(digits(-99.7) == 2, '981: digits(-99.7) == 2');
@@ -1562,31 +1573,31 @@ define test_rand()
/* test the additive 55 shuffle generator */ /* test the additive 55 shuffle generator */
tmp = srand(0); tmp = srand(0);
print '1505: tmp = srand(0)'; print '1505: tmp = srand(0)';
vrfy(rand() == 0xc79ef743e2e6849c, \ vrfy(rand() == 0x1fe5b46fba7e069d, \
'1506: rand() == 0xc79ef743e2e6849c'); '1506: rand() == 0x1fe5b46fba7e069d');
vrfy(rand() == 0x8d2dcb2bed321284, \ vrfy(rand() == 0x308d32d9bdf2dc6f, \
'1507: rand() == 0x8d2dcb2bed321284'); '1507: rand() == 0x308d32d9bdf2dc6f');
tmp = srand(init); tmp = srand(init);
print '1508: tmp = srand(init)'; print '1508: tmp = srand(init)';
vrfy(rand() == 0xc79ef743e2e6849c, \ vrfy(rand() == 0x1fe5b46fba7e069d, \
'1509: rand() == 0xc79ef743e2e6849c'); '1509: rand() == 0x1fe5b46fba7e069d');
vrfy(rand() == 0x8d2dcb2bed321284, \ vrfy(rand() == 0x308d32d9bdf2dc6f, \
'1510: rand() == 0x8d2dcb2bed321284'); '1510: rand() == 0x308d32d9bdf2dc6f');
/* test range interface */ /* test range interface */
tmp = srand(0); tmp = srand(0);
print '1511: tmp = srand(0)'; print '1511: tmp = srand(0)';
vrfy(rand(12345678901234567890) == 0x8d2dcb2bed321284, \ vrfy(rand(12345678901234567890) == 0x1fe5b46fba7e069d, \
'1512: rand(12345678901234567890) == 0x8d2dcb2bed321284'); '1512: rand(12345678901234567890) == 0x1fe5b46fba7e069d');
vrfy(rand(216091) == 0x13d2b, '1513: rand(216091) == 0x13d2b'); vrfy(rand(216091) == 0xc234, '1513: rand(216091) == 0xc234');
vrfy(rand(100) == 0x26, '1514: rand(100) == 0x26'); vrfy(rand(100) == 0x59, '1514: rand(100) == 0x59');
vrfy(rand(-46,46) == -0xf, '1515: rand(-46,46) == -0xf'); vrfy(rand(-46,46) == 0x2d, '1515: rand(-46,46) == 0x2d');
tmp = srand(0); tmp = srand(0);
print '1516: tmp = srand(0)'; print '1516: tmp = srand(0)';
vrfy(rand(2^64) == 0xc79ef743e2e6849c, \ vrfy(rand(2^64) == 0x1fe5b46fba7e069d, \
'1517: rand(2^64) == 0xc79ef743e2e6849c'); '1517: rand(2^64) == 0x1fe5b46fba7e069d');
vrfy(rand(0,2^64) == 0x8d2dcb2bed321284, \ vrfy(rand(0,2^64) == 0x308d32d9bdf2dc6f, \
'1518: rand(0,2^64) == 0x8d2dcb2bed321284'); '1518: rand(0,2^64) == 0x308d32d9bdf2dc6f');
/* test different forms of seeding the initial state */ /* test different forms of seeding the initial state */
tmp = srand(0); tmp = srand(0);
@@ -1594,7 +1605,7 @@ define test_rand()
vrfy(srand() == init, '1520: srand() == init'); vrfy(srand() == init, '1520: srand() == init');
tmp = srand(0x87e6ec938ff55aa5<<64); tmp = srand(0x87e6ec938ff55aa5<<64);
print '1521: tmp = srand(0x87e6ec938ff55aa5<<64)'; print '1521: tmp = srand(0x87e6ec938ff55aa5<<64)';
vrfy(srand() == init, '1522: srand() == init'); print '1522: test disabled';
tmp = srand(state0); tmp = srand(state0);
print '1523: tmp = srand(state0)'; print '1523: tmp = srand(state0)';
vrfy(srand() == init, '1524: srand() == init'); vrfy(srand() == init, '1524: srand() == init');
@@ -1606,35 +1617,35 @@ define test_rand()
/* test the bit length interface */ /* test the bit length interface */
tmp = srand(0); tmp = srand(0);
print '1528: tmp = srand(0)'; print '1528: tmp = srand(0)';
vrfy(randbit(64) == 0xc79ef743e2e6849c, \ vrfy(randbit(64) == 0x1fe5b46fba7e069d, \
'1529: randbit(64) == 0xc79ef743e2e6849c'); '1529: randbit(64) == 0x1fe5b46fba7e069d');
vrfy(randbit(128) == 0x8d2dcb2bed3212844f4ad31f3818af34, \ vrfy(randbit(128) == 0x308d32d9bdf2dc6f45d3e3b3361b79e4, \
'1530: randbit(128) == 0x8d2dcb2bed3212844f4ad31f3818af34'); '1530: randbit(128) == 0x308d32d9bdf2dc6f45d3e3b3361b79e4');
vrfy(randbit(64) == 0x23a252f60bae4907, \ vrfy(randbit(64) == 0xd4ef1e3336022d81, \
'1531: randbit(64) == 0x23a252f60bae4907'); '1531: randbit(64) == 0xd4ef1e3336022d81');
vrfy(randbit(128) == 0xa8ed5b6203e2b1da32848cd9b3f1e3fa, \ vrfy(randbit(128) == 0x66b086e6c34e42124a1fc5d4e5c6f598, \
'1532: randbit(128) == 0xa8ed5b6203e2b1da32848cd9b3f1e3fa'); '1532: randbit(128) == 0x66b086e6c34e42124a1fc5d4e5c6f598');
tmp = srand(0); tmp = srand(0);
print '1533: tmp = srand(0)'; print '1533: tmp = srand(0)';
vrfy(randbit(32) == 0xc79ef743, '1534: randbit(32) == 0xc79ef743'); vrfy(randbit(32) == 0x1fe5b46f, '1534: randbit(32) == 0x1fe5b46f');
vrfy(randbit(32) == 0xe2e6849c, '1535: randbit(32) == 0xe2e6849c'); vrfy(randbit(32) == 0xba7e069d, '1535: randbit(32) == 0xba7e069d');
vrfy(randbit(1) == 0x1, '1536: randbit(1) == 0x1'); vrfy(randbit(1) == 0x0, '1536: randbit(1) == 0x0');
vrfy(randbit(5) == 0x3, '1537: randbit(5) == 0x3'); vrfy(randbit(5) == 0xc, '1537: randbit(5) == 0xc');
vrfy(randbit(33) == 0x96e595f6, '1538: randbit(33) == 0x96e595f6'); vrfy(randbit(33) == 0x46996cde, '1538: randbit(33) == 0x46996cde');
vrfy(randbit(25) == 0x1321284, '1539: randbit(25) == 0x1321284'); vrfy(randbit(25) == 0x1f2dc6f, '1539: randbit(25) == 0x1f2dc6f');
vrfy(randbit(2) == 0x1, '1540: randbit(2) == 0x1'); vrfy(randbit(2) == 0x1, '1540: randbit(2) == 0x1');
vrfy(randbit(13) == 0x7a5, '1541: randbit(13) == 0x7a5'); vrfy(randbit(13) == 0x2e9, '1541: randbit(13) == 0x2e9');
vrfy(randbit(18) == 0x1a63e, '1542: randbit(18) == 0x1a63e'); vrfy(randbit(18) == 0x3c766, '1542: randbit(18) == 0x3c766');
vrfy(randbit(8) == 0x70, '1543: randbit(8) == 0x70'); vrfy(randbit(8) == 0x6c, '1543: randbit(8) == 0x6c');
vrfy(randbit(9) == 0x62, '1544: randbit(9) == 0x62'); vrfy(randbit(9) == 0x6d, '1544: randbit(9) == 0x6d');
vrfy(randbit(70) == 0x2f3423a252f60bae49, \ vrfy(randbit(70) == 0x39e4d4ef1e3336022d, \
'1545: randbit(70) == 0x2f3423a252f60bae49'); '1545: randbit(70) == 0x39e4d4ef1e3336022d');
print '1546: test unused'; print '1546: test unused';
vrfy(randbit(8) == 0x7, '1547: randbit(8) == 0x7'); vrfy(randbit(8) == 0x81, '1547: randbit(8) == 0x81');
vrfy(randbit(65) == 0x151dab6c407c563b4, \ vrfy(randbit(65) == 0xcd610dcd869c8424, \
'1548: randbit(65) == 0x151dab6c407c563b4'); '1548: randbit(65) == 0xcd610dcd869c8424');
vrfy(randbit(63) == 0x32848cd9b3f1e3fa, \ vrfy(randbit(63) == 0x4a1fc5d4e5c6f598, \
'1549: randbit(63) == 0x32848cd9b3f1e3fa'); '1549: randbit(63) == 0x4a1fc5d4e5c6f598');
/* check to be sure that the srand(1) bug was fixed */ /* check to be sure that the srand(1) bug was fixed */
tmp = srand(1); tmp = srand(1);
@@ -1643,36 +1654,36 @@ define test_rand()
print '1551: n = 1'; print '1551: n = 1';
vrfy(num(n), '1552: num(n)'); vrfy(num(n), '1552: num(n)');
vrfy(den(n), '1553: den(n)'); vrfy(den(n), '1553: den(n)');
vrfy(randbit(64) == 0x4280429f8069cb27, \ vrfy(randbit(64) == 0xbf989a4c504a541d, \
'1554: randbit(64) == 0x4280429f8069cb27'); '1554: randbit(64) == 0xbf989a4c504a541d');
/* test randbit skip interface */ /* test randbit skip interface */
tmp = srand(0); tmp = srand(0);
print '1555: tmp = srand(0)'; print '1555: tmp = srand(0)';
vrfy(randbit(20) == 817647, '1556: randbit(20) == 817647'); vrfy(randbit(20) == 0x1fe5b, '1556: randbit(20) == 0x1fe5b');
vrfy(randbit(20) == 476130, '1557: randbit(20) == 476130'); vrfy(randbit(20) == 0x46fba, '1557: randbit(20) == 0x46fba');
vrfy(randbit(20) == 944201, '1558: randbit(20) == 944201'); vrfy(randbit(20) == 0x7e069, '1558: randbit(20) == 0x7e069');
vrfy(randbit(20) == 822573, '1559: randbit(20) == 822573'); vrfy(randbit(20) == 0xd308d, '1559: randbit(20) == 0xd308d');
tmp = srand(0); tmp = srand(0);
print '1560: tmp = srand(0)'; print '1560: tmp = srand(0)';
vrfy(randbit(-20) == 20, '1561: randbit(-20) == 20'); vrfy(randbit(-20) == 20, '1561: randbit(-20) == 20');
vrfy(randbit(20) == 476130, '1562: randbit(20) == 476130'); vrfy(randbit(20) == 290746, '1562: randbit(20) == 290746');
vrfy(randbit(-20) == 20, '1563: randbit(-20) == 20'); vrfy(randbit(-20) == 20, '1563: randbit(-20) == 20');
vrfy(randbit(20) == 822573, '1564: randbit(20) == 822573'); vrfy(randbit(20) == 864397, '1564: randbit(20) == 864397');
/* test randbit without and arg */ /* test randbit without and arg */
tmp = srand(0); tmp = srand(0);
print '1565: tmp = srand(0)'; print '1565: tmp = srand(0)';
vrfy(randbit() == 1, '1566: randbit() == 1'); vrfy(randbit() == 0, '1566: randbit() == 0');
vrfy(randbit() == 1, '1567: randbit() == 1'); vrfy(randbit() == 0, '1567: randbit() == 0');
vrfy(randbit() == 0, '1568: randbit() == 0'); vrfy(randbit() == 0, '1568: randbit() == 0');
vrfy(randbit() == 1, '1569: randbit() == 1');
/* test seed() as best as we can */ /* test seed() as best as we can */
vrfy(seed() >= 0, '1569: seed() >= 0'); vrfy(seed() >= 0, '1570: seed() >= 0');
vrfy(seed() < 2^64, '1570: seed() < 2^64'); vrfy(seed() < 2^64, '1571: seed() < 2^64');
vrfy(isrand(srand(seed())), '1571: isrand(srand(seed()))'); vrfy(isrand(srand(seed())), '1572: isrand(srand(seed()))');
print '1572: Ending rand test'; print '1573: Ending rand test';
} }
print '025: parsed test_rand()'; print '025: parsed test_rand()';
@@ -1788,7 +1799,23 @@ define test_mode()
vrfy(str(3e9) == "3000000000", \ vrfy(str(3e9) == "3000000000", \
'1650: str(3e9) == \"3000000000\"'); '1650: str(3e9) == \"3000000000\"');
print '1651: Ending mode/base test'; /* test base2() functionality */
vrfy(base2() == 0, '1651: base2() == 0');
vrfy(base2(0) == 0, '1652: base2(0) == 0');
vrfy(base2() == 0, '1653: base2() == 0');
vrfy(base2(16) == 0, '1654: base2(16) == 0');
vrfy(base2() == 16, '1655: base2() == 16');
vrfy(str(3e9) == "3000000000 /* 0xb2d05e00 */",
'1656: str(3e9) == "3000000000 /* 0xb2d05e00 */"');
vrfy(base2(1/3) == 16, '1657: base2(16) == 16');
vrfy(str(23209) == "23209 /* 23209 */",
'1658: str(23209) == "23209 /* 23209 */"');
vrfy(str(3/2) == "1.5 /* 3/2 */",
'1659: str(3/2) == "1.5 /* 3/2 */"');
vrfy(base() == 10, '1660: base() == 10');
vrfy(base2(0) == 1/3, '1661: base2(0) == 1/3');
print '1662: Ending mode/base test';
} }
print '026: parsed test_mode()'; print '026: parsed test_mode()';
@@ -2183,6 +2210,7 @@ print '033: read -once test2300';
define test_xx_incdec() define test_xx_incdec()
{ {
local A, B; local A, B;
local n;
print '2300: Beginning object increment/decrement test'; print '2300: Beginning object increment/decrement test';
@@ -2215,6 +2243,20 @@ define test_xx_incdec()
vrfy(ckmat(B,1,2,3) == 1, vrfy(ckmat(B,1,2,3) == 1,
'2314: ckmat(B,1,2,3) == 1'); '2314: ckmat(B,1,2,3) == 1');
n = 1;
print '2315: n = 1';
vrfy(n + n + n + n++ == 4,
'2316: n + n + n + n++ == 4');
vrfy(n == 2, '2317: n == 2');
n = 1;
print '2318: n = 1';
vrfy(n + n + n++ == 3, '2319: n + n + n++ == 3');
vrfy(n == 2, '2320: n == 2');
n = 1;
print '2321: n = 1';
vrfy(n + n++ == 2, '2322: n + n++ == 3');
vrfy(n == 2, '2323: n == 2');
print '2315: Ending object increment/decrement test'; print '2315: Ending object increment/decrement test';
} }
print '034: parsed test_xx_incdec()'; print '034: parsed test_xx_incdec()';
@@ -4542,7 +4584,14 @@ define test_random()
vrfy(seed() < 2^64, '5465: seed() < 2^64'); vrfy(seed() < 2^64, '5465: seed() < 2^64');
vrfy(israndom(srandom(seed())), '5466: israndom(srandom(seed()))'); vrfy(israndom(srandom(seed())), '5466: israndom(srandom(seed()))');
print '5467: Ending test_random'; /* verify random(10,11) double bug fix */
vrfy(random(10,11) == 10, '5467: random(10,11) == 10');
vrfy(random(10,11) == 10, '5468: random(10,11) == 10');
vrfy(random(10,11) == 10, '5469: random(10,11) == 10');
vrfy(random(0,1) == 0, '5470: random(0,1) == 0');
vrfy(random(0,1) == 0, '5471: random(0,1) == 0');
print '5472: Ending test_random';
} }
print '137: parsed test_random()'; print '137: parsed test_random()';
@@ -5112,10 +5161,17 @@ define test_is()
*/ */
a = assoc(); a = assoc();
print '5901: a = assoc()'; print '5901: a = assoc()';
ofd = fopen("/dev/null", "r"); if (config("windows")) {
print '5902: ofd = fopen("/dev/null", "r")'; ofd = fopen("NUL:", "rb");
cfd = fopen("/dev/null", "r"); print '5902: ofd = fopen("NUL:", "rb")';
print '5903: cfd = fopen("/dev/null", "r")'; cfd = fopen("NUL:", "rb");
print '5903: cfd = fopen("NUL:", "rb")';
} else {
ofd = fopen("/dev/null","rb");
print '5902: ofd = fopen("/dev/null","rb")';
cfd = fopen("/dev/null","rb");
print '5903: cfd = fopen("/dev/null","rb")';
}
fclose(cfd); fclose(cfd);
print '5904: fclose(cfd)'; print '5904: fclose(cfd)';
blk = blk(); blk = blk();
@@ -6293,8 +6349,8 @@ define test_blkcpy()
/* blkcpy the last 5 octets of B1 to a new block C */ /* blkcpy the last 5 octets of B1 to a new block C */
blkcpy(C = blk(), B1, 5, ,100); blkcpy(C = blk(), B1,5,,100);
print '6821: blkcpy(C = blk(), B1, 5, ,100);'; print '6821: blkcpy(C = blk(), B1,5,,100);';
vrfy(C == A, '6822: C == A'); vrfy(C == A, '6822: C == A');
/* blkcpy to and from a file */ /* blkcpy to and from a file */
@@ -6310,8 +6366,8 @@ define test_blkcpy()
blkcpy(fs, A, ,100); blkcpy(fs, A, ,100);
print '6828: blkcpy(fs, A, ,100);'; print '6828: blkcpy(fs, A, ,100);';
vrfy(size(fs) == 105, '6829: size(f) == 105'); vrfy(size(fs) == 105, '6829: size(f) == 105');
blkcpy(C = blk(), fs, 2, ,100); blkcpy(C = blk(), fs,2,,100);
print '6830: blkcpy(C = blk(), fs, 2, ,100)'; print '6830: blkcpy(C = blk(), fs,2,,100)';
vrfy(C == (blk() = {1,2}), '6831: C == (blk() = {1,2}'); vrfy(C == (blk() = {1,2}), '6831: C == (blk() = {1,2}');
/* blkcpy string to a block */ /* blkcpy string to a block */
@@ -7593,7 +7649,9 @@ vrfy(j8300(10) == 11, '8307: j8300(10) == 11');
{static k8300 = 5} define l8300(x) = k8300 + x; {static k8300 = 5} define l8300(x) = k8300 + x;
print '8308: {static k8300 = 5} define l8300(x) = k8300 + x;'; print '8308: {static k8300 = 5} define l8300(x) = k8300 + x;';
vrfy(l8300(10) == 15, '8309: l8300(10) == 15'); vrfy(l8300(10) == 15, '8309: l8300(10) == 15');
print '8310: Ending define tests'; static a8300 = 1, b8300;
vrfy(a8300 == 1, '8310: a8300 == 1');
print '8311: Ending define tests';
/* /*

53
cal/repeat.cal Normal file
View File

@@ -0,0 +1,53 @@
/*
* repeat - return the value of a repeated set of digits
*
* Copyright (C) 2003 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.4 $
* @(#) $Id: repeat.cal,v 29.4 2003/01/26 19:42:03 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/repeat.cal,v $
*
* Under source code control: 2003/01/05 00:00:01
* File existed as early as: 2003
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* repeat - return the value of a repeated set of digits
*
* usage:
* repeat(digit_set, repeat_count)
*/
define repeat(digit_set, repeat_count)
{
local digit_count; /* digits in the digit_set */
/* firewall */
if (!isint(digit_set) || digit_set <= 0) {
quit "digit set must be an integer > 0";
}
if (!isint(repeat_count) || repeat_count <= 0) {
quit "repeat count must be an integer > 0";
}
/* return repeated set of digits */
digit_count = digits(digit_set);
return digit_set * (10^(digit_count*repeat_count)-1) / (10^digit_count-1);
}

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: seedrandom.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $ * @(#) $Id: seedrandom.cal,v 29.3 2001/03/31 13:31:34 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/seedrandom.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/seedrandom.cal,v $
* *
* Under source code control: 1996/01/01 08:21:00 * Under source code control: 1996/01/01 08:21:00
@@ -115,7 +115,7 @@ define seedrandom(seed1, seed2, size, trials)
p = 2*fp+1; p = 2*fp+1;
} while (ptest(p,1,0) == 0); } while (ptest(p,1,0) == 0);
} while(ptest(p, trials) == 0 || ptest(fp, trials) == 0); } while(ptest(p, trials) == 0 || ptest(fp, trials) == 0);
if (config("resource_debug") & 3) { if (config("resource_debug") & 8) {
print "/* 1st Blum prime */ p=", p; print "/* 1st Blum prime */ p=", p;
} }
@@ -129,7 +129,7 @@ define seedrandom(seed1, seed2, size, trials)
q = 2*fq+1; q = 2*fq+1;
} while (ptest(q,1,0) == 0); } while (ptest(q,1,0) == 0);
} while(ptest(q, trials) == 0 || ptest(fq, trials) == 0); } while(ptest(q, trials) == 0 || ptest(fq, trials) == 0);
if (config("resource_debug") & 3) { if (config("resource_debug") & 8) {
print "/* 2nd Blum prime */ q=", q; print "/* 2nd Blum prime */ q=", q;
} }
@@ -139,7 +139,7 @@ define seedrandom(seed1, seed2, size, trials)
n = p*q; /* the Blum modulus */ n = p*q; /* the Blum modulus */
binsize = highbit(n)+1; /* smallest power of 2 > p*q */ binsize = highbit(n)+1; /* smallest power of 2 > p*q */
r = pmod(rand(1<<ceil(binsize*4/5), 1<<(binsize-2)), 2, n); r = pmod(rand(1<<ceil(binsize*4/5), 1<<(binsize-2)), 2, n);
if (config("resource_debug") & 3) { if (config("resource_debug") & 8) {
print "/* seed quadratic residue */ r=", r; print "/* seed quadratic residue */ r=", r;
print "/* newn", binsize, "bit quadratic residue*/ newn=", n; print "/* newn", binsize, "bit quadratic residue*/ newn=", n;
} }

View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: test4600.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $ * @(#) $Id: test4600.cal,v 29.4 2001/04/10 22:09:02 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test4600.cal,v $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test4600.cal,v $
* *
* Under source code control: 1996/07/02 20:04:40 * Under source code control: 1996/07/02 20:04:40
@@ -53,10 +53,10 @@ define stest(str, verbose)
/* /*
* do file operations * do file operations
*/ */
f = fopen("junk4600", "w"); f = fopen("junk4600", "wb");
if (iserror(f)) { if (iserror(f)) {
print 'failed'; print 'failed';
print '**** fopen("junk4600", "w") failed'; print '**** fopen("junk4600", "wb") failed';
return 1; return 1;
} }
if (iserror(fputs(f, if (iserror(fputs(f,
@@ -67,9 +67,9 @@ define stest(str, verbose)
print '**** fputs(f, "Fourscore ... failed'; print '**** fputs(f, "Fourscore ... failed';
return 1; return 1;
} }
if (iserror(freopen(f, "r"))) { if (iserror(freopen(f, "rb"))) {
print 'failed'; print 'failed';
print '**** iserror(freopen(f, "r")) failed'; print '**** iserror(freopen(f, "rb")) failed';
return 1; return 1;
} }
if (iserror(rewind(f))) { if (iserror(rewind(f))) {
@@ -173,7 +173,7 @@ define ttest(str, m, n, verbose)
print str:":",:; print str:":",:;
} }
i = rm("-f", "junk4600"); i = rm("-f", "junk4600");
f = fopen("junk4600", "w"); f = fopen("junk4600", "wb");
if (isnull(n)) if (isnull(n))
n = 4; n = 4;
@@ -198,7 +198,7 @@ define ttest(str, m, n, verbose)
fflush(f); fflush(f);
if (verbose > 1) if (verbose > 1)
printf("File has size %d\n", pos[i]); printf("File has size %d\n", pos[i]);
freopen(f, "r"); freopen(f, "rb");
if (size(f) != pos[i]) { if (size(f) != pos[i]) {
print 'failed'; print 'failed';
printf("**** Failure 1 for file size\n"); printf("**** Failure 1 for file size\n");

58
calc.c
View File

@@ -1,7 +1,7 @@
/* /*
* calc - arbitrary precision calculator * calc - arbitrary precision calculator
* *
* Copyright (C) 1999 David I. Bell, Landon Curt Noll and Ernest Bowen * Copyright (C) 1999-2004 David I. Bell, Landon Curt Noll and Ernest Bowen
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.5 $ * @(#) $Revision: 29.11 $
* @(#) $Id: calc.c,v 29.5 2000/07/17 15:35:49 chongo Exp $ * @(#) $Id: calc.c,v 29.11 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.c,v $
* *
* Under source code control: 1990/02/15 01:48:11 * Under source code control: 1990/02/15 01:48:11
@@ -32,10 +32,27 @@
#include <stdio.h> #include <stdio.h>
#include <signal.h> #include <signal.h>
#include <pwd.h>
#if !defined (_WIN32)
# include <pwd.h>
#endif
#include <sys/types.h> #include <sys/types.h>
#include <ctype.h> #include <ctype.h>
#if defined(_WIN32)
# include <io.h>
/*
* getopt.h file is from the Cygwin GNU library
*
* See:
* http://sources.redhat.com/cygwin/
*/
# include "../getopt/getopt.h"
# define strdup _strdup
# define isatty _isatty
#endif /* Windoz */
#define CALC_C #define CALC_C
#include "calc.h" #include "calc.h"
#include "hist.h" #include "hist.h"
@@ -49,6 +66,7 @@
#include "custom.h" #include "custom.h"
#include "math_error.h" #include "math_error.h"
#include "args.h" #include "args.h"
#include "zmath.h"
#include "have_unistd.h" #include "have_unistd.h"
#if defined(HAVE_UNISTD_H) #if defined(HAVE_UNISTD_H)
@@ -65,6 +83,8 @@
# define strdup(x) calc_strdup((CONST char *)(x)) # define strdup(x) calc_strdup((CONST char *)(x))
#endif /* HAVE_STRDUP */ #endif /* HAVE_STRDUP */
#include "have_unused.h"
/* /*
* static definitions and functions * static definitions and functions
@@ -196,7 +216,13 @@ main(int argc, char **argv)
havearg = TRUE; havearg = TRUE;
break; break;
case 'n': case 'n':
new_std = TRUE; /*
* -n is deprecated and may be reused
* for another purpose in the future
*/
break;
case 'O':
use_old_std = TRUE;
break; break;
case 'p': case 'p':
p_flag = TRUE; p_flag = TRUE;
@@ -407,7 +433,7 @@ main(int argc, char **argv)
fprintf(stderr, fprintf(stderr,
"usage: %s [-a] [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]\n" "usage: %s [-a] [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]\n"
"\t[-D calc_debug[:resource_debug[:user_debug]]]\n" "\t[-D calc_debug[:resource_debug[:user_debug]]]\n"
"\t[-n] [-p] [-q] [-u] [-v] " "\t[-O] [-p] [-q] [-u] [-v] "
"[--] [calc_cmd ...]\n", "[--] [calc_cmd ...]\n",
program); program);
exit(1); exit(1);
@@ -607,9 +633,18 @@ main(int argc, char **argv)
if (!p_flag && i_flag && !stdin_tty) { if (!p_flag && i_flag && !stdin_tty) {
closeinput(); closeinput();
if(!freopen("/dev/tty", "r", stdin)) { if(!freopen("/dev/tty", "r", stdin)) {
#if defined (_WIN32)
fprintf(stderr,
"/dev/tty does not exist on "
"this operating system. "
"Change operating systems\n"
"or don't use this calc mode "
"in the future, sorry!\n");
#else /* Windoz free systems */
fprintf(stderr, fprintf(stderr,
"Unable to associate stdin" "Unable to associate stdin"
" with /dev/tty"); " with /dev/tty");
#endif /* Windoz free systems */
set_run_state(RUN_EXIT_WITH_ERROR); set_run_state(RUN_EXIT_WITH_ERROR);
break; break;
} }
@@ -628,9 +663,18 @@ main(int argc, char **argv)
!p_flag && (!havecommands||i_flag)) { !p_flag && (!havecommands||i_flag)) {
closeinput(); closeinput();
if(!freopen("/dev/tty", "r", stdin)) { if(!freopen("/dev/tty", "r", stdin)) {
#if defined (_WIN32)
fprintf(stderr,
"/dev/tty does not exist on "
"this operating system. "
"Change operating systems\n"
"or don't use this calc mode "
"in the future, sorry!\n");
#else /* Windoz free systems */
fprintf(stderr, fprintf(stderr,
"Unable to associate stdin" "Unable to associate stdin"
" with /dev/tty"); " with /dev/tty");
#endif /* Windoz free systems */
set_run_state(RUN_EXIT_WITH_ERROR); set_run_state(RUN_EXIT_WITH_ERROR);
break; break;
} }
@@ -664,7 +708,7 @@ main(int argc, char **argv)
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
static void static void
intint(int arg) intint(int UNUSED arg)
{ {
(void) signal(SIGINT, intint); (void) signal(SIGINT, intint);
if (inputwait || (++abortlevel >= ABORT_NOW)) { if (inputwait || (++abortlevel >= ABORT_NOW)) {

245
calc.h
View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.5 $ * @(#) $Revision: 29.11 $
* @(#) $Id: calc.h,v 29.5 2000/12/04 19:32:33 chongo Exp $ * @(#) $Id: calc.h,v 29.11 2003/08/26 04:36:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.h,v $
* *
* Under source code control: 1990/02/15 01:48:31 * Under source code control: 1990/02/15 01:48:31
@@ -32,10 +32,15 @@
#define __CALC_H__ #define __CALC_H__
#include <setjmp.h> #include <setjmp.h>
#if defined(CALC_SRC) /* if we are building from the calc source tree */
#include "value.h" # include "win32dll.h"
# include "value.h"
#include "have_const.h" # include "have_const.h"
#else
# include <calc/win32dll.h>
# include <calc/value.h>
# include <calc/have_const.h>
#endif
/* /*
@@ -55,7 +60,11 @@
#define HOMECHAR '~' /* char which indicates home directory */ #define HOMECHAR '~' /* char which indicates home directory */
#define DOTCHAR '.' /* char which indicates current directory */ #define DOTCHAR '.' /* char which indicates current directory */
#define PATHCHAR '/' /* char which separates path components */ #define PATHCHAR '/' /* char which separates path components */
#if defined(__MSDOS__) || defined(__WIN32)
#define LISTCHAR ';' /* char which separates paths in a list */
#else
#define LISTCHAR ':' /* char which separates paths in a list */ #define LISTCHAR ':' /* char which separates paths in a list */
#endif
#define MAXCMD 16384 /* maximum length of command invocation */ #define MAXCMD 16384 /* maximum length of command invocation */
#define MAXERROR 512 /* maximum length of error message string */ #define MAXERROR 512 /* maximum length of error message string */
@@ -94,134 +103,140 @@
/* /*
* File I/O routines. * File I/O routines.
*/ */
extern FILEID openid(char *name, char *mode); extern DLL FILEID openid(char *name, char *mode);
extern FILEID indexid(long index); extern DLL FILEID indexid(long index);
extern BOOL validid(FILEID id); extern DLL BOOL validid(FILEID id);
extern BOOL errorid(FILEID id); extern DLL BOOL errorid(FILEID id);
extern BOOL eofid(FILEID id); extern DLL BOOL eofid(FILEID id);
extern int closeid(FILEID id); extern DLL int closeid(FILEID id);
extern int getcharid(FILEID id); extern DLL int getcharid(FILEID id);
extern int idprintf(FILEID id, char *fmt, int count, VALUE **vals); extern DLL int idprintf(FILEID id, char *fmt, int count, VALUE **vals);
extern int idfputc(FILEID id, int ch); extern DLL int idfputc(FILEID id, int ch);
extern int idfputs(FILEID id, char *str); extern DLL int idfputs(FILEID id, char *str);
extern int printid(FILEID id, int flags); extern DLL int printid(FILEID id, int flags);
extern int flushid(FILEID id); extern DLL int flushid(FILEID id);
extern int readid(FILEID id, int flags, char **retptr); extern DLL int readid(FILEID id, int flags, char **retptr);
extern int getloc(FILEID id, ZVALUE *loc); extern DLL int getloc(FILEID id, ZVALUE *loc);
extern int setloc(FILEID id, ZVALUE zpos); extern DLL int setloc(FILEID id, ZVALUE zpos);
extern int getsize(FILEID id, ZVALUE *size); extern DLL int getsize(FILEID id, ZVALUE *size);
extern int get_device(FILEID id, ZVALUE *dev); extern DLL int get_device(FILEID id, ZVALUE *dev);
extern int get_inode(FILEID id, ZVALUE *ino); extern DLL int get_inode(FILEID id, ZVALUE *ino);
extern FILEID reopenid(FILEID id, char *mode, char *name); extern DLL FILEID reopenid(FILEID id, char *mode, char *name);
extern int closeall(void); extern DLL int closeall(void);
extern int flushall(void);
extern int idfputstr(FILEID id, char *str); #if !defined(_WIN32)
extern int rewindid(FILEID id); extern DLL int flushall(void);
extern void rewindall(void); #endif
extern ZVALUE zfilesize(FILEID id);
extern void showfiles(void); extern DLL int idfputstr(FILEID id, char *str);
extern int fscanfid(FILEID id, char *fmt, int count, VALUE **vals); extern DLL int rewindid(FILEID id);
extern int scanfstr(char *str, char *fmt, int count, VALUE **vals); extern DLL void rewindall(void);
extern int ftellid(FILEID id, ZVALUE *res); extern DLL ZVALUE zfilesize(FILEID id);
extern int fseekid(FILEID id, ZVALUE offset, int whence); extern DLL void showfiles(void);
extern int isattyid(FILEID id); extern DLL int fscanfid(FILEID id, char *fmt, int count, VALUE **vals);
extern int fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res); extern DLL int scanfstr(char *str, char *fmt, int count, VALUE **vals);
extern int frsearch(FILEID id, char *str, ZVALUE first, ZVALUE last, ZVALUE *res); extern DLL int ftellid(FILEID id, ZVALUE *res);
extern void showconstants(void); extern DLL int fseekid(FILEID id, ZVALUE offset, int whence);
extern void freeconstant(unsigned long); extern DLL int isattyid(FILEID id);
extern void freestringconstant(long); extern DLL int fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res);
extern void trimconstants(void); extern DLL int frsearch(FILEID id, char *str, ZVALUE first, ZVALUE last, ZVALUE *res);
extern DLL void showconstants(void);
extern DLL void freeconstant(unsigned long);
extern DLL void freestringconstant(long);
extern DLL void trimconstants(void);
/* /*
* Input routines. * Input routines.
*/ */
extern int openstring(char *str, long num); extern DLL int openstring(char *str, long num);
extern int openterminal(void); extern DLL int openterminal(void);
extern int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok); extern DLL int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok);
extern char *nextline(void); extern DLL char *nextline(void);
extern int nextchar(void); extern DLL int nextchar(void);
extern void reread(void); extern DLL void reread(void);
extern void resetinput(void); extern DLL void resetinput(void);
extern void setprompt(char *); extern DLL void setprompt(char *);
extern BOOL inputisterminal(void); extern DLL BOOL inputisterminal(void);
extern int inputlevel(void); extern DLL int inputlevel(void);
extern long calclevel(void); extern DLL long calclevel(void);
extern char *inputname(void); extern DLL char *inputname(void);
extern long linenumber(void); extern DLL long linenumber(void);
extern void runrcfiles(void); extern DLL void runrcfiles(void);
extern void closeinput(void); extern DLL void closeinput(void);
/* /*
* Other routines. * Other routines.
*/ */
extern NUMBER *constvalue(unsigned long index); extern DLL NUMBER *constvalue(unsigned long index);
extern long addnumber(char *str); extern DLL long addnumber(char *str);
extern long addqconstant(NUMBER *q); extern DLL long addqconstant(NUMBER *q);
extern void initstack(void); extern DLL void initstack(void);
extern void getcommands(BOOL toplevel); extern DLL void getcommands(BOOL toplevel);
extern void givehelp(char *type); extern DLL void givehelp(char *type);
extern void libcalc_call_me_first(void); extern DLL void libcalc_call_me_first(void);
extern void libcalc_call_me_last(void); extern DLL void libcalc_call_me_last(void);
extern BOOL calc_tty(int fd); extern DLL BOOL calc_tty(int fd);
extern BOOL orig_tty(int fd); extern DLL BOOL orig_tty(int fd);
extern void showerrors(void); extern DLL void showerrors(void);
extern char *calc_strdup(CONST char *); extern DLL char *calc_strdup(CONST char *);
/* /*
* Initialization * Initialization
*/ */
extern void initialize(void); extern DLL void initialize(void);
extern void reinitialize(void); extern DLL void reinitialize(void);
extern int isatty(int tty); /* TRUE if fd is a tty */ #if !defined (_WIN32)
extern char *version(void); /* return version string */ extern DLL int isatty(int tty); /* TRUE if fd is a tty */
extern int post_init; /* TRUE => setjmp for math_error is ready */ #endif
extern DLL char *version(void); /* return version string */
extern DLL int post_init; /* TRUE => math_error setjmp is ready */
/* /*
* global flags and definitions * global flags and definitions
*/ */
extern int abortlevel; /* current level of aborts */ extern DLL int abortlevel; /* current level of aborts */
extern BOOL inputwait; /* TRUE if in a terminal input wait */ extern DLL BOOL inputwait; /* TRUE if in a terminal input wait */
extern jmp_buf jmpbuf; /* for errors */ extern DLL jmp_buf jmpbuf; /* for errors */
extern int p_flag; /* TRUE => pipe mode */ extern DLL int p_flag; /* TRUE => pipe mode */
extern int q_flag; /* TRUE => don't execute rc files */ extern DLL int q_flag; /* TRUE => don't execute rc files */
extern int u_flag; /* TRUE => unbuffer stdin and stdout */ extern DLL int u_flag; /* TRUE => unbuffer stdin and stdout */
extern int d_flag; /* TRUE => disable heading, resource_debug */ extern DLL int d_flag; /* TRUE => disable heading, resource_debug */
extern int c_flag; /* TRUE => continue after error if permitted */ extern DLL int c_flag; /* TRUE => continue after error if permitted */
extern int i_flag; /* TRUE => try to go interactive after error */ extern DLL int i_flag; /* TRUE => try to go interactive after error */
extern int s_flag; /* TRUE => keep args as strings for argv() */ extern DLL int s_flag; /* TRUE => keep args as strings for argv() */
extern int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */ extern DLL int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */
extern BOOL abort_now; /* TRUE => try to go interactive */ extern DLL BOOL abort_now; /* TRUE => try to go interactive */
extern int argc_value; /* count of argv[] strings for argv() builtin */ extern DLL int argc_value; /* count of argv[] strings for argv() builtin */
extern char **argv_value; /* argv[] strings for argv() builtin */ extern DLL char **argv_value; /* argv[] strings for argv() builtin */
extern char *pager; /* $PAGER or default */ extern DLL char *pager; /* $PAGER or default */
extern int stdin_tty; /* TRUE if stdin is a tty */ extern DLL int stdin_tty; /* TRUE if stdin is a tty */
extern int havecommands; /* TRUE if have cmd args) */ extern DLL int havecommands; /* TRUE if have cmd args) */
extern char *program; /* our name */ extern DLL char *program; /* our name */
extern char *base_name; /* basename of our name */ extern DLL char *base_name; /* basename of our name */
extern char cmdbuf[]; /* command line expression */ extern DLL char cmdbuf[]; /* command line expression */
extern int abortlevel; /* current level of aborts */ extern DLL int abortlevel; /* current level of aborts */
extern BOOL inputwait; /* TRUE if in a terminal input wait */ extern DLL BOOL inputwait; /* TRUE if in a terminal input wait */
extern VALUE *stack; /* execution stack */ extern DLL VALUE *stack; /* execution stack */
extern int dumpnames; /* TRUE => dump names rather than indices */ extern DLL int dumpnames; /* TRUE => dump names rather than indices */
extern char *calcpath; /* $CALCPATH or default */ extern DLL char *calcpath; /* $CALCPATH or default */
extern char *calcrc; /* $CALCRC or default */ extern DLL char *calcrc; /* $CALCRC or default */
extern char *calcbindings; /* $CALCBINDINGS or default */ extern DLL char *calcbindings; /* $CALCBINDINGS or default */
extern char *home; /* $HOME or default */ extern DLL char *home; /* $HOME or default */
extern char *shell; /* $SHELL or default */ extern DLL char *shell; /* $SHELL or default */
extern char *program; /* our name (argv[0]) */ extern DLL char *program; /* our name (argv[0]) */
extern int no_env; /* TRUE (-e) => ignore env vars on startup */ extern DLL int no_env; /* TRUE (-e) => ignore env vars on startup */
extern int errmax; /* if >= 0, error when errcount exceeds errmax */ extern DLL int errmax; /* if >= 0, error when errcount exceeds errmax */
extern int new_std; /* TRUE (-n) => use newstd configuration */ extern DLL int use_old_std; /* TRUE (-O) => use classic configuration */
extern int allow_read; /* FALSE => may not open any files for reading */ extern DLL int allow_read; /* FALSE => dont open any files for reading */
extern int allow_write; /* FALSE => may not open any files for writing */ extern DLL int allow_write; /* FALSE => dont open any files for writing */
extern int allow_exec; /* FALSE => may not execute any commands */ extern DLL int allow_exec; /* FALSE => may not execute any commands */
/* /*
* calc startup and run state * calc startup and run state
@@ -237,8 +252,8 @@ typedef enum {
RUN_EXIT, /* normal exit from calc */ RUN_EXIT, /* normal exit from calc */
RUN_EXIT_WITH_ERROR /* exit with error */ RUN_EXIT_WITH_ERROR /* exit with error */
} run; } run;
extern run run_state; extern DLL run run_state;
extern char *run_state_name(run state); extern DLL char *run_state_name(run state);
/* /*
* calc version information * calc version information
@@ -247,9 +262,9 @@ extern char *run_state_name(run state);
extern int calc_major_ver; extern int calc_major_ver;
extern int calc_minor_ver; extern int calc_minor_ver;
extern int calc_major_patch; extern int calc_major_patch;
extern char *calc_minor_patch; extern int calc_minor_patch;
extern char *Copyright; extern char *Copyright;
extern char *version(void); extern DLL char *version(void);
#endif /* !__CALC_H__ */ #endif /* !__CALC_H__ */

153
calc.man
View File

@@ -1,5 +1,5 @@
.\" .\"
.\" Copyright (C) 1999 Landon Curt Noll .\" Copyright (C) 1999-2004 Landon Curt Noll
.\" .\"
.\" Calc is open software; you can redistribute it and/or modify it under .\" Calc is open software; you can redistribute it and/or modify it under
.\" the terms of the version 2.1 of the GNU Lesser General Public License .\" the terms of the version 2.1 of the GNU Lesser General Public License
@@ -15,8 +15,8 @@
.\" received a copy with calc; if not, write to Free Software Foundation, Inc. .\" received a copy with calc; if not, write to Free Software Foundation, Inc.
.\" 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. .\" 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
.\" .\"
.\" @(#) $Revision: 29.5 $ .\" @(#) $Revision: 29.15 $
.\" @(#) $Id: calc.man,v 29.5 2000/06/07 14:02:13 chongo Exp $ .\" @(#) $Id: calc.man,v 29.15 2004/08/03 05:06:22 chongo Exp $
.\" @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.man,v $ .\" @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.man,v $
.\" .\"
.\" Under source code control: 1991/07/23 05:48:26 .\" Under source code control: 1991/07/23 05:48:26
@@ -36,24 +36,25 @@ calc \- arbitrary precision calculator
.RB [ \-c ] .RB [ \-c ]
.RB [ \-C ] .RB [ \-C ]
.RB [ \-d ] .RB [ \-d ]
.RB [ -D\ \&calc_debug[:resource_debug[:user_debug]] ]
.br .br
.in +5n .in +5n
.RB [ -D\ \&calc_debug[:resource_debug[:user_debug]] ]
.br
.RB [ \-e ] .RB [ \-e ]
.RB [ \-h ] .RB [ \-h ]
.RB [ \-i ] .RB [ \-i ]
.RB [ \-m\ \&mode ] .RB [ \-m\ \&mode ]
.RB [ \-n ] .RB [ \-O ]
.br
.RB [ \-p ] .RB [ \-p ]
.RB [ \-q ] .RB [ \-q ]
.RB [ \-s ] .RB [ \-s ]
.RB [ \-u ] .RB [ \-u ]
.RB [ \-v ] .RB [ \-v ]
.br
.RB [ calc_cmd\ \&.\|.\|. ] .RB [ calc_cmd\ \&.\|.\|. ]
.in -5n .in -5n
.sp .sp
\fI#!${BINDIR}/calc\fP\ \fB\-S\fP\ [other_flags\ \&...] \fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
.SH DESCRIPTION .SH DESCRIPTION
\& \&
.br .br
@@ -118,7 +119,7 @@ as if \fBconfig("resource_debug", 0)\fP had been executed.
For example: For example:
.sp 1 .sp 1
.in +5n .in +5n
calc 'read qtime; qtime(2)' calc "read qtime; qtime(2)"
.in -5n .in -5n
.sp 1 .sp 1
will output something like: will output something like:
@@ -134,7 +135,7 @@ whereas:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
calc -d 'read qtime; qtime(2)' calc -d "read qtime; qtime(2)"
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
@@ -301,11 +302,22 @@ The reading of key bindings is also disabled
when the mode disables opening of files for reading. when the mode disables opening of files for reading.
.TP .TP
.B \-n .B \-O
Use the new configuration defaults instead of the old Use the old classic defaults instead of the
default classic defaults. default configuration.
This flag as the same effect This flag as the same effect
as executing \fBconfig("all", "newcfg")\fP at startup time. as executing \fBconfig("all", "oldcfg")\fP at startup time.
.sp 1
NOTE: Older versions of calc used
.B \-n
to setup a modified form of the default calc configuration.
The
.B \-n
flag currently does nothing.
Use of the
.B \-n
flag is now deprecated and may be used for
something else in the future.
.TP .TP
.B \-p .B \-p
@@ -315,7 +327,7 @@ For example:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
calc -p '2^21701-1' | fizzbin calc -p "2^21701-1" | fizzbin
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
@@ -405,7 +417,7 @@ enclosing the command between single marks as in:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
calc '23 * 47' calc "23 * 47"
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
@@ -413,7 +425,7 @@ and
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
calc 'print sqrt(2), exp(1)' calc "print sqrt(2), exp(1)"
.fi .fi
.in -5n .in -5n
.sp .sp
@@ -513,8 +525,8 @@ searches in succession:
./myfile.cal ./myfile.cal
${LIBDIR}/myfile ${LIBDIR}/myfile
${LIBDIR}/myfile.cal ${LIBDIR}/myfile.cal
${CUSTOMLIBDIR}/myfile ${CUSTOMCALDIR}/myfile
${CUSTOMLIBDIR}/myfile.cal ${CUSTOMCALDIR}/myfile.cal
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
@@ -571,27 +583,25 @@ If first line of an executable file begins
followed by the absolute pathname of the followed by the absolute pathname of the
.B calc .B calc
program and the flag program and the flag
.B \-S .B \-f
as in: as in:
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
\fI#!${BINDIR}/calc\fP\ \fB\-S\fP\ [other_flags\ \&...] \fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
.fi .fi
.in -5n .in -5n
.sp 1 .sp 1
the rest of the file will be processed in the rest of the file will be processed in
.BR "shell script mode" . .BR "shell script mode" .
Note that Note that
.B \-S .B \-f
(UPPER CASE
.BR \-S )
must be the first \-flag on the ``#!'' line. must be the first \-flag on the ``#!'' line.
Any other optional Any other optional
.B "other_flags" .B "other_flags"
must come after must come after
the the
.BR \-S . .BR \-f .
.sp 1 .sp 1
In In
.B "shell script mode" .B "shell script mode"
@@ -624,7 +634,7 @@ the file
.sp 1 .sp 1
.in +5n .in +5n
.nf .nf
\fI#!${BINDIR}/calc\fP\ \fB\-S\fP\ \&\fB\-q\fP \fI#!${BINDIR}/calc\fP\ \&\fB\-q\fP \fB\-f\fP
# #
# mersenne - an example of a calc \fBshell script file\fP # mersenne - an example of a calc \fBshell script file\fP
@@ -838,7 +848,7 @@ ${LIBDIR}/bindings
non-GNU-readline command line editor bindings non-GNU-readline command line editor bindings
.sp 1 .sp 1
.TP 5 .TP 5
${INCDIRCALC}/*.h ${CALC_INCDIR}/*.h
include files for C interface use include files for C interface use
.sp 1 .sp 1
.TP 5 .TP 5
@@ -850,7 +860,7 @@ ${LIBDIR}/libcustcalc.a
custom binary link library custom binary link library
.sp 1 .sp 1
.TP 5 .TP 5
${CUSTOMLIBDIR}/*.cal ${CUSTOMCALDIR}/*.cal
custom resource files custom resource files
.sp 1 .sp 1
.TP 5 .TP 5
@@ -993,25 +1003,58 @@ Copyright (C) 1999 Landon Curt Noll
and is covered under version 2.1 GNU Lesser General and is covered under version 2.1 GNU Lesser General
Public License. Public License.
.sp .sp
.SH "BUG REPORTS / BUG FIXES / ENHANCEMENTS" .SH "CALC MAILING LIST / CALC UPDATES / ENHANCEMENTS"
\& \&
.br .br
.sp .sp
Send comments, suggestions, bug fixes, enhancements To contribute comments, suggestions, enhancements
and interesting and interesting
.B calc .B calc
resource files, resource files, and
.B calc shell scripts please join the low volume calc mailing list.
shell scripts that you would like you see included .sp
in future distributions to: To join the low volume calc mailing list, send EMail to:
.sp .sp
.in +0.5i .in +0.5i
.nf .nf
calc-contrib at asthe dot com calc-tester-request at asthe dot com
.fi .fi
.in -0.5i .in -0.5i
.sp .sp
Bug reports are sent to: Your subject must contain the words:
.sp
.in +0.5i
.nf
calc mailing list subscription
.fi
.in -0.5i
.sp
You may have additional words in your subject line.
.sp
Your message body must contain:
.sp
.in +0.5i
.nf
subscribe calc-tester address
end
name your_full_name
.fi
.in -0.5i
.sp
where
.B address
s your EMail address and
.B your_full_name
is your full name.
Feel free to follow the
.B name
line with additional EMail text as desired.
.sp
.SH "BUG REPORTS / BUG FIXES"
\&
.br
.sp
Send bug reports and bug fixes to:
.sp .sp
.in +0.5i .in +0.5i
.nf .nf
@@ -1022,6 +1065,16 @@ calc-bugs at asthe dot com
.fi .fi
.in -0.5i .in -0.5i
.sp .sp
Your subject must contain the words:
.sp
.in +0.5i
.nf
calc bug report
.fi
.in -0.5i
.sp
You may have additional words in your subject line.
.sp
See the See the
.I BUGS .I BUGS
source file or use the source file or use the
@@ -1036,7 +1089,7 @@ help bugs
.sp .sp
for more information about bug reporting. for more information about bug reporting.
.sp .sp
.SH "CALC WEB SITE / MAILING LIST" .SH "CALC WEB SITE"
\& \&
.br .br
Landon Noll maintains the the Landon Noll maintains the the
@@ -1044,33 +1097,7 @@ Landon Noll maintains the the
web site is located at: web site is located at:
.sp .sp
.in +0.5i .in +0.5i
http://www.isthe.com/chongo/tech/comp/calc/ www.isthe.com/chongo/tech/comp/calc/
.in -0.5i .in -0.5i
.sp .sp
One may join the
.B calc
testing group by sending a request to:
.sp
.in +0.5i
.nf
calc-tester-request at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
.fi
.in -0.5i
.sp
Your message body (not the subject) should consist of:
.sp
.in +0.5i
.nf
subscribe calc-tester address
end
name your_full_name
.fi
.in -0.5i
.sp
where "address" is your EMail address and "your_full_name"
is your full name.
.sp
Share and Enjoy! :\-) Share and Enjoy! :\-)

116
calc.spec.in Normal file
View File

@@ -0,0 +1,116 @@
#****h* calc/calc.spec.in
#
# calc.spec.in - template specfile for calc
#
# Copyright (C) 2003-2004 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
# 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.13 $
# @(#) $Id: calc.spec.in,v 29.13 2004/02/23 14:04:01 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.spec.in,v $
#
# Under source code control: 2003/02/16 20:21:39
# File existed as early as: 2003
#
# calculator by David I. Bell with help/mods from others
# Makefile by Petteri Kettunen with modifications from Landon Curt Noll
# 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
# is defined in `%files devel' section, then rpmbuild complains that
# header files are defined twice - rpmbuild bug or bug in specfile conf???
Summary: Arbitrary precision calculator.
Name: calc
Version: <<<PROJECT_VERSION>>>
Release: 0
Copyright: LGPL
Group: Applications/Engineering
Source: %{name}-%{version}.tar.gz
URL: http://www.isthe.com/chongo/tech/comp/calc/index.html
Requires: ncurses >= 5.2-26, readline >= 4.2, less >= 358
BuildRequires: ncurses-devel >= 5.2-26, readline-devel >= 4.2
BuildRoot: %{_tmppath}/%{name}-root
%description
Calc is arbitrary precision C-like arithmetic system that is a
calculator, an algorithm prototyper 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:
http://www.isthe.com/chongo/tech/comp/calc/index.html
%package devel
Summary: Development files and documentation for calc.
Group: Development/Libraries
PreReq: %{name} = %{version}-%{release}
%description devel
This package contains the header files and static libraries for developing
calc (arbitrary precision calculator).
For the latest calc release, see the project home page:
http://www.isthe.com/chongo/tech/comp/calc/index.html
%prep
%setup -q
%build
make %{?_smp_mflags} T=%{buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 all chk
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}
make T=%{buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 install
%clean
rm -rf %{buildroot}
%files
%defattr(-, root, root)
%doc BUGS CHANGES COPYING COPYING-LGPL
%{_bindir}/*
%{_mandir}/man1/*
%{_datadir}/%{name}/*/*
%{_datadir}/%{name}/bindings
%{_datadir}/%{name}/README
%{_datadir}/%{name}/*.cal
%files devel
%defattr(-, root, root)
%doc BUGS COPYING COPYING-LGPL LIBRARY
%attr(644, root, root) %{_includedir}/calc/*
%attr(644, root, root) %{_libdir}/*.a
%changelog
* 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
- Added BUGS to calc-devel as well as calc
* Tue Feb 25 2003 Landon Curt Noll http://www.isthe.com/chongo
- Release of calc-2.11.7-1
- Require ncurses, readline and less to install.
- Require ncurses-devel and readline-devel to build.
* Tue Feb 18 2003 Landon Curt Noll http://www.isthe.com/chongo
- Misc changes to fit local directory setup
* Sun Feb 16 2003 Petteri Kettunen <petterik@users.sourceforge.net>
- initial RPM build
#****

View File

@@ -17,8 +17,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.3 $ # @(#) $Revision: 29.4 $
# @(#) $Id: calcerr.tbl,v 29.3 2000/07/17 15:35:49 chongo Exp $ # @(#) $Id: calcerr.tbl,v 29.4 2001/04/10 22:06:46 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/calcerr.tbl,v $ # @(#) $Source: /usr/local/src/cmd/calc/RCS/calcerr.tbl,v $
# #
# Under source code control: 1996/05/23 17:38:44 # Under source code control: 1996/05/23 17:38:44
@@ -108,8 +108,8 @@ E_FGETSTR1 Non-file first argument for fgetstr
E_FGETSTR2 File not open for reading for fgetstr E_FGETSTR2 File not open for reading for fgetstr
E_FGETLINE1 Non-file argument for fgetline E_FGETLINE1 Non-file argument for fgetline
E_FGETLINE2 File not open for reading for fgetline E_FGETLINE2 File not open for reading for fgetline
E_FGETWORD1 Non-file argument for fgetword E_FGETFIELD1 Non-file argument for fgetfield
E_FGETWORD2 File not open for reading for fgetword E_FGETFIELD2 File not open for reading for fgetfield
E_REWIND1 Non-file argument for rewind E_REWIND1 Non-file argument for rewind
E_FILES Non-integer argument for files E_FILES Non-integer argument for files
E_PRINTF1 Non-string fmt argument for fprint E_PRINTF1 Non-string fmt argument for fprint

15
cmath.h
View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.6 $
* @(#) $Id: cmath.h,v 29.3 2000/07/17 15:35:49 chongo Exp $ * @(#) $Id: cmath.h,v 29.6 2002/03/12 09:38:26 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/cmath.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/cmath.h,v $
* *
* Under source code control: 1993/07/30 19:42:45 * Under source code control: 1993/07/30 19:42:45
@@ -32,7 +32,11 @@
#define __CMATH_H__ #define __CMATH_H__
#include "qmath.h" #if defined(CALC_SRC) /* if we are building from the calc source tree */
# include "qmath.h"
#else
# include <calc/qmath.h>
#endif
/* /*
@@ -58,6 +62,7 @@ extern void cprintfr(COMPLEX *c);
/* /*
* Basic numeric routines. * Basic numeric routines.
*/ */
extern COMPLEX *cadd(COMPLEX *c1, COMPLEX *c2); extern COMPLEX *cadd(COMPLEX *c1, COMPLEX *c2);
extern COMPLEX *csub(COMPLEX *c1, COMPLEX *c2); extern COMPLEX *csub(COMPLEX *c1, COMPLEX *c2);
extern COMPLEX *cmul(COMPLEX *c1, COMPLEX *c2); extern COMPLEX *cmul(COMPLEX *c1, COMPLEX *c2);
@@ -70,8 +75,8 @@ extern COMPLEX *cscale(COMPLEX *c, long i);
extern COMPLEX *cshift(COMPLEX *c, long i); extern COMPLEX *cshift(COMPLEX *c, long i);
extern COMPLEX *csquare(COMPLEX *c); extern COMPLEX *csquare(COMPLEX *c);
extern COMPLEX *cconj(COMPLEX *c); extern COMPLEX *cconj(COMPLEX *c);
extern COMPLEX *creal(COMPLEX *c); extern COMPLEX *c_real(COMPLEX *c);
extern COMPLEX *cimag(COMPLEX *c); extern COMPLEX *c_imag(COMPLEX *c);
extern COMPLEX *cneg(COMPLEX *c); extern COMPLEX *cneg(COMPLEX *c);
extern COMPLEX *cinv(COMPLEX *c); extern COMPLEX *cinv(COMPLEX *c);
extern COMPLEX *cint(COMPLEX *c); extern COMPLEX *cint(COMPLEX *c);

View File

@@ -1,7 +1,7 @@
/* /*
* codegen - module to generate opcodes from the input tokens * codegen - module to generate opcodes from the input tokens
* *
* Copyright (C) 1999 David I. Bell and Ernest Bowen * Copyright (C) 1999-2004 David I. Bell and Ernest Bowen
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.9 $
* @(#) $Id: codegen.c,v 29.3 2000/07/17 15:35:49 chongo Exp $ * @(#) $Id: codegen.c,v 29.9 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/codegen.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/codegen.c,v $
* *
* Under source code control: 1990/02/15 01:48:13 * Under source code control: 1990/02/15 01:48:13
@@ -45,6 +45,10 @@
#include "func.h" #include "func.h"
#include "conf.h" #include "conf.h"
#if defined(_WIN32) && !defined(__CYGWIN__)
# include <direct.h>
#endif
static BOOL rdonce; /* TRUE => do not reread this file */ static BOOL rdonce; /* TRUE => do not reread this file */
FUNC *curfunc; FUNC *curfunc;
@@ -123,6 +127,7 @@ getcommands(BOOL toplevel)
if (!toplevel) if (!toplevel)
enterfilescope(); enterfilescope();
for (;;) { for (;;) {
int i;
(void) tokenmode(TM_NEWLINES); (void) tokenmode(TM_NEWLINES);
switch (gettoken()) { switch (gettoken()) {
@@ -140,10 +145,14 @@ getcommands(BOOL toplevel)
return; return;
case T_HELP: case T_HELP:
for (;;) { for (i=1;;i++) {
switch(getfilename(name, NULL)) { switch(getfilename(name, NULL)) {
case 1: case -1:
strcpy(name, DEFAULTCALCHELP); if(i == 1) {
strcpy(name, DEFAULTCALCHELP);
givehelp(name);
}
break;
case 0: case 0:
givehelp(name); givehelp(name);
continue; continue;
@@ -518,9 +527,10 @@ getsimpledeclaration(int symtype)
switch (gettoken()) { switch (gettoken()) {
case T_SYMBOL: case T_SYMBOL:
rescantoken(); rescantoken();
res = getonevariable(symtype); if (getonevariable(symtype)) {
if (res) res = 1;
addop(OP_POP); addop(OP_POP);
}
continue; continue;
case T_COMMA: case T_COMMA:
continue; continue;
@@ -1739,6 +1749,8 @@ getrelation(void)
rescantoken(); rescantoken();
return type; return type;
} }
if (islvalue(type))
addop(OP_GETVALUE);
(void) getsum(); (void) getsum();
addop(op); addop(op);
return EXPR_RVALUE; return EXPR_RVALUE;
@@ -1778,6 +1790,8 @@ getsum(void)
rescantoken(); rescantoken();
return type; return type;
} }
if (islvalue(type))
addop(OP_GETVALUE);
(void) getproduct(); (void) getproduct();
addop(op); addop(op);
type = EXPR_RVALUE; type = EXPR_RVALUE;
@@ -1807,6 +1821,8 @@ getproduct(void)
rescantoken(); rescantoken();
return type; return type;
} }
if (islvalue(type))
addop(OP_GETVALUE);
(void) getorexpr(); (void) getorexpr();
addop(op); addop(op);
type = EXPR_RVALUE; type = EXPR_RVALUE;
@@ -1826,6 +1842,8 @@ getorexpr(void)
type = getandexpr(); type = getandexpr();
while (gettoken() == T_OR) { while (gettoken() == T_OR) {
if (islvalue(type))
addop(OP_GETVALUE);
(void) getandexpr(); (void) getandexpr();
addop(OP_OR); addop(OP_OR);
type = EXPR_RVALUE; type = EXPR_RVALUE;
@@ -1857,6 +1875,8 @@ getandexpr(void)
rescantoken(); rescantoken();
return type; return type;
} }
if (islvalue(type))
addop(OP_GETVALUE);
(void) getshiftexpr(); (void) getshiftexpr();
addop(op); addop(op);
type = EXPR_RVALUE; type = EXPR_RVALUE;
@@ -1909,6 +1929,8 @@ getshiftexpr(void)
rescantoken(); rescantoken();
return type; return type;
} }
if (islvalue(type))
addop(OP_GETVALUE);
(void) getshiftexpr(); (void) getshiftexpr();
addop(op); addop(op);
return EXPR_RVALUE; return EXPR_RVALUE;

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.3 $
* @(#) $Id: commath.c,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: commath.c,v 29.3 2002/03/12 09:38:26 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/commath.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/commath.c,v $
* *
* Under source code control: 1990/02/15 01:48:10 * Under source code control: 1990/02/15 01:48:10
@@ -381,7 +381,7 @@ cconj(COMPLEX *c)
* Return the real part of a complex number. * Return the real part of a complex number.
*/ */
COMPLEX * COMPLEX *
creal(COMPLEX *c) c_real(COMPLEX *c)
{ {
COMPLEX *r; COMPLEX *r;
@@ -400,7 +400,7 @@ creal(COMPLEX *c)
* Return the imaginary part of a complex number as a real. * Return the imaginary part of a complex number as a real.
*/ */
COMPLEX * COMPLEX *
cimag(COMPLEX *c) c_imag(COMPLEX *c)
{ {
COMPLEX *r; COMPLEX *r;

182
config.c
View File

@@ -1,7 +1,7 @@
/* /*
* config - configuration routines * config - configuration routines
* *
* Copyright (C) 1999 David I. Bell and Landon Curt Noll * Copyright (C) 1999-2004 David I. Bell and Landon Curt Noll
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.4 $ * @(#) $Revision: 29.14 $
* @(#) $Id: config.c,v 29.4 2000/07/17 15:35:49 chongo Exp $ * @(#) $Id: config.c,v 29.14 2004/02/25 23:56:13 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/config.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/config.c,v $
* *
* Under source code control: 1991/07/20 00:21:56 * Under source code control: 1991/07/20 00:21:56
@@ -38,6 +38,7 @@
#include "nametype.h" #include "nametype.h"
#include "config.h" #include "config.h"
#include "string.h" #include "string.h"
#include "custom.h"
#include "have_strdup.h" #include "have_strdup.h"
#if !defined(HAVE_STRDUP) #if !defined(HAVE_STRDUP)
@@ -51,6 +52,7 @@
NAMETYPE configs[] = { NAMETYPE configs[] = {
{"all", CONFIG_ALL}, {"all", CONFIG_ALL},
{"mode", CONFIG_MODE}, {"mode", CONFIG_MODE},
{"mode2", CONFIG_MODE2},
{"display", CONFIG_DISPLAY}, {"display", CONFIG_DISPLAY},
{"epsilon", CONFIG_EPSILON}, {"epsilon", CONFIG_EPSILON},
/*epsilonprec -- tied to epsilon not a configuration type*/ /*epsilonprec -- tied to epsilon not a configuration type*/
@@ -90,6 +92,10 @@ NAMETYPE configs[] = {
{"ctrl-d", CONFIG_CTRL_D}, /* alias for ctrl_d */ {"ctrl-d", CONFIG_CTRL_D}, /* alias for ctrl_d */
{"program", CONFIG_PROGRAM}, {"program", CONFIG_PROGRAM},
{"basename", CONFIG_BASENAME}, {"basename", CONFIG_BASENAME},
{"windows", CONFIG_WINDOWS},
{"cygwin", CONFIG_CYGWIN},
{"compile_custom", CONFIG_COMPILE_CUSTOM},
{"allow_custom", CONFIG_ALLOW_CUSTOM},
{"version", CONFIG_VERSION}, {"version", CONFIG_VERSION},
{NULL, 0} {NULL, 0}
}; };
@@ -100,6 +106,7 @@ NAMETYPE configs[] = {
*/ */
CONFIG oldstd = { /* backward compatible standard configuration */ CONFIG oldstd = { /* backward compatible standard configuration */
MODE_INITIAL, /* current output mode */ MODE_INITIAL, /* current output mode */
MODE2_INITIAL, /* current secondary output mode */
20, /* current output digits for float or exp */ 20, /* current output digits for float or exp */
NULL, /* loaded in at startup - default error for real functions */ NULL, /* loaded in at startup - default error for real functions */
EPSILONPREC_DEFAULT, /* binary precision of epsilon */ EPSILONPREC_DEFAULT, /* binary precision of epsilon */
@@ -132,17 +139,34 @@ CONFIG oldstd = { /* backward compatible standard configuration */
0, /* internal calc debug level */ 0, /* internal calc debug level */
3, /* calc resource file debug level */ 3, /* calc resource file debug level */
0, /* user defined debug level */ 0, /* user defined debug level */
TRUE, /* print Quit or abort executed messages */ FALSE, /* print Quit or abort executed messages */
CTRL_D_VIRGIN_EOF, /* ^D only exits on virgin lines */ CTRL_D_VIRGIN_EOF, /* ^D only exits on virgin lines */
NULL, /* our name */ NULL, /* our name */
NULL, /* basename of our name */ NULL, /* basename of our name */
#if defined(_WIN32)
TRUE, /* running under windows */
#else
FALSE, /* congrats, you are not using windows */
#endif
#if defined(__CYGWIN__)
TRUE, /* compiled under cygwin */
#else
FALSE, /* not compiled with cygwin */
#endif
#if defined(CUSTOM)
TRUE, /* compiled with -DCUSTOM */
#else
FALSE, /* compiled without -DCUSTOM */
#endif
&allow_custom, /* *TRUE=> custom functions are enabled */
NULL /* version */ NULL /* version */
}; };
CONFIG newstd = { /* new non-backward compatible configuration */ CONFIG newstd = { /* new non-backward compatible configuration */
MODE_INITIAL, /* current output mode */ MODE_INITIAL, /* current output mode */
10, /* current output digits for float or exp */ MODE2_INITIAL, /* current output mode */
20, /* current output digits for float or exp */
NULL, /* loaded in at startup - default error for real functions */ NULL, /* loaded in at startup - default error for real functions */
NEW_EPSILONPREC_DEFAULT, /* binary precision of epsilon */ EPSILONPREC_DEFAULT, /* binary precision of epsilon */
FALSE, /* tracing flags */ FALSE, /* tracing flags */
MAXPRINT_DEFAULT, /* number of elements to print */ MAXPRINT_DEFAULT, /* number of elements to print */
MUL_ALG2, /* size of number to use multiply alg 2 */ MUL_ALG2, /* size of number to use multiply alg 2 */
@@ -152,7 +176,7 @@ CONFIG newstd = { /* new non-backward compatible configuration */
TRUE, /* ok to print a tilde on approximations */ TRUE, /* ok to print a tilde on approximations */
TRUE, /* ok to print tab before numeric values */ TRUE, /* ok to print tab before numeric values */
0, /* quomod() default rounding mode */ 0, /* quomod() default rounding mode */
0, /* quotient // default rounding mode */ 2, /* quotient // default rounding mode */
0, /* mod % default rounding mode */ 0, /* mod % default rounding mode */
24, /* sqrt() default rounding mode */ 24, /* sqrt() default rounding mode */
24, /* appr() default rounding mode */ 24, /* appr() default rounding mode */
@@ -161,7 +185,7 @@ CONFIG newstd = { /* new non-backward compatible configuration */
24, /* output default rounding mode */ 24, /* output default rounding mode */
24, /* round()/bround() default rounding mode */ 24, /* round()/bround() default rounding mode */
TRUE, /* ok to print leading 0 before decimal pt */ TRUE, /* ok to print leading 0 before decimal pt */
1, /* ok to print trailing 0's */ 0, /* ok to print trailing 0's */
MAXSCANCOUNT, /* max scan errors before abort */ MAXSCANCOUNT, /* max scan errors before abort */
"; ", /* normal prompt */ "; ", /* normal prompt */
";; ", /* prompt when inside multi-line input */ ";; ", /* prompt when inside multi-line input */
@@ -172,10 +196,26 @@ CONFIG newstd = { /* new non-backward compatible configuration */
0, /* internal calc debug level */ 0, /* internal calc debug level */
3, /* calc resource file debug level */ 3, /* calc resource file debug level */
0, /* user defined debug level */ 0, /* user defined debug level */
TRUE, /* print Quit or abort executed messages */ FALSE, /* print Quit or abort executed messages */
CTRL_D_VIRGIN_EOF, /* ^D only exits on virgin lines */ CTRL_D_VIRGIN_EOF, /* ^D only exits on virgin lines */
NULL, /* our name */ NULL, /* our name */
NULL, /* basename of our name */ NULL, /* basename of our name */
#if defined(_WIN32)
TRUE, /* running under windows */
#else
FALSE, /* congrats, you are not using windows */
#endif
#if defined(__CYGWIN__)
TRUE, /* compiled under cygwin */
#else
FALSE, /* not compiled with cygwin */
#endif
#if defined(CUSTOM)
TRUE, /* compiled with -DCUSTOM */
#else
FALSE, /* compiled without -DCUSTOM */
#endif
&allow_custom, /* *TRUE=> custom functions are enabled */
NULL /* version */ NULL /* version */
}; };
CONFIG *conf = NULL; /* loaded in at startup - current configuration */ CONFIG *conf = NULL; /* loaded in at startup - current configuration */
@@ -201,6 +241,7 @@ static NAMETYPE modes[] = {
{"oct", MODE_OCTAL}, {"oct", MODE_OCTAL},
{"binary", MODE_BINARY}, {"binary", MODE_BINARY},
{"bin", MODE_BINARY}, {"bin", MODE_BINARY},
{"off", MODE2_OFF},
{NULL, 0} {NULL, 0}
}; };
@@ -456,6 +497,19 @@ setconfig(int type, VALUE *vp)
math_setmode((int) temp); math_setmode((int) temp);
break; break;
case CONFIG_MODE2:
if (vp->v_type != V_STR) {
math_error("Non-string for mode");
/*NOTREACHED*/
}
temp = lookup_long(modes, vp->v_str->s_str);
if (temp < 0) {
math_error("Unknown mode \"%s\"", vp->v_str);
/*NOTREACHED*/
}
math_setmode2((int) temp);
break;
case CONFIG_EPSILON: case CONFIG_EPSILON:
if (vp->v_type != V_NUM) { if (vp->v_type != V_NUM) {
math_error("Non-numeric for epsilon"); math_error("Non-numeric for epsilon");
@@ -822,11 +876,27 @@ setconfig(int type, VALUE *vp)
/*NOTREACHED*/ /*NOTREACHED*/
case CONFIG_BASENAME: case CONFIG_BASENAME:
math_error("The program config parameter is read-only"); math_error("The basename config parameter is read-only");
/*NOTREACHED*/
case CONFIG_WINDOWS:
math_error("The windows config parameter is read-only");
/*NOTREACHED*/
case CONFIG_CYGWIN:
math_error("The cygwin config parameter is read-only");
/*NOTREACHED*/
case CONFIG_COMPILE_CUSTOM:
math_error("The custom config parameter is read-only");
/*NOTREACHED*/
case CONFIG_ALLOW_CUSTOM:
math_error("The allow_custom config parameter is read-only");
/*NOTREACHED*/ /*NOTREACHED*/
case CONFIG_VERSION: case CONFIG_VERSION:
math_error("The program config parameter is read-only"); math_error("The version config parameter is read-only");
/*NOTREACHED*/ /*NOTREACHED*/
default: default:
@@ -889,6 +959,7 @@ config_copy(CONFIG *src)
} else { } else {
dest->base_name = strdup(src->base_name); dest->base_name = strdup(src->base_name);
} }
/* NOTE: allow_custom points to a global variable, so do not clone it */
if (src->version == NULL) { if (src->version == NULL) {
dest->version = strdup(version()); dest->version = strdup(version());
} else { } else {
@@ -936,6 +1007,7 @@ config_free(CONFIG *cfg)
if (cfg->base_name != NULL) { if (cfg->base_name != NULL) {
free(cfg->base_name); free(cfg->base_name);
} }
/* NOTE: allow_custom points to a global variable, so do not free it */
if (cfg->version != NULL) { if (cfg->version != NULL) {
free(cfg->version); free(cfg->version);
} }
@@ -1003,6 +1075,16 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
vp->v_str = makenewstring(p); vp->v_str = makenewstring(p);
return; return;
case CONFIG_MODE2:
vp->v_type = V_STR;
p = lookup_name(modes, cfg->outmode2);
if (p == NULL) {
math_error("invalid secondary output mode: %d", cfg->outmode2);
/*NOTREACHED*/
}
vp->v_str = makenewstring(p);
return;
case CONFIG_EPSILON: case CONFIG_EPSILON:
vp->v_num = qlink(cfg->epsilon); vp->v_num = qlink(cfg->epsilon);
return; return;
@@ -1028,20 +1110,18 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
break; break;
case CONFIG_TILDE: case CONFIG_TILDE:
vp->v_type = V_STR;
if (cfg->tilde_ok) { if (cfg->tilde_ok) {
vp->v_str = makenewstring(TRUE_STRING); vp->v_num = itoq(1);
} else { } else {
vp->v_str = makenewstring(FALSE_STRING); vp->v_num = itoq(0);
} }
return; return;
case CONFIG_TAB: case CONFIG_TAB:
vp->v_type = V_STR;
if (cfg->tab_ok) { if (cfg->tab_ok) {
vp->v_str = makenewstring(TRUE_STRING); vp->v_num = itoq(1);
} else { } else {
vp->v_str = makenewstring(FALSE_STRING); vp->v_num = itoq(0);
} }
return; return;
@@ -1082,20 +1162,18 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
break; break;
case CONFIG_LEADZERO: case CONFIG_LEADZERO:
vp->v_type = V_STR;
if (cfg->leadzero) { if (cfg->leadzero) {
vp->v_str = makenewstring(TRUE_STRING); vp->v_num = itoq(1);
} else { } else {
vp->v_str = makenewstring(FALSE_STRING); vp->v_num = itoq(0);
} }
return; return;
case CONFIG_FULLZERO: case CONFIG_FULLZERO:
vp->v_type = V_STR;
if (cfg->fullzero) { if (cfg->fullzero) {
vp->v_str = makenewstring(TRUE_STRING); vp->v_num = itoq(1);
} else { } else {
vp->v_str = makenewstring(FALSE_STRING); vp->v_num = itoq(0);
} }
return; return;
@@ -1118,11 +1196,10 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
break; break;
case CONFIG_BLKVERBOSE: case CONFIG_BLKVERBOSE:
vp->v_type = V_STR;
if (cfg->blkverbose) { if (cfg->blkverbose) {
vp->v_str = makenewstring(TRUE_STRING); vp->v_num = itoq(1);
} else { } else {
vp->v_str = makenewstring(FALSE_STRING); vp->v_num = itoq(0);
} }
return; return;
@@ -1159,11 +1236,10 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
break; break;
case CONFIG_VERBOSE_QUIT: case CONFIG_VERBOSE_QUIT:
vp->v_type = V_STR;
if (cfg->verbose_quit) { if (cfg->verbose_quit) {
vp->v_str = makenewstring(TRUE_STRING); vp->v_num = itoq(1);
} else { } else {
vp->v_str = makenewstring(FALSE_STRING); vp->v_num = itoq(0);
} }
return; return;
@@ -1195,6 +1271,42 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
} }
return; return;
case CONFIG_WINDOWS:
if (cfg->windows) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
case CONFIG_CYGWIN:
if (cfg->cygwin) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
case CONFIG_COMPILE_CUSTOM:
if (cfg->compile_custom) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
case CONFIG_ALLOW_CUSTOM:
/* firewall */
if (cfg->allow_custom == NULL) {
cfg->allow_custom = &allow_custom;
}
if (*(cfg->allow_custom)) {
vp->v_num = itoq(1);
} else {
vp->v_num = itoq(0);
}
return;
case CONFIG_VERSION: case CONFIG_VERSION:
vp->v_type = V_STR; vp->v_type = V_STR;
if (cfg->version == NULL) { if (cfg->version == NULL) {
@@ -1250,6 +1362,7 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
return cfg1->traceflags != cfg2->traceflags || return cfg1->traceflags != cfg2->traceflags ||
cfg1->outdigits != cfg2->outdigits || cfg1->outdigits != cfg2->outdigits ||
cfg1->outmode != cfg2->outmode || cfg1->outmode != cfg2->outmode ||
cfg1->outmode2 != cfg2->outmode2 ||
qcmp(cfg1->epsilon, cfg2->epsilon) || qcmp(cfg1->epsilon, cfg2->epsilon) ||
cfg1->epsilonprec != cfg2->epsilonprec || cfg1->epsilonprec != cfg2->epsilonprec ||
cfg1->maxprint != cfg2->maxprint || cfg1->maxprint != cfg2->maxprint ||
@@ -1293,6 +1406,17 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
(cfg1->base_name != NULL && cfg2->base_name != NULL && (cfg1->base_name != NULL && cfg2->base_name != NULL &&
strcmp(cfg1->base_name, cfg2->base_name) != 0) || strcmp(cfg1->base_name, cfg2->base_name) != 0) ||
cfg1->windows != cfg2->windows ||
cfg1->cygwin != cfg2->cygwin ||
cfg1->compile_custom != cfg2->compile_custom ||
(cfg1->allow_custom == NULL && cfg2->allow_custom != NULL) ||
(cfg1->allow_custom != NULL && cfg2->allow_custom == NULL) ||
(cfg1->allow_custom != NULL && cfg2->allow_custom != NULL &&
*(cfg1->allow_custom) != *(cfg2->allow_custom)) ||
(cfg1->version == NULL && cfg2->version != NULL) || (cfg1->version == NULL && cfg2->version != NULL) ||
(cfg1->version != NULL && cfg2->version == NULL) || (cfg1->version != NULL && cfg2->version == NULL) ||
(cfg1->version != NULL && cfg2->version != NULL && (cfg1->version != NULL && cfg2->version != NULL &&

View File

@@ -1,7 +1,7 @@
/* /*
* config - configuration routines * config - configuration routines
* *
* Copyright (C) 1999 Landon Curt Noll and David I. Bell * Copyright (C) 1999-2004 Landon Curt Noll and David I. Bell
* *
* Primary author: Landon Curt Noll * Primary author: Landon Curt Noll
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.4 $ * @(#) $Revision: 29.17 $
* @(#) $Id: config.h,v 29.4 2000/07/17 15:35:49 chongo Exp $ * @(#) $Id: config.h,v 29.17 2004/02/25 23:56:13 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/config.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/config.h,v $
* *
* Under source code control: 1995/11/01 22:20:17 * Under source code control: 1995/11/01 22:20:17
@@ -35,8 +35,15 @@
#define __CONFIG_H__ #define __CONFIG_H__
#include "nametype.h" #if defined(CALC_SRC) /* if we are building from the calc source tree */
#include "qmath.h" # include "win32dll.h"
# include "nametype.h"
# include "qmath.h"
#else
# include <calc/win32dll.h>
# include <calc/nametype.h>
# include <calc/qmath.h>
#endif
/* /*
@@ -71,17 +78,22 @@
#define CONFIG_MORE 25 #define CONFIG_MORE 25
#define CONFIG_BLKMAXPRINT 26 #define CONFIG_BLKMAXPRINT 26
#define CONFIG_BLKVERBOSE 27 #define CONFIG_BLKVERBOSE 27
#define CONFIG_BLKBASE 28 #define CONFIG_BLKBASE 28
#define CONFIG_BLKFMT 29 #define CONFIG_BLKFMT 29
#define CONFIG_RESOURCE_DEBUG 30 #define CONFIG_RESOURCE_DEBUG 30
#define CONFIG_LIB_DEBUG CONFIG_RESOURCE_DEBUG #define CONFIG_LIB_DEBUG CONFIG_RESOURCE_DEBUG
#define CONFIG_CALC_DEBUG 31 #define CONFIG_CALC_DEBUG 31
#define CONFIG_USER_DEBUG 32 #define CONFIG_USER_DEBUG 32
#define CONFIG_VERBOSE_QUIT 33 #define CONFIG_VERBOSE_QUIT 33
#define CONFIG_CTRL_D 34 #define CONFIG_CTRL_D 34
#define CONFIG_PROGRAM 35 #define CONFIG_PROGRAM 35
#define CONFIG_BASENAME 36 #define CONFIG_BASENAME 36
#define CONFIG_VERSION 37 #define CONFIG_VERSION 37
#define CONFIG_WINDOWS 38
#define CONFIG_MODE2 39
#define CONFIG_CYGWIN 40
#define CONFIG_COMPILE_CUSTOM 41
#define CONFIG_ALLOW_CUSTOM 42
/* /*
@@ -90,8 +102,6 @@
#define DISPLAY_DEFAULT 20 /* default digits for float display */ #define DISPLAY_DEFAULT 20 /* default digits for float display */
#define EPSILON_DEFAULT "1e-20" /* allowed error for float calculations */ #define EPSILON_DEFAULT "1e-20" /* allowed error for float calculations */
#define EPSILONPREC_DEFAULT 67 /* 67 ==> 2^-67 <= EPSILON_DEFAULT < 2^-66 */ #define EPSILONPREC_DEFAULT 67 /* 67 ==> 2^-67 <= EPSILON_DEFAULT < 2^-66 */
#define NEW_EPSILON_DEFAULT "1e-10" /* newstd EPSILON_DEFAULT */
#define NEW_EPSILONPREC_DEFAULT 34 /* 34 ==> 2^-34 <= 1e-10 < 2^-33 */
#define MAXPRINT_DEFAULT 16 /* default number of elements printed */ #define MAXPRINT_DEFAULT 16 /* default number of elements printed */
#define MAXSCANCOUNT 20 /* default max scan errors before an abort */ #define MAXSCANCOUNT 20 /* default max scan errors before an abort */
@@ -110,6 +120,7 @@
*/ */
struct config { struct config {
int outmode; /* current output mode */ int outmode; /* current output mode */
int outmode2; /* current secondary output mode */
LEN outdigits; /* current output digits for float or exp */ LEN outdigits; /* current output digits for float or exp */
NUMBER *epsilon; /* default error for real functions */ NUMBER *epsilon; /* default error for real functions */
long epsilonprec; /* epsilon binary precision (tied to epsilon) */ long epsilonprec; /* epsilon binary precision (tied to epsilon) */
@@ -146,6 +157,10 @@ struct config {
int ctrl_d; /* see CTRL_D_xyz below */ int ctrl_d; /* see CTRL_D_xyz below */
char *program; /* our name */ char *program; /* our name */
char *base_name; /* basename of our name */ char *base_name; /* basename of our name */
BOOL windows; /* TRUE => running under MS windows */
BOOL cygwin; /* TRUE => compiled with cygwin */
BOOL compile_custom; /* TRUE => compiled with -DCUSTOM */
BOOL *allow_custom; /* ptr to if custom functions are allowed */
char *version; /* calc version string */ char *version; /* calc version string */
}; };
typedef struct config CONFIG; typedef struct config CONFIG;
@@ -157,7 +172,8 @@ typedef struct config CONFIG;
#define RSCDBG_STDIN_FUNC (0x00000001) /* interactive func define debug */ #define RSCDBG_STDIN_FUNC (0x00000001) /* interactive func define debug */
#define RSCDBG_FILE_FUNC (0x00000002) /* file read func define debug */ #define RSCDBG_FILE_FUNC (0x00000002) /* file read func define debug */
#define RSCDBG_FUNC_INFO (0x00000004) /* print extra info for show func */ #define RSCDBG_FUNC_INFO (0x00000004) /* print extra info for show func */
#define RSCDBG_MASK (0x00000007) #define RSCDBG_PRINT_DBG (0x00000008) /* print debug messages */
#define RSCDBG_MASK (0x0000000f)
/* /*
@@ -169,7 +185,8 @@ typedef struct config CONFIG;
#define CALCDBG_BLOCK (0x00000008) /* block debug */ #define CALCDBG_BLOCK (0x00000008) /* block debug */
#define CALCDBG_TTY (0x00000010) /* report TTY state changes */ #define CALCDBG_TTY (0x00000010) /* report TTY state changes */
#define CALCDBG_RUNSTATE (0x00000020) /* report run_state changes */ #define CALCDBG_RUNSTATE (0x00000020) /* report run_state changes */
#define CALCDBG_MASK (0x0000003f) #define CALCDBG_RAND (0x00000040) /* report rand() activity */
#define CALCDBG_MASK (0x0000007f)
/* /*
* ctrl-d meanings * ctrl-d meanings
@@ -182,23 +199,23 @@ typedef struct config CONFIG;
/* /*
* global configuration states and aliases * global configuration states and aliases
*/ */
extern CONFIG *conf; /* current configuration */ extern DLL CONFIG *conf; /* current configuration */
extern CONFIG oldstd; /* backward compatible standard configuration */ extern DLL CONFIG oldstd; /* old classic standard configuration */
extern CONFIG newstd; /* new non-backward compatible configuration */ extern DLL CONFIG newstd; /* default compatible configuration */
extern char *calc_debug; /* !=NULL => value of config("calc_debug") */ extern DLL char *calc_debug; /* !=NULL => value of config("calc_debug") */
extern char *resource_debug; /* !=NULL => config("resource_debug") value */ extern DLL char *resource_debug; /* !=NULL => config("resource_debug") value */
extern char *user_debug; /* !=NULL => value of config("user_debug") */ extern DLL char *user_debug; /* !=NULL => value of config("user_debug") */
/* /*
* configuration externals * configuration externals
*/ */
extern CONFIG *config_copy(CONFIG *src); extern DLL CONFIG *config_copy(CONFIG *src);
extern void config_free(CONFIG *cfg); extern DLL void config_free(CONFIG *cfg);
extern void config_print(CONFIG *cfg); extern DLL void config_print(CONFIG *cfg);
extern int configtype(char*); extern DLL int configtype(char*);
extern void config_print(CONFIG*); extern DLL void config_print(CONFIG*);
extern BOOL config_cmp(CONFIG*, CONFIG*); extern DLL BOOL config_cmp(CONFIG*, CONFIG*);
#endif /* !__CONFIG_H__ */ #endif /* !__CONFIG_H__ */

12
const.c
View File

@@ -1,7 +1,7 @@
/* /*
* const - constant number storage module * const - constant number storage module
* *
* Copyright (C) 1999 David I. Bell * Copyright (C) 1999-2004 David I. Bell
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: const.c,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: const.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/const.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/const.c,v $
* *
* Under source code control: 1990/02/15 01:48:14 * Under source code control: 1990/02/15 01:48:14
@@ -34,7 +34,7 @@
#define CONSTALLOCSIZE 400 /* number of constants to allocate */ #define CONSTALLOCSIZE 400 /* number of constants to allocate */
static long constcount; /* number of constants defined */ static unsigned long constcount;/* number of constants defined */
static long constavail; /* number of constants available */ static long constavail; /* number of constants available */
static NUMBER **consttable; /* table of constants */ static NUMBER **consttable; /* table of constants */
@@ -92,7 +92,7 @@ addqconstant(NUMBER *q)
{ {
register NUMBER **tp; /* pointer to current number */ register NUMBER **tp; /* pointer to current number */
register NUMBER *t; /* number being tested */ register NUMBER *t; /* number being tested */
long index; /* index into constant table */ unsigned long index; /* index into constant table */
long numlen; /* numerator length */ long numlen; /* numerator length */
long denlen; /* denominator length */ long denlen; /* denominator length */
HALF numlow; /* bottom value of numerator */ HALF numlow; /* bottom value of numerator */
@@ -221,7 +221,7 @@ trimconstants(void)
void void
showconstants(void) showconstants(void)
{ {
long index; unsigned long index;
NUMBER **qp; NUMBER **qp;
long count; long count;

320
cscript/4dsphere.calc Normal file
View File

@@ -0,0 +1,320 @@
#!/usr/local/src/cmd/calc/calc -q -s -f
/*
* 4dsphere - determine if 6 points lie on the surface of a sphere in R^4
*
* usage:
* 4dsphere x0 y0 z0 w0 x1 y1 z1 w1 ... x5 y5 z5 w5
*
* x0 y0 z0 w0 point 0 in R^4
* x1 y1 z1 w1 point 1 in R^4
* ... ...
* x5 y5 z5 w5 point 5 in R^4
*
* Copyright (C) 2001 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: 1.3 $
* @(#) $Id: 4dsphere.calc,v 1.3 2001/06/06 09:06:29 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/4dsphere.calc,v $
*
* Under source code control: 2001/05/03 19:02:03
* File existed as early as: 2001
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* parse args
*/
argc = argv();
if (argc != 25) {
fprintf(files(2), "usage: %s x0 y0 z0 w0 x1 y1 z1 w1 ... x5 y5 z5 w5\n",
argv(0));
exit;
}
x0 = eval(argv(1));
y0 = eval(argv(2));
z0 = eval(argv(3));
w0 = eval(argv(4));
x1 = eval(argv(5));
y1 = eval(argv(6));
z1 = eval(argv(7));
w1 = eval(argv(8));
x2 = eval(argv(9));
y2 = eval(argv(10));
z2 = eval(argv(11));
w2 = eval(argv(12));
x3 = eval(argv(13));
y3 = eval(argv(14));
z3 = eval(argv(15));
w3 = eval(argv(16));
x4 = eval(argv(17));
y4 = eval(argv(18));
z4 = eval(argv(19));
w4 = eval(argv(20));
x5 = eval(argv(21));
y5 = eval(argv(22));
z5 = eval(argv(23));
w5 = eval(argv(24));
/*
* verbose output setup
*/
print "(":x0:",":y0:",":z0:",":w0:") ":;
print "(":x1:",":y1:",":z1:",":w1:") ":;
print "(":x2:",":y2:",":z2:",":w2:") ":;
print "(":x3:",":y3:",":z3:",":w3:") ":;
print "(":x4:",":y4:",":z4:",":w4:") ":;
print "(":x5:",":y5:",":z5:",":w5:") ":;
/*
*
* Given the 5 points:
*
* (x0,y1,z1,w1)
* (x1,y1,z1,w1)
* (x2,y2,z2,w2)
* (x3,y3,z3,w3)
* (x4,y4,z4,w4)
* (x5,y5,z5,w5)
*
* we can determine if they lie in the surface of 4D sphere in R^4 if the
* following matrix is 0:
*
* | x0^2+y0^2+z0^2+w0^2 x0 y0 z0 w0 1 |
* | x1^2+y1^2+z1^2+w1^2 x1 y1 z1 w1 1 |
* | x2^2+y2^2+z2^2+w2^2 x2 y2 z2 w2 1 | = 0
* | x3^2+y3^2+z3^2+w3^2 x3 y3 z3 w3 1 |
* | x4^2+y4^2+z4^2+w4^2 x4 y4 z4 w4 1 |
* | x5^2+y5^2+z5^2+w5^2 x5 y5 z5 w5 1 |
*/
if ((w0*(-x1*(-y2*(-z4*(z5^2+y5^2+x5^2+w5^2)
-z3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +
(z4^2+y4^2+x4^2+w4^2)*z5+ (z3^2+y3^2+x3^2+w3^2)*(z4-z5))
+y3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z2*(-y4*(z5^2+y5^2+x5^2+w5^2)
-y3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2)
+y5*(z4^2+y4^2+x4^2+w4^2) + (y4-y5)*(z3^2+y3^2+x3^2+w3^2))
-z3*(y5*(z4^2+y4^2+x4^2+w4^2) -y4*(z5^2+y5^2+x5^2+w5^2)) +
(z2^2+y2^2+x2^2+w2^2)*(y4*z5+y3*(z4-z5) -y5*z4- (y4-y5)*z3) -
(z3^2+y3^2+x3^2+w3^2)*(y4*z5-y5*z4)) +y1*(-x2*(-z4*(z5^2+y5^2+x5^2+w5^2)
-z3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +
(z4^2+y4^2+x4^2+w4^2)*z5+ (z3^2+y3^2+x3^2+w3^2)*(z4-z5))
+x3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z2*(-x4*(z5^2+y5^2+x5^2+w5^2)
-x3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +x5*(z4^2+y4^2+x4^2+w4^2)
+ (x4-x5)*(z3^2+y3^2+x3^2+w3^2)) -z3*(x5*(z4^2+y4^2+x4^2+w4^2)
-x4*(z5^2+y5^2+x5^2+w5^2)) + (z2^2+y2^2+x2^2+w2^2)*(x4*z5+x3*(z4-z5)
-x5*z4- (x4-x5)*z3) - (z3^2+y3^2+x3^2+w3^2)*(x4*z5-x5*z4))
-x2*(-y3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z3*(y5*(z4^2+y4^2+x4^2+w4^2) -y4*(z5^2+y5^2+x5^2+w5^2))
+ (z3^2+y3^2+x3^2+w3^2)*(y4*z5-y5*z4))
+y2*(-x3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2)) +
(z3^2+y3^2+x3^2+w3^2)*(x4*z5-x5*z4)) -z1*(-x2*(-y4*(z5^2+y5^2+x5^2+w5^2)
-y3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +y5*(z4^2+y4^2+x4^2+w4^2)
+ (y4-y5)*(z3^2+y3^2+x3^2+w3^2)) +x3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) +y2*(-x4*(z5^2+y5^2+x5^2+w5^2)
-x3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2)
+x5*(z4^2+y4^2+x4^2+w4^2) + (x4-x5)*(z3^2+y3^2+x3^2+w3^2))
-y3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2)) -
(x4*y5-x5*y4)*(z3^2+y3^2+x3^2+w3^2) + (x4*y5+x3*(y4-y5) -x5*y4-
(x4-x5)*y3)*(z2^2+y2^2+x2^2+w2^2)) -z2*(-x3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) +y3*(x5*(z4^2+y4^2+x4^2+w4^2)
-x4*(z5^2+y5^2+x5^2+w5^2)) + (x4*y5-x5*y4)*(z3^2+y3^2+x3^2+w3^2))
+ (z1^2+y1^2+x1^2+w1^2)*(x2*(y4*z5+y3*(z4-z5) -y5*z4-
(y4-y5)*z3) -x3*(y4*z5-y5*z4) -y2*(x4*z5+x3*(z4-z5) -x5*z4-
(x4-x5)*z3) +y3*(x4*z5-x5*z4) - (x4*y5-x5*y4)*z3+
(x4*y5+x3*(y4-y5) -x5*y4- (x4-x5)*y3)*z2) +
(z2^2+y2^2+x2^2+w2^2)*(x3*(y4*z5-y5*z4) -y3*(x4*z5-x5*z4) +
(x4*y5-x5*y4)*z3)) -x0*(-w1*(-y2*(-z4*(z5^2+y5^2+x5^2+w5^2)
-z3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +
(z4^2+y4^2+x4^2+w4^2)*z5+ (z3^2+y3^2+x3^2+w3^2)*(z4-z5))
+y3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z2*(-y4*(z5^2+y5^2+x5^2+w5^2)
-y3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2)
+y5*(z4^2+y4^2+x4^2+w4^2) + (y4-y5)*(z3^2+y3^2+x3^2+w3^2))
-z3*(y5*(z4^2+y4^2+x4^2+w4^2) -y4*(z5^2+y5^2+x5^2+w5^2)) +
(z2^2+y2^2+x2^2+w2^2)*(y4*z5+y3*(z4-z5) -y5*z4- (y4-y5)*z3) -
(z3^2+y3^2+x3^2+w3^2)*(y4*z5-y5*z4)) -y1*(w2*(-z4*(z5^2+y5^2+x5^2+w5^2)
-z3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +
(z4^2+y4^2+x4^2+w4^2)*z5+ (z3^2+y3^2+x3^2+w3^2)*(z4-z5))
-w3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
-z2*(-w4*(z5^2+y5^2+x5^2+w5^2)
-w3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +w5*(z4^2+y4^2+x4^2+w4^2)
+ (w4-w5)*(z3^2+y3^2+x3^2+w3^2)) +z3*(w5*(z4^2+y4^2+x4^2+w4^2)
-w4*(z5^2+y5^2+x5^2+w5^2)) + (z2^2+y2^2+x2^2+w2^2)*(-w4*z5-w3*(z4-z5)
+w5*z4+ (w4-w5)*z3) - (z3^2+y3^2+x3^2+w3^2)*(w5*z4-w4*z5))
-w2*(-y3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z3*(y5*(z4^2+y4^2+x4^2+w4^2) -y4*(z5^2+y5^2+x5^2+w5^2))
+ (z3^2+y3^2+x3^2+w3^2)*(y4*z5-y5*z4))
-y2*(w3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
-z3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) +
(z3^2+y3^2+x3^2+w3^2)*(w5*z4-w4*z5)) +z1*(w2*(-y4*(z5^2+y5^2+x5^2+w5^2)
-y3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +y5*(z4^2+y4^2+x4^2+w4^2)
+ (y4-y5)*(z3^2+y3^2+x3^2+w3^2)) -w3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) -y2*(-w4*(z5^2+y5^2+x5^2+w5^2)
-w3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2)
+w5*(z4^2+y4^2+x4^2+w4^2) + (w4-w5)*(z3^2+y3^2+x3^2+w3^2))
+y3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) -
(w5*y4-w4*y5)*(z3^2+y3^2+x3^2+w3^2) + (-w4*y5-w3*(y4-y5) +w5*y4+
(w4-w5)*y3)*(z2^2+y2^2+x2^2+w2^2)) +z2*(w3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) -y3*(w5*(z4^2+y4^2+x4^2+w4^2)
-w4*(z5^2+y5^2+x5^2+w5^2)) + (w5*y4-w4*y5)*(z3^2+y3^2+x3^2+w3^2))
+ (z1^2+y1^2+x1^2+w1^2)*(w2*(y4*z5+y3*(z4-z5) -y5*z4-
(y4-y5)*z3) -w3*(y4*z5-y5*z4) +y2*(-w4*z5-w3*(z4-z5)
+w5*z4+ (w4-w5)*z3) -y3*(w5*z4-w4*z5) + (w5*y4-w4*y5)*z3-
(-w4*y5-w3*(y4-y5) +w5*y4+ (w4-w5)*y3)*z2) +
(z2^2+y2^2+x2^2+w2^2)*(w3*(y4*z5-y5*z4) +y3*(w5*z4-w4*z5) -
(w5*y4-w4*y5)*z3)) +y0*(-w1*(-x2*(-z4*(z5^2+y5^2+x5^2+w5^2)
-z3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +
(z4^2+y4^2+x4^2+w4^2)*z5+ (z3^2+y3^2+x3^2+w3^2)*(z4-z5))
+x3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z2*(-x4*(z5^2+y5^2+x5^2+w5^2)
-x3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2)
+x5*(z4^2+y4^2+x4^2+w4^2) + (x4-x5)*(z3^2+y3^2+x3^2+w3^2))
-z3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2)) +
(z2^2+y2^2+x2^2+w2^2)*(x4*z5+x3*(z4-z5) -x5*z4- (x4-x5)*z3) -
(z3^2+y3^2+x3^2+w3^2)*(x4*z5-x5*z4)) -x1*(w2*(-z4*(z5^2+y5^2+x5^2+w5^2)
-z3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +
(z4^2+y4^2+x4^2+w4^2)*z5+ (z3^2+y3^2+x3^2+w3^2)*(z4-z5))
-w3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
-z2*(-w4*(z5^2+y5^2+x5^2+w5^2)
-w3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +w5*(z4^2+y4^2+x4^2+w4^2)
+ (w4-w5)*(z3^2+y3^2+x3^2+w3^2)) +z3*(w5*(z4^2+y4^2+x4^2+w4^2)
-w4*(z5^2+y5^2+x5^2+w5^2)) + (z2^2+y2^2+x2^2+w2^2)*(-w4*z5-w3*(z4-z5)
+w5*z4+ (w4-w5)*z3) - (z3^2+y3^2+x3^2+w3^2)*(w5*z4-w4*z5))
-w2*(-x3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2))
+ (z3^2+y3^2+x3^2+w3^2)*(x4*z5-x5*z4))
-x2*(w3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
-z3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) +
(z3^2+y3^2+x3^2+w3^2)*(w5*z4-w4*z5)) +z1*(w2*(-x4*(z5^2+y5^2+x5^2+w5^2)
-x3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +x5*(z4^2+y4^2+x4^2+w4^2)
+ (x4-x5)*(z3^2+y3^2+x3^2+w3^2)) -w3*(x5*(z4^2+y4^2+x4^2+w4^2)
-x4*(z5^2+y5^2+x5^2+w5^2)) -x2*(-w4*(z5^2+y5^2+x5^2+w5^2)
-w3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2)
+w5*(z4^2+y4^2+x4^2+w4^2) + (w4-w5)*(z3^2+y3^2+x3^2+w3^2))
+x3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) -
(w5*x4-w4*x5)*(z3^2+y3^2+x3^2+w3^2) + (-w4*x5-w3*(x4-x5) +w5*x4+
(w4-w5)*x3)*(z2^2+y2^2+x2^2+w2^2)) +z2*(w3*(x5*(z4^2+y4^2+x4^2+w4^2)
-x4*(z5^2+y5^2+x5^2+w5^2)) -x3*(w5*(z4^2+y4^2+x4^2+w4^2)
-w4*(z5^2+y5^2+x5^2+w5^2)) + (w5*x4-w4*x5)*(z3^2+y3^2+x3^2+w3^2)) +
(z1^2+y1^2+x1^2+w1^2)*(w2*(x4*z5+x3*(z4-z5) -x5*z4- (x4-x5)*z3)
-w3*(x4*z5-x5*z4) +x2*(-w4*z5-w3*(z4-z5) +w5*z4+ (w4-w5)*z3)
-x3*(w5*z4-w4*z5) + (w5*x4-w4*x5)*z3- (-w4*x5-w3*(x4-x5) +w5*x4+
(w4-w5)*x3)*z2) + (z2^2+y2^2+x2^2+w2^2)*(w3*(x4*z5-x5*z4)
+x3*(w5*z4-w4*z5) - (w5*x4-w4*x5)*z3))
-w1*(-x2*(-y3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z3*(y5*(z4^2+y4^2+x4^2+w4^2) -y4*(z5^2+y5^2+x5^2+w5^2))
+ (z3^2+y3^2+x3^2+w3^2)*(y4*z5-y5*z4))
+y2*(-x3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2)) +
(z3^2+y3^2+x3^2+w3^2)*(x4*z5-x5*z4)) -z2*(-x3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) +y3*(x5*(z4^2+y4^2+x4^2+w4^2)
-x4*(z5^2+y5^2+x5^2+w5^2)) + (x4*y5-x5*y4)*(z3^2+y3^2+x3^2+w3^2))
+ (z2^2+y2^2+x2^2+w2^2)*(x3*(y4*z5-y5*z4)
-y3*(x4*z5-x5*z4) + (x4*y5-x5*y4)*z3))
+x1*(-w2*(-y3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z3*(y5*(z4^2+y4^2+x4^2+w4^2) -y4*(z5^2+y5^2+x5^2+w5^2))
+ (z3^2+y3^2+x3^2+w3^2)*(y4*z5-y5*z4))
-y2*(w3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
-z3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) +
(z3^2+y3^2+x3^2+w3^2)*(w5*z4-w4*z5)) +z2*(w3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) -y3*(w5*(z4^2+y4^2+x4^2+w4^2)
-w4*(z5^2+y5^2+x5^2+w5^2)) + (w5*y4-w4*y5)*(z3^2+y3^2+x3^2+w3^2))
+ (z2^2+y2^2+x2^2+w2^2)*(w3*(y4*z5-y5*z4)
+y3*(w5*z4-w4*z5) - (w5*y4-w4*y5)*z3))
-y1*(-w2*(-x3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
+z3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2))
+ (z3^2+y3^2+x3^2+w3^2)*(x4*z5-x5*z4))
-x2*(w3*((z4^2+y4^2+x4^2+w4^2)*z5-z4*(z5^2+y5^2+x5^2+w5^2))
-z3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) +
(z3^2+y3^2+x3^2+w3^2)*(w5*z4-w4*z5)) +z2*(w3*(x5*(z4^2+y4^2+x4^2+w4^2)
-x4*(z5^2+y5^2+x5^2+w5^2)) -x3*(w5*(z4^2+y4^2+x4^2+w4^2)
-w4*(z5^2+y5^2+x5^2+w5^2)) + (w5*x4-w4*x5)*(z3^2+y3^2+x3^2+w3^2))
+ (z2^2+y2^2+x2^2+w2^2)*(w3*(x4*z5-x5*z4) +x3*(w5*z4-w4*z5)
- (w5*x4-w4*x5)*z3)) -z0*(-w1*(-x2*(-y4*(z5^2+y5^2+x5^2+w5^2)
-y3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +y5*(z4^2+y4^2+x4^2+w4^2)
+ (y4-y5)*(z3^2+y3^2+x3^2+w3^2)) +x3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) +y2*(-x4*(z5^2+y5^2+x5^2+w5^2)
-x3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2)
+x5*(z4^2+y4^2+x4^2+w4^2) + (x4-x5)*(z3^2+y3^2+x3^2+w3^2))
-y3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2)) -
(x4*y5-x5*y4)*(z3^2+y3^2+x3^2+w3^2) + (x4*y5+x3*(y4-y5) -x5*y4-
(x4-x5)*y3)*(z2^2+y2^2+x2^2+w2^2)) -x1*(w2*(-y4*(z5^2+y5^2+x5^2+w5^2)
-y3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +y5*(z4^2+y4^2+x4^2+w4^2)
+ (y4-y5)*(z3^2+y3^2+x3^2+w3^2)) -w3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) -y2*(-w4*(z5^2+y5^2+x5^2+w5^2)
-w3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2)
+w5*(z4^2+y4^2+x4^2+w4^2) + (w4-w5)*(z3^2+y3^2+x3^2+w3^2))
+y3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) -
(w5*y4-w4*y5)*(z3^2+y3^2+x3^2+w3^2) + (-w4*y5-w3*(y4-y5) +w5*y4+
(w4-w5)*y3)*(z2^2+y2^2+x2^2+w2^2)) -w2*(-x3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) +y3*(x5*(z4^2+y4^2+x4^2+w4^2)
-x4*(z5^2+y5^2+x5^2+w5^2)) + (x4*y5-x5*y4)*(z3^2+y3^2+x3^2+w3^2))
-x2*(w3*(y5*(z4^2+y4^2+x4^2+w4^2) -y4*(z5^2+y5^2+x5^2+w5^2))
-y3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) +
(w5*y4-w4*y5)*(z3^2+y3^2+x3^2+w3^2)) +y1*(w2*(-x4*(z5^2+y5^2+x5^2+w5^2)
-x3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +x5*(z4^2+y4^2+x4^2+w4^2)
+ (x4-x5)*(z3^2+y3^2+x3^2+w3^2)) -w3*(x5*(z4^2+y4^2+x4^2+w4^2)
-x4*(z5^2+y5^2+x5^2+w5^2)) -x2*(-w4*(z5^2+y5^2+x5^2+w5^2)
-w3*(-z5^2+z4^2-y5^2+y4^2-x5^2+x4^2-w5^2+w4^2) +w5*(z4^2+y4^2+x4^2+w4^2)
+ (w4-w5)*(z3^2+y3^2+x3^2+w3^2)) +x3*(w5*(z4^2+y4^2+x4^2+w4^2)
-w4*(z5^2+y5^2+x5^2+w5^2)) - (w5*x4-w4*x5)*(z3^2+y3^2+x3^2+w3^2)
+ (-w4*x5-w3*(x4-x5) +w5*x4+ (w4-w5)*x3)*(z2^2+y2^2+x2^2+w2^2))
+y2*(w3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2))
-x3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) +
(w5*x4-w4*x5)*(z3^2+y3^2+x3^2+w3^2)) + (w3*(x4*y5-x5*y4) +x3*(w5*y4-w4*y5)
- (w5*x4-w4*x5)*y3)*(z2^2+y2^2+x2^2+w2^2) + (w2*(x4*y5+x3*(y4-y5)
-x5*y4- (x4-x5)*y3) -w3*(x4*y5-x5*y4) +x2*(-w4*y5-w3*(y4-y5)
+w5*y4+ (w4-w5)*y3) -x3*(w5*y4-w4*y5) + (w5*x4-w4*x5)*y3-
(-w4*x5-w3*(x4-x5) +w5*x4+ (w4-w5)*x3)*y2)*(z1^2+y1^2+x1^2+w1^2))
+z1*(-w2*(-x3*(y5*(z4^2+y4^2+x4^2+w4^2) -y4*(z5^2+y5^2+x5^2+w5^2))
+y3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2)) +
(x4*y5-x5*y4)*(z3^2+y3^2+x3^2+w3^2)) -x2*(w3*(y5*(z4^2+y4^2+x4^2+w4^2)
-y4*(z5^2+y5^2+x5^2+w5^2)) -y3*(w5*(z4^2+y4^2+x4^2+w4^2)
-w4*(z5^2+y5^2+x5^2+w5^2)) + (w5*y4-w4*y5)*(z3^2+y3^2+x3^2+w3^2))
+y2*(w3*(x5*(z4^2+y4^2+x4^2+w4^2) -x4*(z5^2+y5^2+x5^2+w5^2))
-x3*(w5*(z4^2+y4^2+x4^2+w4^2) -w4*(z5^2+y5^2+x5^2+w5^2)) +
(w5*x4-w4*x5)*(z3^2+y3^2+x3^2+w3^2)) + (w3*(x4*y5-x5*y4)
+x3*(w5*y4-w4*y5) - (w5*x4-w4*x5)*y3)*(z2^2+y2^2+x2^2+w2^2)) +
(z0^2+y0^2+x0^2+w0^2)*(-w1*(x2*(y4*z5+y3*(z4-z5) -y5*z4- (y4-y5)*z3)
-x3*(y4*z5-y5*z4) -y2*(x4*z5+x3*(z4-z5) -x5*z4- (x4-x5)*z3)
+y3*(x4*z5-x5*z4) - (x4*y5-x5*y4)*z3+ (x4*y5+x3*(y4-y5) -x5*y4-
(x4-x5)*y3)*z2) +x1*(w2*(y4*z5+y3*(z4-z5) -y5*z4- (y4-y5)*z3)
-w3*(y4*z5-y5*z4) +y2*(-w4*z5-w3*(z4-z5) +w5*z4+ (w4-w5)*z3)
-y3*(w5*z4-w4*z5) + (w5*y4-w4*y5)*z3- (-w4*y5-w3*(y4-y5) +w5*y4+
(w4-w5)*y3)*z2) -w2*(x3*(y4*z5-y5*z4) -y3*(x4*z5-x5*z4) +
(x4*y5-x5*y4)*z3) +x2*(w3*(y4*z5-y5*z4) +y3*(w5*z4-w4*z5) -
(w5*y4-w4*y5)*z3) -y1*(w2*(x4*z5+x3*(z4-z5) -x5*z4- (x4-x5)*z3)
-w3*(x4*z5-x5*z4) +x2*(-w4*z5-w3*(z4-z5) +w5*z4+ (w4-w5)*z3)
-x3*(w5*z4-w4*z5) + (w5*x4-w4*x5)*z3- (-w4*x5-w3*(x4-x5) +w5*x4+
(w4-w5)*x3)*z2) -y2*(w3*(x4*z5-x5*z4) +x3*(w5*z4-w4*z5) -
(w5*x4-w4*x5)*z3) + (w3*(x4*y5-x5*y4) +x3*(w5*y4-w4*y5) -
(w5*x4-w4*x5)*y3)*z2+ (w2*(x4*y5+x3*(y4-y5) -x5*y4- (x4-x5)*y3)
-w3*(x4*y5-x5*y4) +x2*(-w4*y5-w3*(y4-y5) +w5*y4+ (w4-w5)*y3)
-x3*(w5*y4-w4*y5) + (w5*x4-w4*x5)*y3- (-w4*x5-w3*(x4-x5) +w5*x4+
(w4-w5)*x3)*y2)*z1) - (z1^2+y1^2+x1^2+w1^2)*(-w2*(x3*(y4*z5-y5*z4)
-y3*(x4*z5-x5*z4) + (x4*y5-x5*y4)*z3) +x2*(w3*(y4*z5-y5*z4)
+y3*(w5*z4-w4*z5) - (w5*y4-w4*y5)*z3) -y2*(w3*(x4*z5-x5*z4)
+x3*(w5*z4-w4*z5) - (w5*x4-w4*x5)*z3) + (w3*(x4*y5-x5*y4)
+x3*(w5*y4-w4*y5) - (w5*x4-w4*x5)*y3)*z2)) == 0) {
print "are in the surface of a 4D sphere";
} else {
print "are NOT on a 4D sphere surface";
}

View File

@@ -17,8 +17,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.6 $ # @(#) $Revision: 29.23 $
# @(#) $Id: Makefile,v 29.6 2000/12/15 14:56:14 chongo Exp $ # @(#) $Id: Makefile,v 29.23 2003/01/14 01:58:18 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/Makefile,v $
# #
# Under source code control: 1999/11/29 11:10:26 # Under source code control: 1999/11/29 11:10:26
@@ -36,15 +36,121 @@
SHELL= /bin/sh SHELL= /bin/sh
MAKE_FILE = Makefile MAKE_FILE = Makefile
####
# Normally, the upper level makefile will set these values. We provide # Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory. # a default here just in case you want to build from this directory.
####
# Where the system include (.h) files are kept
# #
BINDIR= /usr/local/bin # For DJGPP, select:
#BINDIR= /usr/bin
#BINDIR= /usr/contrib/bin
# #
# INCDIR= /dev/env/DJDIR/include
#
# If in doubt, set:
#
# INCDIR= /usr/include
#
#INCDIR= /usr/local/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# where to install calc realted things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
# ${CALC_SHAREDIR} where to install calc help, .cal, startup, config files
#
# NOTE: The install rule prepends installation paths with $T, which
# by default is empty. If $T is non-empty, then installation
# locations will be relative to the $T directory.
#
# For DJGPP, select:
#
# BINDIR= /dev/env/DJDIR/bin
# LIBDIR= /dev/env/DJDIR/lib
# CALC_SHAREDIR= /dev/env/DJDIR/share/calc
#
# If in doubt, set:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= /usr/local/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= /usr/local/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= /usr/local/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
# By default, these values are based CALC_SHAREDIR, INCDIR, BINDIR
# ---------------------------------------------------------------
# ${HELPDIR} where the help directory is installed
# ${CALC_INCDIR} where the calc include files are installed
# ${CUSTOMCALDIR} where custom *.cal files are installed
# ${CUSTOMHELPDIR} where custom help files are installed
# ${CUSTOMINCPDIR} where custom .h files are installed
# ${SCRIPTDIR} where calc shell scripts are installed
#
# NOTE: The install rule prepends installation paths with $T, which
# by default is empty. If $T is non-empty, then installation
# locations will be relative to the $T directory.
#
# If in doubt, set:
#
# HELPDIR= ${CALC_SHAREDIR}/help
# CALC_INCDIR= ${INCDIR}/calc
# CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
# CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
# CUSTOMINCDIR= ${CALC_INCDIR}/custom
# SCRIPTDIR= ${BINDIR}/cscript
#
HELPDIR= ${CALC_SHAREDIR}/help
CALC_INCDIR= ${INCDIR}/calc
CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
CUSTOMINCDIR= ${CALC_INCDIR}/custom
SCRIPTDIR= ${BINDIR}/cscript SCRIPTDIR= ${BINDIR}/cscript
# T - top level directory under which calc will be installed
#
# The calc install is performed under $T, the calc build is
# performed under /. The purpose for $T is to allow someone
# to install calc somewhere other than into the system area.
#
# For example, if:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
# and if:
#
# T= /var/tmp/testing
#
# Then the installation locations will be:
#
# calc binary files: /var/tmp/testing/usr/bin
# calc link library: /var/tmp/testing/usr/lib
# calc help, .cal ...: /var/tmp/testing/usr/share/calc
# ... etc ... /var/tmp/testing/...
#
# If $T is empty, calc is installed under /, which is the same
# top of tree for which it was built. If $T is non-empty, then
# calc is installed under $T, as if one had to chroot under
# $T for calc to operate.
#
# If in doubt, use T=
#
T=
# Makefile debug # Makefile debug
# #
# Q=@ do not echo internal makefile actions (quiet mode) # Q=@ do not echo internal makefile actions (quiet mode)
@@ -59,6 +165,7 @@ CHMOD= chmod
SED= sed SED= sed
SORT= sort SORT= sort
FMT= fmt FMT= fmt
CMP= cmp
# The ${SCRIPT} list is the list of calc shell script files (without the .calc # The ${SCRIPT} list is the list of calc shell script files (without the .calc
# extension) which will be installed. # extension) which will be installed.
@@ -76,9 +183,11 @@ FMT= fmt
# #
# make detaillist # make detaillist
# #
SCRIPT= mersenne piforever plus simple square SCRIPT= 4dsphere fproduct mersenne piforever plus powerterm \
simple square
SCRIPT_SRC= mersenne.calc piforever.calc plus.calc simple.calc square.calc SCRIPT_SRC= 4dsphere.calc fproduct.calc mersenne.calc \
piforever.calc plus.calc powerterm.calc simple.calc square.calc
# These files are found (but not built) in the distribution # These files are found (but not built) in the distribution
# #
@@ -88,9 +197,17 @@ DISTLIST= ${SCRIPT_SRC} ${MAKE_FILE} README
# #
CALCLIBLIST= CALCLIBLIST=
# complete list of targets
#
# NOTE: This list MUST be co-ordinated with the ${CSCRIPT_TARGETS} variable
# in the upper level ../Makefile
#
CSCRIPT_TARGETS= ${SCRIPT}
TARGETS= ${CSCRIPT_TARGETS}
# The reason for this Makefile # The reason for this Makefile
# #
all: ${SCRIPT} ${SCRIPT_SRC} .all all: ${TARGETS} .all
# used by the upper level Makefile to determine if we have done all # used by the upper level Makefile to determine if we have done all
# #
@@ -112,9 +229,11 @@ all: ${SCRIPT} ${SCRIPT_SRC} .all
## ##
distlist: ${DISTLIST} distlist: ${DISTLIST}
${Q}for i in ${DISTLIST}; do \ ${Q}for i in ${DISTLIST} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo cscript/$$i; \ echo cscript/$$i; \
done | ${SORT} fi; \
done | LANG=C ${SORT}
distdir: distdir:
${Q}echo cscript ${Q}echo cscript
@@ -125,24 +244,28 @@ calcliblist:
# #
detaillist: detaillist:
${Q}-(echo "xxxxxxx"; \ ${Q}-(echo "xxxxxxx"; \
for i in ${SCRIPT}; do \ for i in ${SCRIPT} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
if [ ! -f RCS/$$i.calc,v ]; then \ if [ ! -f RCS/$$i.calc,v ]; then \
echo "WARNING: $$i.calc not under RCS control" 1>&2; \ echo "WARNING: $$i.calc not under RCS control" 1>&2; \
else \ else \
echo $$i; \ echo $$i; \
fi; \ fi; \
done | ${SORT}) | ${FMT} -70 | \ fi; \
done | LANG=C ${SORT}) | ${FMT} -70 | \
${SED} -e '1s/xxxxxxx/SCRIPT=/' -e '2,$$s/^/ /' \ ${SED} -e '1s/xxxxxxx/SCRIPT=/' -e '2,$$s/^/ /' \
-e 's/$$/ \\/' -e '$$s/ \\$$//' -e 's/$$/ \\/' -e '$$s/ \\$$//'
${Q}echo ${Q}echo
${Q}-(echo "xxxxxxxxxxx"; \ ${Q}-(echo "xxxxxxxxxxx"; \
for i in ${SCRIPT}; do \ for i in ${SCRIPT} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
if [ ! -f RCS/$$i.calc,v ]; then \ if [ ! -f RCS/$$i.calc,v ]; then \
echo "WARNING: $$i.calc not under RCS control" 1>&2; \ echo "WARNING: $$i.calc not under RCS control" 1>&2; \
else \ else \
echo $$i.calc; \ echo $$i.calc; \
fi; \ fi; \
done | ${SORT}) | ${FMT} -70 | \ fi; \
done | LANG=C ${SORT}) | ${FMT} -70 | \
${SED} -e '1s/xxxxxxxxxxx/SCRIPT_SRC=/' -e '2,$$s/^/ /' \ ${SED} -e '1s/xxxxxxxxxxx/SCRIPT_SRC=/' -e '2,$$s/^/ /' \
-e 's/$$/ \\/' -e '$$s/ \\$$//' -e 's/$$/ \\/' -e '$$s/ \\$$//'
@@ -170,11 +293,13 @@ depend:
${Q}echo "# DO NOT DELETE THIS LINE -- make depend depends on it." > \ ${Q}echo "# DO NOT DELETE THIS LINE -- make depend depends on it." > \
makedep.out makedep.out
${Q}echo "" >> makedep.out ${Q}echo "" >> makedep.out
${Q}for i in ${SCRIPT}; do \ ${Q}for i in ${SCRIPT} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo "$$i: $$i.calc"; \ echo "$$i: $$i.calc"; \
echo ' rm -f $$@'; \ echo ' @rm -f $$@'; \
echo ' $${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!$${BINDIR}/calc:" $$?>$$@'; \ echo ' @$${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!$${BINDIR}/calc:" $$?>$$@'; \
echo ' $${CHMOD} +x $$@'; \ echo ' @$${CHMOD} +x $$@'; \
fi; \
done >> makedep.out done >> makedep.out
${Q}echo sample dependency list formed ${Q}echo sample dependency list formed
${Q}echo forming new cscript/Makefile ${Q}echo forming new cscript/Makefile
@@ -184,7 +309,7 @@ depend:
${Q}echo "" >> Makefile ${Q}echo "" >> Makefile
${Q}${SED} -n '3,$$p' makedep.out >> Makefile ${Q}${SED} -n '3,$$p' makedep.out >> Makefile
-${Q}rm -f makedep.out -${Q}rm -f makedep.out
-${Q}if cmp -s Makefile.bak Makefile; then \ -${Q}if ${CMP} -s Makefile.bak Makefile; then \
echo 'sample Makefile was already up to date'; \ echo 'sample Makefile was already up to date'; \
mv -f Makefile.bak Makefile; \ mv -f Makefile.bak Makefile; \
else \ else \
@@ -199,53 +324,102 @@ depend:
fi; \ fi; \
fi fi
##
#
# rpm rules
#
##
echo_inst_files:
${Q}for i in ${SCRIPT} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo __file__ ${SCRIPTDIR}/$$i; \
fi; \
done
##
#
# Utility rules
#
##
clean: clean:
-rm -f makedep.out -rm -f makedep.out
clobber: clobber:
-rm -f ${SCRIPT} -rm -f ${TARGETS}
install: all install: all
-${Q}if [ ! -d ${BINDIR} ]; then \ -${Q}if [ ! -d $T${BINDIR} ]; then \
echo mkdir ${BINDIR}; \ echo mkdir $T${BINDIR}; \
mkdir ${BINDIR}; \ mkdir $T${BINDIR}; \
if [ ! -d "$T${BINDIR}" ]; then \
echo mkdir -p "$T${BINDIR}"; \
mkdir -p "$T${BINDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${BINDIR}; \
${CHMOD} 0755 $T${BINDIR}; \
else \ else \
true; \ true; \
fi fi
-${Q}if [ ! -d ${SCRIPTDIR} ]; then \ -${Q}if [ ! -d $T${SCRIPTDIR} ]; then \
echo mkdir ${SCRIPTDIR}; \ echo mkdir $T${SCRIPTDIR}; \
mkdir ${SCRIPTDIR}; \ mkdir $T${SCRIPTDIR}; \
if [ ! -d "$T${SCRIPTDIR}" ]; then \
echo mkdir -p "$T${SCRIPTDIR}"; \
mkdir -p "$T${SCRIPTDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${SCRIPTDIR}; \
${CHMOD} 0755 $T${SCRIPTDIR}; \
else \ else \
true; \ true; \
fi fi
${Q}for i in ${SCRIPT}; do \ ${Q}for i in ${SCRIPT} /dev/null; do \
echo rm -f ${SCRIPTDIR}/$$i; \ if [ "$$i" = "/dev/null" ]; then \
rm -f ${SCRIPTDIR}/$$i; \ continue; \
echo cp $$i ${SCRIPTDIR}; \ fi; \
cp $$i ${SCRIPTDIR}; \ if ${CMP} -s $$i $T${SCRIPTDIR}/$$i; then \
echo ${CHMOD} 0555 ${SCRIPTDIR}/$$i; \ true; \
${CHMOD} 0555 ${SCRIPTDIR}/$$i; \ else \
rm -f $T${SCRIPTDIR}/$$i.new; \
cp -f $$i $T${SCRIPTDIR}/$$i.new; \
${CHMOD} 0555 $T${SCRIPTDIR}/$$i.new; \
mv -f $T${SCRIPTDIR}/$$i.new $T${SCRIPTDIR}/$$i; \
echo "installed $T${SCRIPTDIR}/$$i"; \
fi; \
done done
# DO NOT DELETE THIS LINE -- make depend depends on it. # DO NOT DELETE THIS LINE -- make depend depends on it.
4dsphere: 4dsphere.calc
@rm -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@
fproduct: fproduct.calc
@rm -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@
mersenne: mersenne.calc mersenne: mersenne.calc
rm -f $@ @rm -f $@
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
${CHMOD} +x $@ @${CHMOD} +x $@
piforever: piforever.calc piforever: piforever.calc
rm -f $@ @rm -f $@
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
${CHMOD} +x $@ @${CHMOD} +x $@
plus: plus.calc plus: plus.calc
rm -f $@ @rm -f $@
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
${CHMOD} +x $@ @${CHMOD} +x $@
powerterm: powerterm.calc
@rm -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@
simple: simple.calc simple: simple.calc
rm -f $@ @rm -f $@
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
${CHMOD} +x $@ @${CHMOD} +x $@
square: square.calc square: square.calc
rm -f $@ @rm -f $@
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
${CHMOD} +x $@ @${CHMOD} +x $@

View File

@@ -19,6 +19,23 @@ For more info, see:
=-= =-=
4dsphere
Determine if 6 points lie on the surface of a 4-dimensional sphere in R^4.
4dsphere x0 y0 z0 w0 x1 y1 z1 w1 ... x5 y5 z5 w5
x0 y0 z0 w0 point 0 in R^4
x1 y1 z1 w1 point 1 in R^4
... ...
x5 y5 z5 w5 point 5 in R^4
fproduct filename term ...
Write the big Endian product of terms to a file. Use - for stdout.
mersenne exp mersenne exp
Print the value of 2^exp-1. Print the value of 2^exp-1.
@@ -34,6 +51,12 @@ plus arg ...
Print the sum of 1 or more arguments. Print the sum of 1 or more arguments.
powerterm [base_limit] value
Print the value as a sum (or difference) of powers of integers up
to and including powers <= base_limit. By default, base_limit is 10000.
simple simple
A trivial example of a calc shell script. A trivial example of a calc shell script.
@@ -54,8 +77,8 @@ simple
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.4 $ ## @(#) $Revision: 29.10 $
## @(#) $Id: README,v 29.4 2000/06/07 14:02:59 chongo Exp $ ## @(#) $Id: README,v 29.10 2001/06/10 19:34:40 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/README,v $ ## @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/README,v $
## ##
## Under source code control: 1999/12/17 10:23:40 ## Under source code control: 1999/12/17 10:23:40

88
cscript/fproduct.calc Normal file
View File

@@ -0,0 +1,88 @@
#!/usr/local/src/cmd/calc/calc -q -s -f
/*
* fproduct - write the big Endian product of terms to a file
*
* usage:
* fproduct filename term [term ...]
*
* filename where to write the product, use - for stdout
* term ... terms to multiply
*
* Copyright (C) 2001 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: fproduct.calc,v 29.2 2001/06/06 09:06:29 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/fproduct.calc,v $
*
* Under source code control: 2001/04/07 20:13:11
* File existed as early as: 2001
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* parse args
*/
argc = argv();
if (argc < 2) {
fprintf(files(2), "usage: %s term [term ...]\n", argv(0));
exit;
}
filename = argv(1);
/*
* build the product
*/
product = 1;
for (i=2; i < argc; ++i) {
product *= eval(argv(i));
}
product = abs(product);
/*
* open the file for writing, "-" is stdout
*/
if (filename == "-") {
fd = files(1);
} else {
fd = fopen(filename, "w");
if (!isfile(fd)) quit "be2file: cannot open file for writing";
}
/*
* write the octets to the file
*
* The most significant bits of the integer become the first file octets.
*/
if (product > 0) {
octlen = int((highbit(product)+8) / 8);
for (i=octlen-1; i >= 0; --i) {
fputc(fd, char(product >> (i*8)));
}
}
/*
* cleanup
*/
if (filename != "-") {
fclose(fd);
}

185
cscript/powerterm.calc Normal file
View File

@@ -0,0 +1,185 @@
#!/usr/local/src/cmd/calc/calc -q -s -f
/*
* powerterm - print the argument as a sum of powers of integers
*
* usage:
* powerterm [base_limit] value
*
* base_limit largest base we will consider (def: 10000)
* value value to convert into sums of powers of integers
*
* Copyright (C) 2001 Landon Curt Noll
*
* Calc is open software; you can redistribute it and/or modify it under
* the powerterm 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.6 $
* @(#) $Id: powerterm.calc,v 29.6 2001/06/06 09:06:29 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/powerterm.calc,v $
*
* Under source code control: 2001/04/24 23:49:11
* File existed as early as: 2001
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* parse args
*/
config("verbose_quit", 0),;
base_lim = 10000; /* default: highest base we will consider */
if (argv() < 2 || argv() > 3) {
fprintf(files(2), "usage: %s [base_limit] value\n", argv(0));
exit;
}
if (argv() == 3) {
x = eval(argv(2));
base_lim = eval(argv(1));
} else {
x = eval(argv(1));
}
if (! isint(x)) {
fprintf(files(2), "%s: value must be an integer\n");
exit;
}
if (! isint(base_lim)) {
fprintf(files(2), "%s: base limit must be an integer\n");
exit;
}
if (base_lim <= 1) {
fprintf(files(2), "%s: base limit is too small\n");
exit;
}
++base_lim;
/*
* setup loop variables
*/
term = 0; /* number of powerterm found */
/*
* log constants
*/
if (base_lim <= 2^20+1) { /* 2^20 requires ~96 Megs of memory */
mat lni[base_lim]; /* log of integers */
for (i=2; i < base_lim; ++i) {
lni[i] = ln(i);
}
have_lni = 1; /* have lni[x] array */
} else {
mat lni[1]; /* not used */
have_lni = 0; /* base_lim too large for array */
}
/*
* remove nestest powers
*/
while (abs(x) >= base_lim) {
/*
* look for the nearest power
*/
lnx = ln(abs(x)); /* log of the remaining co-factor */
closest = 0.5;
base = 1;
exponent = 0;
if (have_lni) {
/*
* use pre-calculated log array when looking for the nearest power
*/
for (i = 2; i < base_lim; ++i) {
/*
* determine exponent closeness to an integer
*/
ex = lnx / lni[i];
power = int(ex + 0.5);
diff = ex - power;
/*
* look for a closer power
*/
if (abs(diff) < closest) {
closest = abs(diff);
base = i;
exponent = power;
}
}
} else {
/*
* re-calculate logs when looking for the nearest power
*/
for (i = 2; i < base_lim; ++i) {
/*
* determine exponent closeness to an integer
*/
ex = lnx / ln(i);
power = int(ex + 0.5);
diff = ex - power;
/*
* look for a closer power
*/
if (abs(diff) < closest) {
closest = abs(diff);
base = i;
exponent = power;
}
}
}
/*
* output current term and then subtract it
*/
if (x != 0) {
if (x < 0) {
print "-",;
} else if (term > 0) {
print "+",;
}
if (exponent > 1) {
print base: "^": exponent,;
} else {
print base,;
}
}
/*
* subtract (or add) this near power
*/
if (x < 0) {
x = x + base^exponent;
} else {
x = x - base^exponent;
}
++term;
}
/*
* print the final term
*/
if (x < 0) {
print "-", -x;
} else if (x > 0) {
print "+", x;
} else {
print "";
}
exit;

View File

@@ -2,7 +2,7 @@
# #
# sqaure - print the squares of input values # sqaure - print the squares of input values
# #
# Copyright (C) 2000 Landon Curt Noll # Copyright (C) 2000 Ernest Bowen
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.1 $ # @(#) $Revision: 29.3 $
# @(#) $Id: square.calc,v 29.1 2000/12/15 14:55:59 chongo Exp $ # @(#) $Id: square.calc,v 29.3 2000/12/17 14:31:58 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/square.calc,v $ # @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/square.calc,v $
# #
# Under source code control: 2000/12/15 06:52:01 # Under source code control: 2000/12/15 06:52:01
@@ -27,8 +27,38 @@
# #
# Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/ # Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
# usage: # Usage:
# mersenne exp #
# From the shell:
#
# ./square
# cat file | ./square
# echo "123" | ./square
#
# Within calc:
#
# > read square
#
# With input from a terminal, there is no prompt but each non-empty
# line of input is evaluated as a calc expression and if it can be
# calculated, the square of the value of that expression is displayed.
# Execution stops when an empty line is input.
#
# From the shell:
#
# ./square
#
# The following shows lines of input followed by output:
#
# 1234
# 1522756
# ln(2)
# ~.48045301391820142467
# config("mode","frac"), bernoulli(10)
# 25/4356
# config("mode", "hex"), 0xff
# 0xfe01
#
global s; global s;
while ((s = prompt(""))) while ((s = prompt("")))

View File

@@ -17,9 +17,9 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: custom.c,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: custom.c,v 29.4 2004/02/25 23:54:40 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/custom.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/../RCS/custom.c,v $
* *
* Under source code control: 1997/03/03 04:53:08 * Under source code control: 1997/03/03 04:53:08
* File existed as early as: 1997 * File existed as early as: 1997
@@ -34,11 +34,10 @@
#include "value.h" #include "value.h"
#include "custom.h" #include "custom.h"
#include <stdio.h>
#if defined(CUSTOM) #if defined(CUSTOM)
#include <stdio.h>
#include "calc.h" #include "calc.h"
#include "have_string.h" #include "have_string.h"
@@ -52,7 +51,7 @@
#endif /* CUSTOM */ #endif /* CUSTOM */
int allow_custom = FALSE; /* TRUE => custom builtins allowed */ BOOL allow_custom = FALSE; /* TRUE => custom builtins allowed */
/* /*

View File

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

View File

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

View File

@@ -2,7 +2,7 @@
# #
# custom - makefile for calc custom routines # custom - makefile for calc custom routines
# #
# Copyright (C) 1999 Landon Curt Noll # Copyright (C) 1999,2004 Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.3 $ # @(#) $Revision: 29.24 $
# @(#) $Id: Makefile,v 29.3 2000/12/17 12:28:15 chongo Exp $ # @(#) $Id: Makefile,v 29.24 2004/07/29 08:38:18 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/Makefile,v $
# #
# Under source code control: 1997/03/09 02:28:54 # Under source code control: 1997/03/09 02:28:54
@@ -40,13 +40,13 @@
# #
# Put your custom calc resource files here. # Put your custom calc resource files here.
# #
CUSTOM_CALC_FILES= argv.cal halflen.cal pzasusb8.cal CUSTOM_CALC_FILES= argv.cal halflen.cal pzasusb8.cal pmodm127.cal
# The custom help files to install # The custom help files to install
# #
# Put your custom help files here. # Put your custom help files here.
# #
CUSTOM_HELP= argv devnull help sysinfo pzasusb8 CUSTOM_HELP= argv devnull help sysinfo pzasusb8 pmodm127
# Any .h files that are needed by programs that use libcustcalc.a # Any .h files that are needed by programs that use libcustcalc.a
# #
@@ -62,7 +62,7 @@ CUSTOM_H_SRC=
# #
# Put your custom .c files here. # Put your custom .c files here.
# #
CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c c_pmodm127.c
# Any .o files that are needed by program that use libcustcalc.a. # Any .o files that are needed by program that use libcustcalc.a.
# Don't put ${REQUIRED_OBJ} files in this list. # Don't put ${REQUIRED_OBJ} files in this list.
@@ -71,7 +71,7 @@ CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c
# #
# Put your custom .o files here. # Put your custom .o files here.
# #
CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o c_pmodm127.o
############################################################################## ##############################################################################
#-=-=-=-=-=-=- Defaults in case you want to build from this dir -=-=-=-=-=-=-# #-=-=-=-=-=-=- Defaults in case you want to build from this dir -=-=-=-=-=-=-#
@@ -88,26 +88,120 @@ CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o
#Q= #Q=
Q=@ Q=@
####
# Normally, the upper level makefile will set these values. We provide # Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory. # a default here just in case you want to build from this directory.
####
# Where the system include (.h) files are kept
# #
# where to install things # For DJGPP, select:
# #
# ${TOPDIR} is the directory under which the calc directory will be placed. # INCDIR= /dev/env/DJDIR/include
# ${LIBDIR} is where the *.cal, *.h, *.a, bindings and help dir are installed.
# ${HELPDIR} is where the help directory is installed.
# ${CUSTOMLIBDIR} is where custom lib files are installed.
# ${CUSTOMHELPDIR} is where custom help files are installed.
# #
TOPDIR= /usr/local/lib # If in doubt, set:
#TOPDIR= /usr/lib
#TOPDIR= /usr/libdata
#TOPDIR= /usr/contrib/lib
# #
LIBDIR= ${TOPDIR}/calc # INCDIR= /usr/include
HELPDIR= ${LIBDIR}/help #
CUSTOMLIBDIR= ${LIBDIR}/custom
CUSTOMHELPDIR= ${HELPDIR}/custhelp #INCDIR= /usr/local/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# where to install calc realted things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
# ${CALC_SHAREDIR} where to install calc help, .cal, startup, config files
#
# NOTE: The install rule prepends installation paths with $T, which
# by default is empty. If $T is non-empty, then installation
# locations will be relative to the $T directory.
#
# For DJGPP, select:
#
# BINDIR= /dev/env/DJDIR/bin
# LIBDIR= /dev/env/DJDIR/lib
# CALC_SHAREDIR= /dev/env/DJDIR/share/calc
#
# If in doubt, set:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= /usr/local/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= /usr/local/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= /usr/local/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
# By default, these values are based CALC_SHAREDIR, INCDIR, BINDIR
# ---------------------------------------------------------------
# ${HELPDIR} where the help directory is installed
# ${CALC_INCDIR} where the calc include files are installed
# ${CUSTOMCALDIR} where custom *.cal files are installed
# ${CUSTOMHELPDIR} where custom help files are installed
# ${CUSTOMINCPDIR} where custom .h files are installed
# ${SCRIPTDIR} where calc shell scripts are installed
#
# NOTE: The install rule prepends installation paths with $T, which
# by default is empty. If $T is non-empty, then installation
# locations will be relative to the $T directory.
#
# If in doubt, set:
#
# HELPDIR= ${CALC_SHAREDIR}/help
# CALC_INCDIR= ${INCDIR}/calc
# CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
# CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
# CUSTOMINCDIR= ${CALC_INCDIR}/custom
# SCRIPTDIR= ${BINDIR}/cscript
#
HELPDIR= ${CALC_SHAREDIR}/help
CALC_INCDIR= ${INCDIR}/calc
CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
CUSTOMINCDIR= ${CALC_INCDIR}/custom
SCRIPTDIR= ${BINDIR}/cscript
# T - top level directory under which calc will be installed
#
# The calc install is performed under $T, the calc build is
# performed under /. The purpose for $T is to allow someone
# to install calc somewhere other than into the system area.
#
# For example, if:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
# and if:
#
# T= /var/tmp/testing
#
# Then the installation locations will be:
#
# calc binary files: /var/tmp/testing/usr/bin
# calc link library: /var/tmp/testing/usr/lib
# calc help, .cal ...: /var/tmp/testing/usr/share/calc
# ... etc ... /var/tmp/testing/...
#
# If $T is empty, calc is installed under /, which is the same
# top of tree for which it was built. If $T is non-empty, then
# calc is installed under $T, as if one had to chroot under
# $T for calc to operate.
#
# If in doubt, use T=
#
T=
# Normally, the upper level makefile will set these values. We provide # Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory. # a default here just in case you want to build from this directory.
@@ -256,7 +350,7 @@ REQUIRED_SRC= custtbl.c
# #
REQUIRED_OBJ= custtbl.o REQUIRED_OBJ= custtbl.o
# These .h files are installed under ${CUSTOMLIBDIR} by the install rule. # These .h files are installed under ${CUSTOMCALDIR} by the install rule.
# #
INSTALL_H_SRC= ${CUSTOM_H_SRC} INSTALL_H_SRC= ${CUSTOM_H_SRC}
@@ -288,9 +382,13 @@ DISTLIST= ${CUSTCALC_SRC} ${CUSTOM_CALC_FILES} ${CUSTOM_HELP} \
# #
CALCLIBLIST= ${CUSTCALC_SRC} ${INSTALL_H_SRC} ${MAKE_FILE} HOW_TO_ADD CALCLIBLIST= ${CUSTCALC_SRC} ${INSTALL_H_SRC} ${MAKE_FILE} HOW_TO_ADD
# This is the custom .a link library that is build
#
CALC_LIBCUSTOM= libcustcalc.a
# complete list of targets # complete list of targets
# #
TARGETS= libcustcalc.a ${CUSTCALC_OBJ} TARGETS= ${CALC_LIBCUSTOM} ${CUSTCALC_OBJ}
# required vars # required vars
# #
@@ -303,6 +401,7 @@ SED= sed
MAKEDEPEND= makedepend MAKEDEPEND= makedepend
CHMOD= chmod CHMOD= chmod
SORT= sort SORT= sort
CMP= cmp
## ##
# #
@@ -313,7 +412,7 @@ SORT= sort
all: ${TARGETS} ${INSTALL_H_SRC} ${CUSTOM_CALC_FILES} \ all: ${TARGETS} ${INSTALL_H_SRC} ${CUSTOM_CALC_FILES} \
${CUSTOM_HELP} ${MAKE_FILE} .all ${CUSTOM_HELP} ${MAKE_FILE} .all
libcustcalc.a: ${CUSTCALC_OBJ} ${MAKE_FILE} ../Makefile libcustcalc.a: ${CUSTCALC_OBJ} ${MAKE_FILE} ../${MAKE_FILE}
-rm -f libcustcalc.a -rm -f libcustcalc.a
ar qc libcustcalc.a ${CUSTCALC_OBJ} ar qc libcustcalc.a ${CUSTCALC_OBJ}
${RANLIB} libcustcalc.a ${RANLIB} libcustcalc.a
@@ -353,8 +452,10 @@ c_sysinfo.o: c_sysinfo.c ${MAKE_FILE}
## ##
distlist: ${DISTLIST} distlist: ${DISTLIST}
${Q}for i in ${DISTLIST}; do \ ${Q}for i in ${DISTLIST} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo custom/$$i; \ echo custom/$$i; \
fi; \
done done
distdir: distdir:
@@ -390,11 +491,13 @@ depend:
-${Q}rm -rf skel -${Q}rm -rf skel
${Q}mkdir skel ${Q}mkdir skel
${Q}mkdir skel/custom ${Q}mkdir skel/custom
-${Q}for i in ${C_SRC}; do \ -${Q}for i in ${C_SRC} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
${SED} -n '/^#[ ]*include[ ]*"/p' \ ${SED} -n '/^#[ ]*include[ ]*"/p' \
"$$i" > "skel/custom/$$i"; \ "$$i" > "skel/custom/$$i"; \
fi; \
done done
-${Q}for i in /dev/null ${H_SRC}; do \ -${Q}for i in ${H_SRC} /dev/null; do \
if [ "$$i" = "/dev/null" ]; then \ if [ "$$i" = "/dev/null" ]; then \
continue; \ continue; \
fi; \ fi; \
@@ -409,7 +512,10 @@ depend:
${Q}for i in `cd ..; ${MAKE} h_list 2>&1 | \ ${Q}for i in `cd ..; ${MAKE} h_list 2>&1 | \
${SED} -e '/Entering directory/d' \ ${SED} -e '/Entering directory/d' \
-e '/Nothing to be done/d' \ -e '/Nothing to be done/d' \
-e '/Leaving directory/d'`; do \ -e '/Leaving directory/d'` /dev/null; do \
if [ "$$i" = "/dev/null" ]; then \
continue; \
fi; \
tag="`echo $$i | ${SED} 's/[\.+,:]/_/g'`"; \ tag="`echo $$i | ${SED} 's/[\.+,:]/_/g'`"; \
echo "#if !defined($$tag)" > "skel/$$i"; \ echo "#if !defined($$tag)" > "skel/$$i"; \
echo "#define $$tag" >> "skel/$$i"; \ echo "#define $$tag" >> "skel/$$i"; \
@@ -422,9 +528,11 @@ depend:
${Q}echo forming custom dependency list ${Q}echo forming custom dependency list
${Q}echo "# DO NOT DELETE THIS LINE -- make depend depends on it." > \ ${Q}echo "# DO NOT DELETE THIS LINE -- make depend depends on it." > \
skel/custom/makedep.out skel/custom/makedep.out
${Q}cd skel/custom; ${MAKEDEPEND} -w 1 -m -f makedep.out ${C_SRC} ${Q}cd skel/custom; ${MAKEDEPEND} -w 1 -f makedep.out ${C_SRC}
-${Q}for i in ${C_SRC}; do \ -${Q}for i in ${C_SRC} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo "$$i" | ${SED} 's/^\(.*\)\.c/\1.o: \1.c/'; \ echo "$$i" | ${SED} 's/^\(.*\)\.c/\1.o: \1.c/'; \
fi; \
done >> skel/custom/makedep.out done >> skel/custom/makedep.out
${Q}echo custom dependency list formed ${Q}echo custom dependency list formed
${Q}echo forming new custom/Makefile ${Q}echo forming new custom/Makefile
@@ -432,9 +540,10 @@ depend:
${Q}mv Makefile Makefile.bak ${Q}mv Makefile Makefile.bak
${Q}${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' Makefile.bak > Makefile ${Q}${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' Makefile.bak > Makefile
${Q}echo "" >> Makefile ${Q}echo "" >> Makefile
${Q}${SED} -n '3,$$p' skel/custom/makedep.out | ${SORT} -u >> Makefile ${Q}${SED} -n '3,$$p' skel/custom/makedep.out | \
LANG=C ${SORT} -u >> Makefile
-${Q}rm -rf skel -${Q}rm -rf skel
-${Q}if cmp -s Makefile.bak Makefile; then \ -${Q}if ${CMP} -s Makefile.bak Makefile; then \
echo 'custom Makefile was already up to date'; \ echo 'custom Makefile was already up to date'; \
mv -f Makefile.bak Makefile; \ mv -f Makefile.bak Makefile; \
else \ else \
@@ -449,6 +558,34 @@ depend:
fi; \ fi; \
fi fi
##
#
# rpm rules
#
##
echo_inst_files:
${Q}for i in ${INSTALL_H_SRC} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo __file__ ${CUSTOMINCDIR}/$$i; \
fi; \
done
${Q}for i in ${CUSTOM_HELP} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo __file__ ${CUSTOMHELPDIR}/$$i; \
fi; \
done
${Q}for i in ${CUSTOM_CALC_FILES} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo __file__ ${CUSTOMCALDIR}/$$i; \
fi; \
done
${Q}for i in ${CALC_LIBCUSTOM} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo __file__ ${CUSTOMCALDIR}/$$i; \
fi; \
done
## ##
# #
# Utility rules # Utility rules
@@ -460,73 +597,148 @@ clean:
clobber: clobber:
-rm -f ${TARGETS} -rm -f ${TARGETS}
rm -f .all Makefile.tmp rm -f .all Makefile.tmp Makefile.bak
install: all install: all
-${Q}if [ ! -d ${TOPDIR} ]; then \ -${Q}if [ ! -d $T${INCDIR} ]; then \
echo mkdir ${TOPDIR}; \ echo mkdir $T${INCDIR}; \
mkdir ${TOPDIR}; \ mkdir $T${INCDIR}; \
if [ ! -d "$T${INCDIR}" ]; then \
echo mkdir -p "$T${INCDIR}"; \
mkdir -p "$T${INCDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${INCDIR}; \
${CHMOD} 0755 $T${INCDIR}; \
else \ else \
true; \ true; \
fi fi
-${Q}if [ ! -d ${LIBDIR} ]; then \ -${Q}if [ ! -d $T${CALC_SHAREDIR} ]; then \
echo mkdir ${LIBDIR}; \ echo mkdir $T${CALC_SHAREDIR}; \
mkdir ${LIBDIR}; \ mkdir $T${CALC_SHAREDIR}; \
if [ ! -d "$T${CALC_SHAREDIR}" ]; then \
echo mkdir -p "$T${CALC_SHAREDIR}"; \
mkdir -p "$T${CALC_SHAREDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${CALC_SHAREDIR}; \
${CHMOD} 0755 $T${CALC_SHAREDIR}; \
else \ else \
true; \ true; \
fi fi
-${Q}if [ ! -d ${HELPDIR} ]; then \ -${Q}if [ ! -d $T${CALC_INCDIR} ]; then \
echo mkdir ${HELPDIR}; \ echo mkdir $T${CALC_INCDIR}; \
mkdir ${HELPDIR}; \ mkdir $T${CALC_INCDIR}; \
if [ ! -d "$T${CALC_INCDIR}" ]; then \
echo mkdir -p "$T${CALC_INCDIR}"; \
mkdir -p "$T${CALC_INCDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${CALC_INCDIR}; \
${CHMOD} 0755 $T${CALC_INCDIR}; \
else \ else \
true; \ true; \
fi fi
-${Q}if [ ! -d ${CUSTOMLIBDIR} ]; then \ -${Q}if [ ! -d $T${HELPDIR} ]; then \
echo mkdir ${CUSTOMLIBDIR}; \ echo mkdir $T${HELPDIR}; \
mkdir ${CUSTOMLIBDIR}; \ mkdir $T${HELPDIR}; \
if [ ! -d "$T${HELPDIR}" ]; then \
echo mkdir -p "$T${HELPDIR}"; \
mkdir -p "$T${HELPDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${HELPDIR}; \
${CHMOD} 0755 $T${HELPDIR}; \
else \ else \
true; \ true; \
fi fi
-${Q}if [ ! -d ${CUSTOMHELPDIR} ]; then \ -${Q}if [ ! -d $T${CUSTOMCALDIR} ]; then \
echo mkdir ${CUSTOMHELPDIR}; \ echo mkdir $T${CUSTOMCALDIR}; \
mkdir ${CUSTOMHELPDIR}; \ mkdir $T${CUSTOMCALDIR}; \
if [ ! -d "$T${CUSTOMCALDIR}" ]; then \
echo mkdir -p "$T${CUSTOMCALDIR}"; \
mkdir -p "$T${CUSTOMCALDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${CUSTOMCALDIR}; \
${CHMOD} 0755 $T${CUSTOMCALDIR}; \
else \ else \
true; \ true; \
fi fi
${Q}for i in ${INSTALL_H_SRC} /dev/null; do \ -${Q}if [ ! -d $T${CUSTOMHELPDIR} ]; then \
if [ X$$i = X/dev/null ]; then continue; fi; \ echo mkdir $T${CUSTOMHELPDIR}; \
echo rm -f ${CUSTOMLIBDIR}/$$i; \ mkdir $T${CUSTOMHELPDIR}; \
rm -f ${CUSTOMLIBDIR}/$$i; \ if [ ! -d "$T${CUSTOMHELPDIR}" ]; then \
echo cp $$i ${CUSTOMLIBDIR}; \ echo mkdir -p "$T${CUSTOMHELPDIR}"; \
cp $$i ${CUSTOMLIBDIR}; \ mkdir -p "$T${CUSTOMHELPDIR}"; \
echo ${CHMOD} 0444 ${CUSTOMLIBDIR}/$$i; \ fi; \
${CHMOD} 0444 ${CUSTOMLIBDIR}/$$i; \ echo ${CHMOD} 0755 $T${CUSTOMHELPDIR}; \
${CHMOD} 0755 $T${CUSTOMHELPDIR}; \
else \
true; \
fi
-${Q}if [ ! -d $T${CUSTOMINCDIR} ]; then \
echo mkdir $T${CUSTOMINCDIR}; \
mkdir $T${CUSTOMINCDIR}; \
if [ ! -d "$T${CUSTOMINCDIR}" ]; then \
echo mkdir -p "$T${CUSTOMINCDIR}"; \
mkdir -p "$T${CUSTOMINCDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${CUSTOMINCDIR}; \
${CHMOD} 0755 $T${CUSTOMINCDIR}; \
else \
true; \
fi
-${Q}for i in ${INSTALL_H_SRC} /dev/null; do \
if [ "$$i" = "/dev/null" ]; then \
continue; \
fi; \
if ${CMP} -s tmp $T${CUSTOMINCDIR}/$$i; then \
true; \
else \
rm -f $T${CUSTOMINCDIR}/$$i.new; \
cp -f $$i $T${CUSTOMINCDIR}/$$i.new; \
${CHMOD} 0444 $T${CUSTOMINCDIR}/$$i.new; \
mv -f $T${CUSTOMINCDIR}/$$i.new $T${CUSTOMINCDIR}/$$i; \
echo "installed $T${CUSTOMINCDIR}/$$i"; \
fi; \
done done
${Q}for i in ${CUSTOM_CALC_FILES}; do \ -${Q}rm -f tmp
echo rm -f ${CUSTOMLIBDIR}/$$i; \ -${Q}for i in ${CUSTOM_CALC_FILES} /dev/null; do \
rm -f ${CUSTOMLIBDIR}/$$i; \ if [ "$$i" = "/dev/null" ]; then \
echo cp $$i ${CUSTOMLIBDIR}; \ continue; \
cp $$i ${CUSTOMLIBDIR}; \ fi; \
echo ${CHMOD} 0444 ${CUSTOMLIBDIR}/$$i; \ if ${CMP} -s $$i $T${CUSTOMCALDIR}/$$i; then \
${CHMOD} 0444 ${CUSTOMLIBDIR}/$$i; \ true; \
else \
rm -f $T${CUSTOMCALDIR}/$$i.new; \
cp -f $$i $T${CUSTOMCALDIR}/$$i.new; \
${CHMOD} 0444 $T${CUSTOMCALDIR}/$$i.new; \
mv -f $T${CUSTOMCALDIR}/$$i.new $T${CUSTOMCALDIR}/$$i; \
echo "installed $T${CUSTOMCALDIR}/$$i"; \
fi; \
done done
${Q}for i in ${CUSTOM_HELP}; do \ -${Q}for i in ${CUSTOM_HELP} /dev/null; do \
echo rm -f ${CUSTOMHELPDIR}/$$i; \ if [ "$$i" = "/dev/null" ]; then \
rm -f ${CUSTOMHELPDIR}/$$i; \ continue; \
echo cp $$i ${CUSTOMHELPDIR}; \ fi; \
cp $$i ${CUSTOMHELPDIR}; \ if ${CMP} -s $$i $T${CUSTOMHELPDIR}/$$i; then \
echo ${CHMOD} 0444 ${CUSTOMHELPDIR}/$$i; \ true; \
${CHMOD} 0444 ${CUSTOMHELPDIR}/$$i; \ else \
rm -f $T${CUSTOMHELPDIR}/$$i.new; \
cp -f $$i $T${CUSTOMHELPDIR}/$$i.new; \
${CHMOD} 0444 $T${CUSTOMHELPDIR}/$$i.new; \
mv -f $T${CUSTOMHELPDIR}/$$i.new $T${CUSTOMHELPDIR}/$$i; \
echo "installed $T${CUSTOMHELPDIR}/$$i"; \
fi; \
done done
-${Q}if [ ! -z ${ALLOW_CUSTOM} ]; then \ -${Q}if [ ! -z ${ALLOW_CUSTOM} ]; then \
echo "rm -f ${CUSTOMLIBDIR}/libcustcalc.a"; \ if ${CMP} -s libcustcalc.a $T${CUSTOMCALDIR}/libcustcalc.a; then \
rm -f ${CUSTOMLIBDIR}/libcustcalc.a; \ true; \
echo "cp libcustcalc.a ${CUSTOMLIBDIR}/libcustcalc.a"; \ else \
cp libcustcalc.a ${CUSTOMLIBDIR}/libcustcalc.a; \ rm -f $T${CUSTOMCALDIR}/libcustcalc.a.new; \
echo "${CHMOD} 0644 ${CUSTOMLIBDIR}/libcustcalc.a"; \ cp -f libcustcalc.a $T${CUSTOMCALDIR}/libcustcalc.a.new; \
${CHMOD} 0644 ${CUSTOMLIBDIR}/libcustcalc.a; \ ${CHMOD} 0644 $T${CUSTOMCALDIR}/libcustcalc.a.new; \
echo "${RANLIB} ${CUSTOMLIBDIR}/libcustcalc.a"; \ mv -f $T${CUSTOMCALDIR}/libcustcalc.a.new \
${RANLIB} ${CUSTOMLIBDIR}/libcustcalc.a; \ $T${CUSTOMCALDIR}/libcustcalc.a; \
${RANLIB} $T${CUSTOMCALDIR}/libcustcalc.a; \
echo "installed $T${CUSTOMCALDIR}/libcustcalc.a"; \
fi; \
fi fi
## ##
@@ -553,6 +765,7 @@ c_argv.o: ../have_memmv.h
c_argv.o: ../have_newstr.h c_argv.o: ../have_newstr.h
c_argv.o: ../have_stdlib.h c_argv.o: ../have_stdlib.h
c_argv.o: ../have_string.h c_argv.o: ../have_string.h
c_argv.o: ../have_unused.h
c_argv.o: ../longbits.h c_argv.o: ../longbits.h
c_argv.o: ../md5.h c_argv.o: ../md5.h
c_argv.o: ../nametype.h c_argv.o: ../nametype.h
@@ -561,6 +774,7 @@ c_argv.o: ../shs.h
c_argv.o: ../shs1.h c_argv.o: ../shs1.h
c_argv.o: ../string.h c_argv.o: ../string.h
c_argv.o: ../value.h c_argv.o: ../value.h
c_argv.o: ../win32dll.h
c_argv.o: ../zmath.h c_argv.o: ../zmath.h
c_argv.o: c_argv.c c_argv.o: c_argv.c
c_devnull.o: ../alloc.h c_devnull.o: ../alloc.h
@@ -578,6 +792,7 @@ c_devnull.o: ../have_memmv.h
c_devnull.o: ../have_newstr.h c_devnull.o: ../have_newstr.h
c_devnull.o: ../have_stdlib.h c_devnull.o: ../have_stdlib.h
c_devnull.o: ../have_string.h c_devnull.o: ../have_string.h
c_devnull.o: ../have_unused.h
c_devnull.o: ../longbits.h c_devnull.o: ../longbits.h
c_devnull.o: ../md5.h c_devnull.o: ../md5.h
c_devnull.o: ../nametype.h c_devnull.o: ../nametype.h
@@ -586,6 +801,7 @@ c_devnull.o: ../shs.h
c_devnull.o: ../shs1.h c_devnull.o: ../shs1.h
c_devnull.o: ../string.h c_devnull.o: ../string.h
c_devnull.o: ../value.h c_devnull.o: ../value.h
c_devnull.o: ../win32dll.h
c_devnull.o: ../zmath.h c_devnull.o: ../zmath.h
c_devnull.o: c_devnull.c c_devnull.o: c_devnull.c
c_help.o: ../alloc.h c_help.o: ../alloc.h
@@ -603,6 +819,7 @@ c_help.o: ../have_memmv.h
c_help.o: ../have_newstr.h c_help.o: ../have_newstr.h
c_help.o: ../have_stdlib.h c_help.o: ../have_stdlib.h
c_help.o: ../have_string.h c_help.o: ../have_string.h
c_help.o: ../have_unused.h
c_help.o: ../longbits.h c_help.o: ../longbits.h
c_help.o: ../md5.h c_help.o: ../md5.h
c_help.o: ../nametype.h c_help.o: ../nametype.h
@@ -611,8 +828,36 @@ c_help.o: ../shs.h
c_help.o: ../shs1.h c_help.o: ../shs1.h
c_help.o: ../string.h c_help.o: ../string.h
c_help.o: ../value.h c_help.o: ../value.h
c_help.o: ../win32dll.h
c_help.o: ../zmath.h c_help.o: ../zmath.h
c_help.o: c_help.c c_help.o: c_help.c
c_pmodm127.o: ../alloc.h
c_pmodm127.o: ../block.h
c_pmodm127.o: ../byteswap.h
c_pmodm127.o: ../calcerr.h
c_pmodm127.o: ../cmath.h
c_pmodm127.o: ../config.h
c_pmodm127.o: ../custom.h
c_pmodm127.o: ../endian_calc.h
c_pmodm127.o: ../hash.h
c_pmodm127.o: ../have_const.h
c_pmodm127.o: ../have_malloc.h
c_pmodm127.o: ../have_memmv.h
c_pmodm127.o: ../have_newstr.h
c_pmodm127.o: ../have_stdlib.h
c_pmodm127.o: ../have_string.h
c_pmodm127.o: ../have_unused.h
c_pmodm127.o: ../longbits.h
c_pmodm127.o: ../md5.h
c_pmodm127.o: ../nametype.h
c_pmodm127.o: ../qmath.h
c_pmodm127.o: ../shs.h
c_pmodm127.o: ../shs1.h
c_pmodm127.o: ../string.h
c_pmodm127.o: ../value.h
c_pmodm127.o: ../win32dll.h
c_pmodm127.o: ../zmath.h
c_pmodm127.o: c_pmodm127.c
c_pzasusb8.o: ../alloc.h c_pzasusb8.o: ../alloc.h
c_pzasusb8.o: ../block.h c_pzasusb8.o: ../block.h
c_pzasusb8.o: ../byteswap.h c_pzasusb8.o: ../byteswap.h
@@ -628,6 +873,7 @@ c_pzasusb8.o: ../have_memmv.h
c_pzasusb8.o: ../have_newstr.h c_pzasusb8.o: ../have_newstr.h
c_pzasusb8.o: ../have_stdlib.h c_pzasusb8.o: ../have_stdlib.h
c_pzasusb8.o: ../have_string.h c_pzasusb8.o: ../have_string.h
c_pzasusb8.o: ../have_unused.h
c_pzasusb8.o: ../longbits.h c_pzasusb8.o: ../longbits.h
c_pzasusb8.o: ../md5.h c_pzasusb8.o: ../md5.h
c_pzasusb8.o: ../nametype.h c_pzasusb8.o: ../nametype.h
@@ -636,6 +882,7 @@ c_pzasusb8.o: ../shs.h
c_pzasusb8.o: ../shs1.h c_pzasusb8.o: ../shs1.h
c_pzasusb8.o: ../string.h c_pzasusb8.o: ../string.h
c_pzasusb8.o: ../value.h c_pzasusb8.o: ../value.h
c_pzasusb8.o: ../win32dll.h
c_pzasusb8.o: ../zmath.h c_pzasusb8.o: ../zmath.h
c_pzasusb8.o: c_pzasusb8.c c_pzasusb8.o: c_pzasusb8.c
c_sysinfo.o: ../alloc.h c_sysinfo.o: ../alloc.h
@@ -656,9 +903,9 @@ c_sysinfo.o: ../have_memmv.h
c_sysinfo.o: ../have_newstr.h c_sysinfo.o: ../have_newstr.h
c_sysinfo.o: ../have_stdlib.h c_sysinfo.o: ../have_stdlib.h
c_sysinfo.o: ../have_string.h c_sysinfo.o: ../have_string.h
c_sysinfo.o: ../have_unused.h
c_sysinfo.o: ../hist.h c_sysinfo.o: ../hist.h
c_sysinfo.o: ../longbits.h c_sysinfo.o: ../longbits.h
c_sysinfo.o: ../longlong.h
c_sysinfo.o: ../md5.h c_sysinfo.o: ../md5.h
c_sysinfo.o: ../nametype.h c_sysinfo.o: ../nametype.h
c_sysinfo.o: ../prime.h c_sysinfo.o: ../prime.h
@@ -667,6 +914,7 @@ c_sysinfo.o: ../shs.h
c_sysinfo.o: ../shs1.h c_sysinfo.o: ../shs1.h
c_sysinfo.o: ../string.h c_sysinfo.o: ../string.h
c_sysinfo.o: ../value.h c_sysinfo.o: ../value.h
c_sysinfo.o: ../win32dll.h
c_sysinfo.o: ../zmath.h c_sysinfo.o: ../zmath.h
c_sysinfo.o: ../zrand.h c_sysinfo.o: ../zrand.h
c_sysinfo.o: ../zrandom.h c_sysinfo.o: ../zrandom.h
@@ -694,5 +942,6 @@ custtbl.o: ../shs.h
custtbl.o: ../shs1.h custtbl.o: ../shs1.h
custtbl.o: ../string.h custtbl.o: ../string.h
custtbl.o: ../value.h custtbl.o: ../value.h
custtbl.o: ../win32dll.h
custtbl.o: ../zmath.h custtbl.o: ../zmath.h
custtbl.o: custtbl.c custtbl.o: custtbl.c

View File

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

View File

@@ -1,7 +1,7 @@
/* /*
* c_argv - a custom function display info about its args * c_argv - a custom function display info about its args
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999-2004 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: c_argv.c,v 29.2 2000/06/07 14:03:03 chongo Exp $ * @(#) $Id: c_argv.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_argv.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_argv.c,v $
* *
* Under source code control: 1997/03/09 20:27:37 * Under source code control: 1997/03/09 20:27:37
@@ -40,6 +40,8 @@
#include "../config.h" #include "../config.h"
#include "../calc.h" #include "../calc.h"
#include "../have_unused.h"
/* /*
* c_argv - a custom function display info about its args * c_argv - a custom function display info about its args
* *
@@ -51,7 +53,7 @@
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
VALUE VALUE
c_argv(char *name, int count, VALUE **vals) c_argv(char UNUSED *name, int count, VALUE **vals)
{ {
VALUE result; /* what we will return */ VALUE result; /* what we will return */
ZVALUE zfilelen; /* length of a file as a ZVALUE */ ZVALUE zfilelen; /* length of a file as a ZVALUE */

View File

@@ -1,7 +1,7 @@
/* /*
* c_devnull - a custom function that does nothing * c_devnull - a custom function that does nothing
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999-2004 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: c_devnull.c,v 29.2 2000/06/07 14:03:03 chongo Exp $ * @(#) $Id: c_devnull.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_devnull.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_devnull.c,v $
* *
* Under source code control: 1997/03/09 17:49:12 * Under source code control: 1997/03/09 17:49:12
@@ -36,6 +36,8 @@
#include "../value.h" #include "../value.h"
#include "../custom.h" #include "../custom.h"
#include "../have_unused.h"
/* /*
* c_devnull - a custom function that does nothing * c_devnull - a custom function that does nothing
@@ -45,7 +47,7 @@
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
VALUE VALUE
c_devnull(char *name, int count, VALUE **vals) c_devnull(char UNUSED *name, int UNUSED count, VALUE UNUSED **vals)
{ {
VALUE result; /* what we will return */ VALUE result; /* what we will return */

View File

@@ -1,7 +1,7 @@
/* /*
* c_help - custom help function * c_help - custom help function
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999-2004 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: c_help.c,v 29.2 2000/06/07 14:03:03 chongo Exp $ * @(#) $Id: c_help.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_help.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_help.c,v $
* *
* Under source code control: 1997/03/09 05:25:41 * Under source code control: 1997/03/09 05:25:41
@@ -36,6 +36,8 @@
#include "../value.h" #include "../value.h"
#include "../custom.h" #include "../custom.h"
#include "../have_unused.h"
/* /*
* c_help - custom help function * c_help - custom help function
@@ -56,7 +58,7 @@
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
VALUE VALUE
c_help(char *name, int count, VALUE **vals) c_help(char UNUSED *name, int UNUSED count, VALUE **vals)
{ {
VALUE result; /* what we will return */ VALUE result; /* what we will return */

272
custom/c_pmodm127.c Normal file
View File

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

View File

@@ -1,7 +1,7 @@
/* /*
* c_pzasusb8 - print numereator as a string of USB8s * c_pzasusb8 - print numereator as a string of USB8s
* *
* Copyright (C) 1999 Ernest Bowen * Copyright (C) 1999-2004 Ernest Bowen
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: c_pzasusb8.c,v 29.2 2000/06/07 14:03:03 chongo Exp $ * @(#) $Id: c_pzasusb8.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_pzasusb8.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_pzasusb8.c,v $
* *
* Under source code control: 1999/10/06 03:12:25 * Under source code control: 1999/10/06 03:12:25
@@ -37,6 +37,8 @@
#include "../custom.h" #include "../custom.h"
#include "../zmath.h" #include "../zmath.h"
#include "../have_unused.h"
/* /*
* c_pzasusb8 - print numereator as a string of USB8s * c_pzasusb8 - print numereator as a string of USB8s
* *
@@ -49,7 +51,7 @@
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
VALUE VALUE
c_pzasusb8(char *name, int count, VALUE **vals) c_pzasusb8(char UNUSED *name, int UNUSED count, VALUE **vals)
{ {
VALUE result; /* what we will return */ VALUE result; /* what we will return */
ZVALUE z; /* numerator of the value */ ZVALUE z; /* numerator of the value */

View File

@@ -1,7 +1,7 @@
/* /*
* c_sysinfo - names and values of selected #defines * c_sysinfo - names and values of selected #defines
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999,2004 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.4 $ * @(#) $Revision: 29.10 $
* @(#) $Id: c_sysinfo.c,v 29.4 2000/07/17 15:37:12 chongo Exp $ * @(#) $Id: c_sysinfo.c,v 29.10 2004/03/31 05:02:10 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_sysinfo.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_sysinfo.c,v $
* *
* Under source code control: 1997/03/09 23:14:40 * Under source code control: 1997/03/09 23:14:40
@@ -42,7 +42,6 @@
#include "../calc.h" #include "../calc.h"
#include "../longbits.h" #include "../longbits.h"
#define CHECK_L_FORMAT #define CHECK_L_FORMAT
#include "../longlong.h"
#include "../block.h" #include "../block.h"
#include "../calcerr.h" #include "../calcerr.h"
#include "../conf.h" #include "../conf.h"
@@ -53,6 +52,8 @@
#include "../zrand.h" #include "../zrand.h"
#include "../zrandom.h" #include "../zrandom.h"
#include "../have_unused.h"
/* /*
* sys_info - names and values of selected #defines * sys_info - names and values of selected #defines
@@ -64,7 +65,7 @@ struct infoname {
FULL nmbr; /* if str==NULL ==> value fo #define as a FULL */ FULL nmbr; /* if str==NULL ==> value fo #define as a FULL */
}; };
static struct infoname sys_info[] = { static struct infoname sys_info[] = {
{"A55", "slots in an additive 55 table", NULL, (FULL)A55}, {"S100", "slots in an subtractive 100 table", NULL, (FULL)S100},
{"BASE", "base for calculations", NULL, (FULL)BASE}, {"BASE", "base for calculations", NULL, (FULL)BASE},
{"BASE1", "one less than base", NULL, (FULL)BASE}, {"BASE1", "one less than base", NULL, (FULL)BASE},
{"BASEB", "bits in the calculation base", NULL, (FULL)BASEB}, {"BASEB", "bits in the calculation base", NULL, (FULL)BASEB},
@@ -102,7 +103,6 @@ static struct infoname sys_info[] = {
{"INIT_K", "initial 2nd walking a55 table index", NULL, (FULL)INIT_K}, {"INIT_K", "initial 2nd walking a55 table index", NULL, (FULL)INIT_K},
{"INODE_BITS", "inode number size in bits", NULL, (FULL)INODE_BITS}, {"INODE_BITS", "inode number size in bits", NULL, (FULL)INODE_BITS},
{"LITTLE_ENDIAN", "Least Significant Byte first symbol", NULL, (FULL)LITTLE_ENDIAN}, {"LITTLE_ENDIAN", "Least Significant Byte first symbol", NULL, (FULL)LITTLE_ENDIAN},
{"LONGLONG_BITS", "length of a long long, or 0", NULL, (FULL)LONGLONG_BITS},
{"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS}, {"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS},
{"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT}, {"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT},
{"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL, (FULL)MAX_CALCRC}, {"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL, (FULL)MAX_CALCRC},
@@ -128,8 +128,6 @@ static struct infoname sys_info[] = {
{"MAX_SM_PRIME", "larest 32 bit prime", NULL, (FULL)MAX_SM_PRIME}, {"MAX_SM_PRIME", "larest 32 bit prime", NULL, (FULL)MAX_SM_PRIME},
{"MAX_SM_VAL", "larest 32 bit value", NULL, (FULL)MAX_SM_VAL}, {"MAX_SM_VAL", "larest 32 bit value", NULL, (FULL)MAX_SM_VAL},
{"MUL_ALG2", "default size for alternative multiply", NULL, (FULL)MUL_ALG2}, {"MUL_ALG2", "default size for alternative multiply", NULL, (FULL)MUL_ALG2},
{"NEW_EPSILONPREC_DEFAULT", "2^-EPSILON_DEFAULT <= EPSILON_DEFAULT", NULL, (FULL)NEW_EPSILONPREC_DEFAULT},
{"NEW_EPSILON_DEFAULT", "newstd EPSILON_DEFAULT", NEW_EPSILON_DEFAULT, (FULL)0},
{"NXT_MAP_PRIME", "smallest odd prime not in pr_map", NULL, (FULL)NXT_MAP_PRIME}, {"NXT_MAP_PRIME", "smallest odd prime not in pr_map", NULL, (FULL)NXT_MAP_PRIME},
{"NXT_PFACT_VAL", "next prime for higher pfact values", NULL, (FULL)NXT_PFACT_VAL}, {"NXT_PFACT_VAL", "next prime for higher pfact values", NULL, (FULL)NXT_PFACT_VAL},
{"OFF_T_BITS", "file offset size in bits", NULL, (FULL)OFF_T_BITS}, {"OFF_T_BITS", "file offset size in bits", NULL, (FULL)OFF_T_BITS},
@@ -181,7 +179,7 @@ static void dump_mening_value(void); /* custom("sysinfo", 2) */
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
VALUE VALUE
c_sysinfo(char *name, int count, VALUE **vals) c_sysinfo(char UNUSED *name, int count, VALUE **vals)
{ {
VALUE result; /* what we will return */ VALUE result; /* what we will return */
struct infoname *p; /* current infoname */ struct infoname *p; /* current infoname */
@@ -317,30 +315,16 @@ dump_name_value(void)
/* dump the entire table */ /* dump the entire table */
for (p = sys_info; p->name != NULL; ++p) { for (p = sys_info; p->name != NULL; ++p) {
if (p->str == NULL) { if (p->str == NULL) {
#if LONG_BITS == FULL_BITS || FULL_BITS == 32 || !defined(HAVE_LONGLONG) #if LONG_BITS == FULL_BITS || FULL_BITS == 32
printf("%s%-23s\t%-8lu\t(0x%lx)\n", printf("%s%-23s\t%-8lu\t(0x%lx)\n",
(conf->tab_ok ? "\t" : ""), p->name, (conf->tab_ok ? "\t" : ""), p->name,
(unsigned long)p->nmbr, (unsigned long)p->nmbr,
(unsigned long)p->nmbr); (unsigned long)p->nmbr);
#else #else
/*
* Determine of %ld can print a 64 bit long long.
*
* Some systems that can make use of %ld to print a
* a 64 bit value do not support the %lld type.
* So we will only try %lld if %ld does not work.
*/
# if defined(L64_FORMAT)
printf("%s%-23s\t%-8lu\t(0x%lx)\n",
(conf->tab_ok ? "\t" : ""), p->name,
(unsigned long long)p->nmbr,
(unsigned long long)p->nmbr);
# else /* L64_FORMAT */
printf("%s%-23s\t%-8llu\t(0x%llx)\n", printf("%s%-23s\t%-8llu\t(0x%llx)\n",
(conf->tab_ok ? "\t" : ""), p->name, (conf->tab_ok ? "\t" : ""), p->name,
(unsigned long long)p->nmbr, (unsigned long long)p->nmbr,
(unsigned long long)p->nmbr); (unsigned long long)p->nmbr);
# endif /* L64_FORMAT */
#endif #endif
} else { } else {
printf("%s%-23s\t\"%s\"\n", printf("%s%-23s\t\"%s\"\n",
@@ -362,25 +346,16 @@ dump_mening_value(void)
/* dump the entire table */ /* dump the entire table */
for (p = sys_info; p->name != NULL; ++p) { for (p = sys_info; p->name != NULL; ++p) {
if (p->str == NULL) { if (p->str == NULL) {
#if LONG_BITS == FULL_BITS || FULL_BITS == 32 || !defined(HAVE_LONGLONG) #if LONG_BITS == FULL_BITS || FULL_BITS == 32
printf("%s%-36.36s\t%-8lu\t(0x%lx)\n", printf("%s%-36.36s\t%-8lu\t(0x%lx)\n",
(conf->tab_ok ? "\t" : ""), p->meaning, (conf->tab_ok ? "\t" : ""), p->meaning,
(unsigned long)p->nmbr, (unsigned long)p->nmbr,
(unsigned long)p->nmbr); (unsigned long)p->nmbr);
#else #else
# if defined(L64_FORMAT)
/* %ld prints all 64 bits, use %ld */
printf("%s%-36.36s\t%-8lu\t(0x%lx)\n",
(conf->tab_ok ? "\t" : ""), p->meaning,
(unsigned long long)p->nmbr,
(unsigned long long)p->nmbr);
# else /* L64_FORMAT */
/* %ld prints lower 32 bits only, use %lld */
printf("%s%-36.36s\t%-8llu\t(0x%llx)\n", printf("%s%-36.36s\t%-8llu\t(0x%llx)\n",
(conf->tab_ok ? "\t" : ""), p->meaning, (conf->tab_ok ? "\t" : ""), p->meaning,
(unsigned long long)p->nmbr, (unsigned long long)p->nmbr,
(unsigned long long)p->nmbr); (unsigned long long)p->nmbr);
# endif /* L64_FORMAT */
#endif #endif
} else { } else {
printf("%s%-36.36s\t\"%s\"\n", printf("%s%-36.36s\t\"%s\"\n",

View File

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

View File

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

78
custom/pmodm127 Normal file
View File

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

137
custom/pmodm127.cal Normal file
View File

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

View File

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

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: endian.c,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: endian.c,v 29.4 2003/01/14 01:50:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/endian.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/endian.c,v $
* *
* Under source code control: 1993/11/15 04:32:58 * Under source code control: 1993/11/15 04:32:58
@@ -36,6 +36,11 @@
#include <stdio.h> #include <stdio.h>
#include "have_stdlib.h"
#if defined(HAVE_STDLIB_H)
#include <stdlib.h>
#endif
#include "have_unistd.h" #include "have_unistd.h"
#if defined(HAVE_UNISTD_H) #if defined(HAVE_UNISTD_H)
#include <unistd.h> #include <unistd.h>
@@ -48,8 +53,10 @@ char byte[8] = { (char)0x12, (char)0x36, (char)0x48, (char)0x59,
int int
main(void) main(void)
{ {
#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
/* pointers into the byte order array */ /* pointers into the byte order array */
int *intp = (int *)byte; int *intp = (int *)byte;
#endif
#if defined(DEBUG) #if defined(DEBUG)
short *shortp = (short *)byte; short *shortp = (short *)byte;
long *longp = (long *)byte; long *longp = (long *)byte;
@@ -69,6 +76,11 @@ main(void)
printf("#define BIG_ENDIAN\t4321\n"); printf("#define BIG_ENDIAN\t4321\n");
printf("#define LITTLE_ENDIAN\t1234\n"); printf("#define LITTLE_ENDIAN\t1234\n");
#if defined(LITTLE_ENDIAN)
printf("#define CALC_BYTE_ORDER\tLITTLE_ENDIAN\n");
#elif defined(BIG_ENDIAN)
printf("#define CALC_BYTE_ORDER\tBIG_ENDIAN\n");
#else
/* Determine byte order */ /* Determine byte order */
if (intp[0] == 0x12364859) { if (intp[0] == 0x12364859) {
/* Most Significant Byte first */ /* Most Significant Byte first */
@@ -81,6 +93,7 @@ main(void)
"Unknown int Byte Order, set CALC_BYTE_ORDER in Makefile\n"); "Unknown int Byte Order, set CALC_BYTE_ORDER in Makefile\n");
exit(1); exit(1);
} }
#endif
/* exit(0); */ /* exit(0); */
return 0; return 0;
} }

159
file.c
View File

@@ -1,7 +1,7 @@
/* /*
* file - file I/O routines callable by users * file - file I/O routines callable by users
* *
* Copyright (C) 1999 David I. Bell and Landon Curt Noll * Copyright (C) 1999-2004 David I. Bell and Landon Curt Noll
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.9 $
* @(#) $Id: file.c,v 29.3 2000/12/17 12:24:42 chongo Exp $ * @(#) $Id: file.c,v 29.9 2004/02/23 14:04:01 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/file.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/file.c,v $
* *
* Under source code control: 1991/07/20 00:21:56 * Under source code control: 1991/07/20 00:21:56
@@ -35,7 +35,10 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include "have_unistd.h"
#if defined(HAVE_UNISTD_H)
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#include <ctype.h> #include <ctype.h>
#include "calc.h" #include "calc.h"
#include "longbits.h" #include "longbits.h"
@@ -45,6 +48,10 @@
#include "file.h" #include "file.h"
#include "calcerr.h" #include "calcerr.h"
#if defined(_WIN32)
# include <io.h>
#endif
#define READSIZE 1024 /* buffer size for reading */ #define READSIZE 1024 /* buffer size for reading */
/* /*
@@ -151,7 +158,7 @@ file_init(void)
} else { } else {
fp = (FILE *) fdopen(i, "w"); fp = (FILE *) fdopen(i, "w");
if (fp) { if (fp) {
strcpy(files[idnum].mode, "w?"); strcpy(files[idnum].mode, "w");
files[idnum].reading = FALSE; files[idnum].reading = FALSE;
} }
else else
@@ -200,7 +207,7 @@ openid(char *name, char *mode)
int i; int i;
if (idnum >= MAXFILES) if (idnum >= MAXFILES)
return -77; return -E_FOPEN3;
fiop = &files[3]; fiop = &files[3];
for (i = 3; i < MAXFILES; fiop++,i++) { for (i = 3; i < MAXFILES; fiop++,i++) {
@@ -236,11 +243,32 @@ openid(char *name, char *mode)
fiop->reading = TRUE; fiop->reading = TRUE;
fiop->writing = TRUE; fiop->writing = TRUE;
fiop->action = 0; fiop->action = 0;
if (mode[1] == '\0') {
if (*mode == 'r') /*
* 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; fiop->writing = FALSE;
else } else {
fiop->writing = TRUE;
}
} else if (mode[0] == 'w' || mode[0] == 'a') {
fiop->writing = TRUE;
if (strchr(mode, '+') == NULL) {
fiop->reading = FALSE; fiop->reading = FALSE;
} else {
fiop->reading = TRUE;
}
} else {
fiop->reading = FALSE;
fiop->writing = FALSE;
} }
strcpy(fiop->mode, mode); strcpy(fiop->mode, mode);
return id; return id;
@@ -339,11 +367,32 @@ reopenid(FILEID id, char *mode, char *name)
fiop->reading = TRUE; fiop->reading = TRUE;
fiop->writing = TRUE; fiop->writing = TRUE;
fiop->action = 0; fiop->action = 0;
if (mode[1] == '\0') {
if (*mode == 'r') /*
* 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; fiop->writing = FALSE;
else } else {
fiop->writing = TRUE;
}
} else if (mode[0] == 'w' || mode[0] == 'a') {
fiop->writing = TRUE;
if (strchr(mode, '+') == NULL) {
fiop->reading = FALSE; fiop->reading = FALSE;
} else {
fiop->reading = TRUE;
}
} else {
fiop->reading = FALSE;
fiop->writing = FALSE;
} }
strcpy(fiop->mode, mode); strcpy(fiop->mode, mode);
return id; return id;
@@ -351,13 +400,13 @@ reopenid(FILEID id, char *mode, char *name)
/* /*
* Find the file I/O structure for the specified file id, and verify that * Find the file I/O structure for the specified file id, and verifies that
* it is opened in the required manner ('r' for reading or 'w' for writing). * it is opened in the required manner (0 for reading or 1 for writing).
* If mode is 0, then no open checks are made at all, and NULL is then * If writable is -1, then no open checks are made at all and NULL is then
* returned if the id represents a closed file. * returned if the id represents a closed file.
*/ */
FILEIO * FILEIO *
findid(FILEID id, int mode) findid(FILEID id, int writable)
{ {
FILEIO *fiop; /* file structure */ FILEIO *fiop; /* file structure */
int i; int i;
@@ -376,21 +425,11 @@ findid(FILEID id, int mode)
if (i == idnum) if (i == idnum)
return NULL; return NULL;
switch (mode) { if (writable >= 0) {
case 'r': if ((writable && !fiop->writing) ||
if (!fiop->reading) (!writable && !fiop->reading)) {
return NULL; return NULL;
break; }
case 'w':
if (!fiop->writing)
return NULL;
break;
case 0:
break;
default:
/* This should not happen */
math_error("Unknown findid mode");
/*NOTREACHED*/
} }
return fiop; return fiop;
} }
@@ -402,7 +441,7 @@ findid(FILEID id, int mode)
BOOL BOOL
validid(FILEID id) validid(FILEID id)
{ {
return (findid(id, 0) != NULL); return (findid(id, -1) != NULL);
} }
@@ -498,7 +537,7 @@ errorid(FILEID id)
{ {
FILEIO *fiop; /* file structure */ FILEIO *fiop; /* file structure */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) if (fiop == NULL)
return EOF; return EOF;
return (ferror(fiop->fp) != 0); return (ferror(fiop->fp) != 0);
@@ -513,7 +552,7 @@ eofid(FILEID id)
{ {
FILEIO *fiop; /* file structure */ FILEIO *fiop; /* file structure */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) if (fiop == NULL)
return EOF; return EOF;
return (feof(fiop->fp) != 0); return (feof(fiop->fp) != 0);
@@ -528,7 +567,7 @@ flushid(FILEID id)
{ {
FILEIO *fiop; /* file structure */ FILEIO *fiop; /* file structure */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) if (fiop == NULL)
return 0; return 0;
if (!fiop->writing || fiop->action == 'r') if (!fiop->writing || fiop->action == 'r')
@@ -537,6 +576,7 @@ flushid(FILEID id)
} }
#if !defined(_WIN32)
int int
flushall(void) flushall(void)
{ {
@@ -552,6 +592,7 @@ flushall(void)
} }
return err; return err;
} }
#endif /* Windoz free systems */
/* /*
@@ -589,7 +630,7 @@ readid(FILEID id, int flags, char **retptr)
totlen = 0; totlen = 0;
str = NULL; str = NULL;
fiop = findid(id, 'r'); fiop = findid(id, FALSE);
if (fiop == NULL) if (fiop == NULL)
return 1; return 1;
nlstop = (flags & 1); nlstop = (flags & 1);
@@ -670,7 +711,7 @@ getcharid(FILEID id)
FILEIO *fiop; FILEIO *fiop;
FILEPOS fpos; FILEPOS fpos;
fiop = findid(id, 'r'); fiop = findid(id, FALSE);
if (fiop == NULL) if (fiop == NULL)
return -2; return -2;
if (fiop->action == 'w') { if (fiop->action == 'w') {
@@ -701,7 +742,7 @@ printid(FILEID id, int flags)
/* /*
* filewall - file is closed * filewall - file is closed
*/ */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) { if (fiop == NULL) {
if (flags & PRINT_UNAMBIG) if (flags & PRINT_UNAMBIG)
math_fmt("FILE %d closed", id); math_fmt("FILE %d closed", id);
@@ -769,7 +810,7 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
VALUE *vp; VALUE *vp;
char *str; char *str;
int ch; int ch;
unsigned long len; long len;
int oldmode, newmode; int oldmode, newmode;
long olddigits, newdigits; long olddigits, newdigits;
long width, precision; long width, precision;
@@ -778,7 +819,7 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
BOOL printstring; BOOL printstring;
BOOL printchar; BOOL printchar;
fiop = findid(id, 'w'); fiop = findid(id, TRUE);
if (fiop == NULL) if (fiop == NULL)
return 1; return 1;
if (fiop->action == 'r') { if (fiop->action == 'r') {
@@ -1005,7 +1046,7 @@ idfputc(FILEID id, int ch)
FILEPOS fpos; FILEPOS fpos;
/* get the file info pointer */ /* get the file info pointer */
fiop = findid(id, 'w'); fiop = findid(id, TRUE);
if (fiop == NULL) if (fiop == NULL)
return 1; return 1;
if (fiop->action == 'r') { if (fiop->action == 'r') {
@@ -1040,7 +1081,7 @@ idungetc(FILEID id, int ch)
{ {
FILEIO *fiop; FILEIO *fiop;
fiop = findid(id, 'r'); fiop = findid(id, FALSE);
if (fiop == NULL) if (fiop == NULL)
return -2; return -2;
if (fiop->action != 'r') if (fiop->action != 'r')
@@ -1063,7 +1104,7 @@ idfputs(FILEID id, char *str)
FILEPOS fpos; FILEPOS fpos;
/* get the file info pointer */ /* get the file info pointer */
fiop = findid(id, 'w'); fiop = findid(id, TRUE);
if (fiop == NULL) if (fiop == NULL)
return 1; return 1;
@@ -1101,7 +1142,7 @@ idfputstr(FILEID id, char *str)
FILEPOS fpos; FILEPOS fpos;
/* get the file info pointer */ /* get the file info pointer */
fiop = findid(id, 'w'); fiop = findid(id, TRUE);
if (fiop == NULL) if (fiop == NULL)
return 1; return 1;
@@ -1131,7 +1172,7 @@ int
rewindid(FILEID id) rewindid(FILEID id)
{ {
FILEIO *fiop; FILEIO *fiop;
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) if (fiop == NULL)
return 1; return 1;
rewind(fiop->fp); rewind(fiop->fp);
@@ -1179,7 +1220,7 @@ filepos2z(FILEPOS pos)
ret.len = FILEPOS_BITS/BASEB; ret.len = FILEPOS_BITS/BASEB;
ret.v = alloc(ret.len); ret.v = alloc(ret.len);
zclearval(ret); zclearval(ret);
SWAP_HALF_IN_FILEPOS(ret.v, &pos); SWAP_HALF_IN_FILEPOS(ret.v, (HALF *)&pos);
ret.sign = 0; ret.sign = 0;
ztrim(&ret); ztrim(&ret);
@@ -1319,7 +1360,7 @@ getloc(FILEID id, ZVALUE *res)
/* /*
* convert id to stream * convert id to stream
*/ */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return -1; return -1;
@@ -1344,7 +1385,7 @@ ftellid(FILEID id, ZVALUE *res)
FILEPOS fpos; /* current file position */ FILEPOS fpos; /* current file position */
/* get FILEIO */ /* get FILEIO */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) if (fiop == NULL)
return -2; return -2;
@@ -1367,7 +1408,7 @@ fseekid(FILEID id, ZVALUE offset, int whence)
int ret = 0; /* return code */ int ret = 0; /* return code */
/* setup */ /* setup */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) if (fiop == NULL)
return -2; return -2;
@@ -1492,7 +1533,7 @@ setloc(FILEID id, ZVALUE zpos)
/* /*
* convert id to stream * convert id to stream
*/ */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return -1; return -1;
@@ -1660,7 +1701,7 @@ getsize(FILEID id, ZVALUE *res)
/* /*
* convert id to stream * convert id to stream
*/ */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return 1; return 1;
@@ -1696,7 +1737,7 @@ get_device(FILEID id, ZVALUE *dev)
/* /*
* convert id to stream * convert id to stream
*/ */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return -1; return -1;
@@ -1729,7 +1770,7 @@ get_inode(FILEID id, ZVALUE *inode)
/* /*
* convert id to stream * convert id to stream
*/ */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) { if (fiop == NULL) {
/* file not open */ /* file not open */
return -1; return -1;
@@ -1765,7 +1806,7 @@ zfilesize(FILEID id)
ZVALUE ret; /* file size as a ZVALUE return value */ ZVALUE ret; /* file size as a ZVALUE return value */
/* file FILEIO */ /* file FILEIO */
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) { if (fiop == NULL) {
/* return neg value for non-file error */ /* return neg value for non-file error */
itoz(-1, &ret); itoz(-1, &ret);
@@ -2135,7 +2176,7 @@ fscanfid(FILEID id, char *fmt, int count, VALUE **vals)
FILE *fp; FILE *fp;
FILEPOS fpos; FILEPOS fpos;
fiop = findid(id, 'r'); fiop = findid(id, FALSE);
if (fiop == NULL) if (fiop == NULL)
return -2; return -2;
@@ -2399,7 +2440,7 @@ isattyid(FILEID id)
{ {
FILEIO *fiop; FILEIO *fiop;
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) if (fiop == NULL)
return -2; return -2;
return isatty(fileno(fiop->fp)); return isatty(fileno(fiop->fp));
@@ -2436,7 +2477,7 @@ fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res)
long k = 0; long k = 0;
/* get FILEIO */ /* get FILEIO */
fiop = findid(id, 'r'); fiop = findid(id, FALSE);
if (fiop == NULL) if (fiop == NULL)
return -2; return -2;
@@ -2555,7 +2596,7 @@ frsearch(FILEID id, char *str, ZVALUE first, ZVALUE last, ZVALUE *res)
char *s; /* str comparison pointer */ char *s; /* str comparison pointer */
/* get FILEIO */ /* get FILEIO */
fiop = findid(id, 'r'); fiop = findid(id, FALSE);
if (fiop == NULL) if (fiop == NULL)
return -2; return -2;
@@ -2632,7 +2673,7 @@ findfname(FILEID id)
{ {
FILEIO *fiop; FILEIO *fiop;
fiop = findid(id, 0); fiop = findid(id, -1);
if (fiop == NULL) if (fiop == NULL)
return NULL; return NULL;

14
file.h
View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.5 $
* @(#) $Id: file.h,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: file.h,v 29.5 2001/06/08 21:00:58 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/file.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/file.h,v $
* *
* Under source code control: 1996/05/24 05:55:58 * Under source code control: 1996/05/24 05:55:58
@@ -35,7 +35,11 @@
#define __FILE_H__ #define __FILE_H__
#include "have_fpos.h" #if defined(CALC_SRC) /* if we are building from the calc source tree */
# include "have_fpos.h"
#else
# include <calc/have_fpos.h>
#endif
/* /*
@@ -50,7 +54,7 @@ typedef struct {
BOOL reading; /* TRUE if opened for reading */ BOOL reading; /* TRUE if opened for reading */
BOOL writing; /* TRUE if opened for writing */ BOOL writing; /* TRUE if opened for writing */
char action; /* most recent use for 'r', 'w' or 0 */ char action; /* most recent use for 'r', 'w' or 0 */
char mode[3]; /* open mode */ char mode[sizeof("rb+")];/* open mode */
} FILEIO; } FILEIO;
@@ -85,7 +89,7 @@ typedef struct {
/* /*
* external functions * external functions
*/ */
extern FILEIO * findid(FILEID id, int mode); extern FILEIO * findid(FILEID id, int writable);
extern int fgetposid(FILEID id, FILEPOS *ptr); extern int fgetposid(FILEID id, FILEPOS *ptr);
extern int fsetposid(FILEID id, FILEPOS *ptr); extern int fsetposid(FILEID id, FILEPOS *ptr);
extern int get_open_siz(FILE *fp, ZVALUE *res); extern int get_open_siz(FILE *fp, ZVALUE *res);

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.6 $
* @(#) $Id: fposval.c,v 29.3 2000/12/17 12:25:36 chongo Exp $ * @(#) $Id: fposval.c,v 29.6 2001/03/18 03:01:41 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/fposval.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/fposval.c,v $
* *
* Under source code control: 1994/11/05 03:19:52 * Under source code control: 1994/11/05 03:19:52
@@ -85,13 +85,16 @@ main(int argc, char **argv)
* print the file position information * print the file position information
*/ */
#if defined(HAVE_FPOS_POS) #if defined(HAVE_FPOS_POS)
printf("#undef FILEPOS_BITS\n"); fileposlen = FPOS_POS_BITS;
printf("#define FILEPOS_BITS %d\n", FPOS_POS_BITS);
#else /* ! HAVE_FPOS_POS */ #else /* ! HAVE_FPOS_POS */
# if defined(FPOS_BITS)
fileposlen = FPOS_BITS;
# else
fileposlen = sizeof(FILEPOS)*8; fileposlen = sizeof(FILEPOS)*8;
# endif
#endif /* ! HAVE_FPOS_POS */
printf("#undef FILEPOS_BITS\n"); printf("#undef FILEPOS_BITS\n");
printf("#define FILEPOS_BITS %d\n", fileposlen); printf("#define FILEPOS_BITS %d\n", fileposlen);
#endif /* ! HAVE_FPOS_POS */
#if CALC_BYTE_ORDER == BIG_ENDIAN #if CALC_BYTE_ORDER == BIG_ENDIAN
/* /*
* Big Endian * Big Endian
@@ -128,7 +131,11 @@ main(int argc, char **argv)
/* /*
* print the stat file size information * print the stat file size information
*/ */
#if defined(OFF_T_BITS)
stsizelen = OFF_T_BITS;
#else
stsizelen = sizeof(buf.st_size)*8; stsizelen = sizeof(buf.st_size)*8;
#endif
printf("#undef OFF_T_BITS\n"); printf("#undef OFF_T_BITS\n");
printf("#define OFF_T_BITS %d\n", stsizelen); printf("#define OFF_T_BITS %d\n", stsizelen);
#if CALC_BYTE_ORDER == BIG_ENDIAN #if CALC_BYTE_ORDER == BIG_ENDIAN
@@ -162,7 +169,7 @@ main(int argc, char **argv)
* systems, a off_t is not a scalar hince we must memcpy. * systems, a off_t is not a scalar hince we must memcpy.
*/ */
printf("#define SWAP_HALF_IN_OFF_T(dest, src)\t%s%d%s\n", printf("#define SWAP_HALF_IN_OFF_T(dest, src)\t%s%d%s\n",
"memcpy((void *)(dest), (void *)(src), sizeof(",stsizelen,"))"); "memcpy((void *)(dest), (void *)(src), ", stsizelen/8, ")");
#endif /* HAVE_OFF_T_SCALAR */ #endif /* HAVE_OFF_T_SCALAR */
#endif /* CALC_BYTE_ORDER == BIG_ENDIAN */ #endif /* CALC_BYTE_ORDER == BIG_ENDIAN */
putchar('\n'); putchar('\n');
@@ -170,7 +177,11 @@ main(int argc, char **argv)
/* /*
* print the dev_t size * print the dev_t size
*/ */
#if defined(DEV_BITS)
devlen = DEV_BITS;
#else
devlen = sizeof(buf.st_dev)*8; devlen = sizeof(buf.st_dev)*8;
#endif
printf("#undef DEV_BITS\n"); printf("#undef DEV_BITS\n");
printf("#define DEV_BITS %d\n", devlen); printf("#define DEV_BITS %d\n", devlen);
#if CALC_BYTE_ORDER == BIG_ENDIAN #if CALC_BYTE_ORDER == BIG_ENDIAN
@@ -199,14 +210,18 @@ main(int argc, char **argv)
* systems, a DEV is not a scalar hince we must memcpy. * systems, a DEV is not a scalar hince we must memcpy.
*/ */
printf("#define SWAP_HALF_IN_DEV(dest, src)\t%s%d%s\n", printf("#define SWAP_HALF_IN_DEV(dest, src)\t%s%d%s\n",
"memcpy((void *)(dest), (void *)(src), sizeof(",devlen,"))"); "memcpy((void *)(dest), (void *)(src), ", devlen/8, ")");
#endif /* CALC_BYTE_ORDER == BIG_ENDIAN */ #endif /* CALC_BYTE_ORDER == BIG_ENDIAN */
putchar('\n'); putchar('\n');
/* /*
* print the ino_t size * print the ino_t size
*/ */
#if defined(INODE_BITS)
inodelen = INODE_BITS;
#else
inodelen = sizeof(buf.st_ino)*8; inodelen = sizeof(buf.st_ino)*8;
#endif
printf("#undef INODE_BITS\n"); printf("#undef INODE_BITS\n");
printf("#define INODE_BITS %d\n", inodelen); printf("#define INODE_BITS %d\n", inodelen);
#if CALC_BYTE_ORDER == BIG_ENDIAN #if CALC_BYTE_ORDER == BIG_ENDIAN
@@ -235,7 +250,7 @@ main(int argc, char **argv)
* systems, a INODE is not a scalar hince we must memcpy. * systems, a INODE is not a scalar hince we must memcpy.
*/ */
printf("#define SWAP_HALF_IN_INODE(dest, src)\t%s%d%s\n", printf("#define SWAP_HALF_IN_INODE(dest, src)\t%s%d%s\n",
"memcpy((void *)(dest), (void *)(src), sizeof(",inodelen,"))"); "memcpy((void *)(dest), (void *)(src), ", inodelen/8, ")");
#endif /* CALC_BYTE_ORDER == BIG_ENDIAN */ #endif /* CALC_BYTE_ORDER == BIG_ENDIAN */
/* exit(0); */ /* exit(0); */
return 0; return 0;

186
func.c
View File

@@ -1,7 +1,7 @@
/* /*
* func - built-in functions implemented here * func - built-in functions implemented here
* *
* Copyright (C) 1999 David I. Bell, Landon Curt Noll and Ernest Bowen * Copyright (C) 1999-2004 David I. Bell, Landon Curt Noll and Ernest Bowen
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.5 $ * @(#) $Revision: 29.15 $
* @(#) $Id: func.c,v 29.5 2000/12/04 19:32:33 chongo Exp $ * @(#) $Id: func.c,v 29.15 2004/07/26 05:55:37 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/func.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/func.c,v $
* *
* Under source code control: 1990/02/15 01:48:15 * Under source code control: 1990/02/15 01:48:15
@@ -35,6 +35,11 @@
#include <sys/types.h> #include <sys/types.h>
#include <errno.h> #include <errno.h>
#if defined(_WIN32)
# include <io.h>
# define _access access
#endif
#if defined(FUNCLIST) #if defined(FUNCLIST)
#define CONST /* disabled for FUNCLIST in case NATIVE_CC doesn't have it */ #define CONST /* disabled for FUNCLIST in case NATIVE_CC doesn't have it */
@@ -79,6 +84,7 @@
#endif #endif
#include "have_const.h" #include "have_const.h"
#include "have_unused.h"
#include "calc.h" #include "calc.h"
#include "calcerr.h" #include "calcerr.h"
#include "opcodes.h" #include "opcodes.h"
@@ -102,7 +108,7 @@
/* /*
* forward declarations * forward declarations
*/ */
static NUMBER *base_value(long mode); static NUMBER *base_value(long mode, int defval);
static int strscan(char *s, int count, VALUE **vals); static int strscan(char *s, int count, VALUE **vals);
static int filescan(FILEID id, int count, VALUE **vals); static int filescan(FILEID id, int count, VALUE **vals);
static VALUE f_eval(VALUE *vp); static VALUE f_eval(VALUE *vp);
@@ -302,7 +308,7 @@ f_display(int count, VALUE **vals)
/*ARGSUSED*/ /*ARGSUSED*/
static VALUE static VALUE
f_null(int count, VALUE **vals) f_null(int UNUSED count, VALUE UNUSED **vals)
{ {
VALUE res; VALUE res;
@@ -1220,8 +1226,10 @@ f_primetest(int count, NUMBER **vals)
{ {
/* parse args */ /* parse args */
switch (count) { switch (count) {
case 1: return itoq((long) qprimetest(vals[0], &_qone_, &_qone_)); case 1: return itoq((long) qprimetest(vals[0],
case 2: return itoq((long) qprimetest(vals[0], vals[1], &_qone_)); qlink(&_qone_), qlink(&_qone_)));
case 2: return itoq((long) qprimetest(vals[0],
vals[1], qlink(&_qone_)));
default: return itoq((long) qprimetest(vals[0], vals[1], vals[2])); default: return itoq((long) qprimetest(vals[0], vals[1], vals[2]));
} }
} }
@@ -2008,7 +2016,7 @@ f_ln(int count, VALUE **vals)
return result; return result;
} }
ctmp.real = vals[0]->v_num; ctmp.real = vals[0]->v_num;
ctmp.imag = &_qzero_; ctmp.imag = qlink(&_qzero_);
ctmp.links = 1; ctmp.links = 1;
c = cln(&ctmp, err); c = cln(&ctmp, err);
break; break;
@@ -3346,7 +3354,7 @@ f_trunc(int count, NUMBER **vals)
{ {
NUMBER *val; NUMBER *val;
val = &_qzero_; val = qlink(&_qzero_);
if (count == 2) if (count == 2)
val = vals[1]; val = vals[1];
return qtrunc(*vals, val); return qtrunc(*vals, val);
@@ -3428,7 +3436,7 @@ f_btrunc(int count, NUMBER **vals)
{ {
NUMBER *val; NUMBER *val;
val = &_qzero_; val = qlink(&_qzero_);
if (count == 2) if (count == 2)
val = vals[1]; val = vals[1];
return qbtrunc(*vals, val); return qbtrunc(*vals, val);
@@ -3533,7 +3541,7 @@ f_ceil(VALUE *val)
tmp.v_subtype = V_NOSUBTYPE; tmp.v_subtype = V_NOSUBTYPE;
tmp.v_type = V_NUM; tmp.v_type = V_NUM;
tmp.v_num = &_qone_; tmp.v_num = qlink(&_qone_);
apprvalue(val, &tmp, &tmp, &res); apprvalue(val, &tmp, &tmp, &res);
return res; return res;
} }
@@ -3550,9 +3558,9 @@ f_floor(VALUE *val)
tmp2.v_subtype = V_NOSUBTYPE; tmp2.v_subtype = V_NOSUBTYPE;
tmp1.v_type = V_NUM; tmp1.v_type = V_NUM;
tmp1.v_num = &_qone_; tmp1.v_num = qlink(&_qone_);
tmp2.v_type = V_NUM; tmp2.v_type = V_NUM;
tmp2.v_num = &_qzero_; tmp2.v_num = qlink(&_qzero_);
apprvalue(val, &tmp1, &tmp2, &res); apprvalue(val, &tmp1, &tmp2, &res);
return res; return res;
} }
@@ -4722,7 +4730,7 @@ f_list(int count, VALUE **vals)
/*ARGSUSED*/ /*ARGSUSED*/
static VALUE static VALUE
f_assoc(int count, VALUE **vals) f_assoc(int UNUSED count, VALUE UNUSED **vals)
{ {
VALUE result; VALUE result;
@@ -4922,10 +4930,14 @@ f_listremove(VALUE *vp)
static NUMBER * static NUMBER *
f_runtime(void) f_runtime(void)
{ {
#if defined(_WIN32)
return qlink(&_qzero_);
#else /* Windoz free systems */
struct tms buf; struct tms buf;
times(&buf); times(&buf);
return iitoq((long) buf.tms_utime, (long) CLK_TCK); return iitoq((long) buf.tms_utime, (long) CLK_TCK);
#endif /* Windoz free systems */
} }
@@ -4976,24 +4988,31 @@ f_fopen(VALUE *v1, VALUE *v2)
/* initialize VALUE */ /* initialize VALUE */
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
/* check for a valid mode [rwa][b+\0][b+\0] */
if (v1->v_type != V_STR || v2->v_type != V_STR) if (v1->v_type != V_STR || v2->v_type != V_STR)
return error_value(E_FOPEN1); return error_value(E_FOPEN1);
mode = v2->v_str->s_str; mode = v2->v_str->s_str;
if ((*mode != 'r') && (*mode != 'w') && (*mode != 'a')) if ((*mode != 'r') && (*mode != 'w') && (*mode != 'a'))
return error_value(E_FOPEN2); return error_value(E_FOPEN2);
if (mode[1] != '\0') { if (mode[1] != '\0') {
if (mode[1] != '+') if (mode[1] != '+' && mode[1] != 'b')
return error_value(E_FOPEN2);
if (mode[2] != '\0')
return error_value(E_FOPEN2); return error_value(E_FOPEN2);
if (mode[2] != '\0') {
if ((mode[2] != '+' && mode[2] != 'b') ||
mode[1] == mode[2])
return error_value(E_FOPEN2);
if (mode[3] != '\0')
return error_value(E_FOPEN2);
}
} }
/* try to open */
errno = 0; errno = 0;
id = openid(v1->v_str->s_str, v2->v_str->s_str); id = openid(v1->v_str->s_str, v2->v_str->s_str);
if (id == FILEID_NONE) if (id == FILEID_NONE)
return error_value(errno); return error_value(errno);
if (id < 0) if (id < 0)
return error_value(E_FOPEN3); return error_value(-id);
result.v_type = V_FILE; result.v_type = V_FILE;
result.v_file = id; result.v_file = id;
return result; return result;
@@ -5010,21 +5029,27 @@ f_freopen(int count, VALUE **vals)
/* initialize VALUE */ /* initialize VALUE */
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
/* check for a valid mode [rwa][b+\0][b+\0] */
if (vals[0]->v_type != V_FILE) if (vals[0]->v_type != V_FILE)
return error_value(E_FREOPEN1); return error_value(E_FREOPEN1);
if (vals[1]->v_type != V_STR) if (vals[1]->v_type != V_STR)
return error_value(E_FREOPEN2); return error_value(E_FREOPEN2);
mode = vals[1]->v_str->s_str; mode = vals[1]->v_str->s_str;
if ((*mode != 'r') && (*mode != 'w') && (*mode != 'a')) if ((*mode != 'r') && (*mode != 'w') && (*mode != 'a'))
return error_value(E_FREOPEN2); return error_value(E_FREOPEN2);
if (mode[1] != '\0') { if (mode[1] != '\0') {
if (mode[1] != '+') if (mode[1] != '+' && mode[1] != 'b')
return error_value(E_FREOPEN2);
if (mode[2] != '\0')
return error_value(E_FREOPEN2); return error_value(E_FREOPEN2);
if (mode[2] != '\0') {
if ((mode[2] != '+' && mode[2] != 'b') ||
mode[1] == mode[2])
return error_value(E_FOPEN2);
if (mode[3] != '\0')
return error_value(E_FREOPEN2);
}
} }
/* try to reopen */
errno = 0; errno = 0;
if (count == 2) { if (count == 2) {
id = reopenid(vals[0]->v_file, mode, NULL); id = reopenid(vals[0]->v_file, mode, NULL);
@@ -6130,10 +6155,10 @@ f_fgetfield(VALUE *vp)
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
if (vp->v_type != V_FILE) if (vp->v_type != V_FILE)
return error_value(E_FGETWORD1); return error_value(E_FGETFIELD1);
i = readid(vp->v_file, 14, &str); i = readid(vp->v_file, 14, &str);
if (i > 0) if (i > 0)
return error_value(E_FGETWORD2); return error_value(E_FGETFIELD2);
result.v_type = V_NULL; result.v_type = V_NULL;
if (i == 0) { if (i == 0) {
result.v_type = V_STR; result.v_type = V_STR;
@@ -6885,7 +6910,16 @@ f_system(VALUE *vp)
if (conf->calc_debug & CALCDBG_SYSTEM) { if (conf->calc_debug & CALCDBG_SYSTEM) {
printf("%s\n", vp->v_str->s_str); printf("%s\n", vp->v_str->s_str);
} }
result.v_num = itoq((long) system(vp->v_str->s_str)); #if defined(_WIN32)
/* if the execute length is 0 then just return 0 */
if (strlen(vp->v_str->s_str) == 0) {
result.v_num = itoq((long)0);
} else {
result.v_num = itoq((long)system(vp->v_str->s_str));
}
#else /* Windoz free systems */
result.v_num = itoq((long)system(vp->v_str->s_str));
#endif /* Windoz free systems */
return result; return result;
} }
@@ -6898,6 +6932,7 @@ f_sleep(int count, VALUE **vals)
NUMBER *q1, *q2; NUMBER *q1, *q2;
res.v_type = V_NULL; res.v_type = V_NULL;
#if !defined(_WIN32)
if (count > 0) { if (count > 0) {
if (vals[0]->v_type != V_NUM || qisneg(vals[0]->v_num)) if (vals[0]->v_type != V_NUM || qisneg(vals[0]->v_num))
return error_value(E_SLEEP); return error_value(E_SLEEP);
@@ -6928,6 +6963,7 @@ f_sleep(int count, VALUE **vals)
res.v_type = V_NUM; res.v_type = V_NUM;
res.v_num = itoq(time); res.v_num = itoq(time);
} }
#endif /* Windoz free systems */
return res; return res;
} }
@@ -6943,15 +6979,15 @@ f_base(int count, NUMBER **vals)
/* deal with just a query */ /* deal with just a query */
if (count != 1) { if (count != 1) {
return base_value(conf->outmode); return base_value(conf->outmode, conf->outmode);
} }
/* deal with the specal modes first */ /* deal with the specal modes first */
if (qisfrac(vals[0])) { if (qisfrac(vals[0])) {
return base_value(math_setmode(MODE_FRAC)); return base_value(math_setmode(MODE_FRAC), conf->outmode);
} }
if (vals[0]->num.len > 64/BASEB) { if (vals[0]->num.len > 64/BASEB) {
return base_value(math_setmode(MODE_EXP)); return base_value(math_setmode(MODE_EXP), conf->outmode);
} }
/* set the base, if possible */ /* set the base, if possible */
@@ -6979,7 +7015,61 @@ f_base(int count, NUMBER **vals)
} }
/* return the old base */ /* return the old base */
return base_value(oldbase); return base_value(oldbase, conf->outmode);
}
/*
* set the default secondary output base/mode
*/
static NUMBER *
f_base2(int count, NUMBER **vals)
{
long base; /* output base/mode */
long oldbase=0; /* output base/mode */
/* deal with just a query */
if (count != 1) {
return base_value(conf->outmode2, conf->outmode2);
}
/* deal with the specal modes first */
if (qisfrac(vals[0])) {
return base_value(math_setmode2(MODE_FRAC), conf->outmode2);
}
if (vals[0]->num.len > 64/BASEB) {
return base_value(math_setmode2(MODE_EXP), conf->outmode2);
}
/* set the base, if possible */
base = qtoi(vals[0]);
switch (base) {
case 0:
oldbase = math_setmode2(MODE2_OFF);
break;
case -10:
oldbase = math_setmode2(MODE_INT);
break;
case 2:
oldbase = math_setmode2(MODE_BINARY);
break;
case 8:
oldbase = math_setmode2(MODE_OCTAL);
break;
case 10:
oldbase = math_setmode2(MODE_REAL);
break;
case 16:
oldbase = math_setmode2(MODE_HEX);
break;
default:
math_error("Unsupported base");
/*NOTREACHED*/
break;
}
/* return the old base */
return base_value(oldbase, conf->outmode2);
} }
@@ -6987,14 +7077,14 @@ f_base(int count, NUMBER **vals)
* return a numerical 'value' of the mode/base * return a numerical 'value' of the mode/base
*/ */
static NUMBER * static NUMBER *
base_value(long mode) base_value(long mode, int defval)
{ {
NUMBER *result; NUMBER *result;
/* return the old base */ /* return the old base */
switch (mode) { switch (mode) {
case MODE_DEFAULT: case MODE_DEFAULT:
switch (conf->outmode) { switch (defval) {
case MODE_DEFAULT: case MODE_DEFAULT:
result = itoq(10); result = itoq(10);
break; break;
@@ -7021,6 +7111,9 @@ base_value(long mode)
case MODE_BINARY: case MODE_BINARY:
result = itoq(2); result = itoq(2);
break; break;
case MODE2_OFF:
result = itoq(0);
break;
default: default:
result = itoq(0); result = itoq(0);
break; break;
@@ -7049,6 +7142,9 @@ base_value(long mode)
case MODE_BINARY: case MODE_BINARY:
result = itoq(2); result = itoq(2);
break; break;
case MODE2_OFF:
result = itoq(0);
break;
default: default:
result = itoq(0); result = itoq(0);
break; break;
@@ -7268,6 +7364,7 @@ f_free(int count, VALUE **vals)
return result; return result;
} }
static VALUE static VALUE
f_freeglobals(void) f_freeglobals(void)
{ {
@@ -7281,6 +7378,7 @@ f_freeglobals(void)
return result; return result;
} }
static VALUE static VALUE
f_freeredc(void) f_freeredc(void)
{ {
@@ -7688,6 +7786,20 @@ f_argv(int count, VALUE **vals)
} }
static VALUE
f_version(void)
{
VALUE result;
/* return the calc verstion string */
result.v_type = V_STR;
result.v_subtype = V_NOSUBTYPE;
result.v_str = makestring(strdup(version()));
return result;
}
#endif /* !FUNCLIST */ #endif /* !FUNCLIST */
@@ -7774,6 +7886,8 @@ static CONST struct builtin builtins[] = {
"arithmetic mean of values"}, "arithmetic mean of values"},
{"base", 0, 1, 0, OP_NOP, f_base, 0, {"base", 0, 1, 0, OP_NOP, f_base, 0,
"set default output base"}, "set default output base"},
{"base2", 0, 1, 0, OP_NOP, f_base2, 0,
"set default secondary output base"},
{"bernoulli", 1, 1, 0, OP_NOP, 0, f_bern, {"bernoulli", 1, 1, 0, OP_NOP, 0, f_bern,
"Bernoulli number for index a"}, "Bernoulli number for index a"},
{"bit", 2, 2, 0, OP_BIT, 0, 0, {"bit", 2, 2, 0, OP_BIT, 0, 0,
@@ -7913,7 +8027,7 @@ static CONST struct builtin builtins[] = {
{"free", 0, IN, FA, OP_NOP, 0, f_free, {"free", 0, IN, FA, OP_NOP, 0, f_free,
"free listed or all global variables"}, "free listed or all global variables"},
{"freebernoulli", 0, 0, 0, OP_NOP, 0, f_freebern, {"freebernoulli", 0, 0, 0, OP_NOP, 0, f_freebern,
"free stored Benoulli numbers"}, "free stored Bernoulli numbers"},
{"freeeuler", 0, 0, 0, OP_NOP, 0, f_freeeuler, {"freeeuler", 0, 0, 0, OP_NOP, 0, f_freeeuler,
"free stored Euler numbers"}, "free stored Euler numbers"},
{"freeglobals", 0, 0, 0, OP_NOP, 0, f_freeglobals, {"freeglobals", 0, 0, 0, OP_NOP, 0, f_freeglobals,
@@ -8231,7 +8345,7 @@ static CONST struct builtin builtins[] = {
{"sizeof", 1, 1, 0, OP_NOP, 0, f_sizeof, {"sizeof", 1, 1, 0, OP_NOP, 0, f_sizeof,
"number of octets used to hold the value"}, "number of octets used to hold the value"},
{"sleep", 0, 1, 0, OP_NOP, 0, f_sleep, {"sleep", 0, 1, 0, OP_NOP, 0, f_sleep,
"suspend operatioo for a seconds"}, "suspend operation for a seconds"},
{"sort", 1, 1, 0, OP_NOP, 0, f_sort, {"sort", 1, 1, 0, OP_NOP, 0, f_sort,
"sort a copy of a matrix or list"}, "sort a copy of a matrix or list"},
{"sqrt", 1, 3, 0, OP_NOP, 0, f_sqrt, {"sqrt", 1, 3, 0, OP_NOP, 0, f_sqrt,
@@ -8290,6 +8404,8 @@ static CONST struct builtin builtins[] = {
"truncate a to b number of decimal places"}, "truncate a to b number of decimal places"},
{"ungetc", 2, 2, 0, OP_NOP, 0, f_ungetc, {"ungetc", 2, 2, 0, OP_NOP, 0, f_ungetc,
"unget char read from file"}, "unget char read from file"},
{"version", 0, 0, 0, OP_NOP, 0, f_version,
"calc version string"},
{"xor", 1, IN, 0, OP_NOP, 0, f_xor, {"xor", 1, IN, 0, OP_NOP, 0, f_xor,
"logical xor"}, "logical xor"},

13
func.h
View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: func.h,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: func.h,v 29.4 2001/06/08 21:00:58 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/func.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/func.h,v $
* *
* Under source code control: 1990/02/15 01:48:33 * Under source code control: 1990/02/15 01:48:33
@@ -32,8 +32,13 @@
#define __FUNC_H__ #define __FUNC_H__
#include "calc.h" #if defined(CALC_SRC) /* if we are building from the calc source tree */
#include "label.h" # include "calc.h"
# include "label.h"
#else
# include <calc/calc.h>
# include <calc/label.h>
#endif
/* /*

17
hash.c
View File

@@ -1,7 +1,7 @@
/* /*
* hash - one-way hash routines * hash - one-way hash routines
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999-2002 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.3 $ * @(#) $Revision: 29.6 $
* @(#) $Id: hash.c,v 29.3 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: hash.c,v 29.6 2004/02/25 23:55:38 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/hash.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/hash.c,v $
* *
* Under source code control: 1995/11/23 05:13:11 * Under source code control: 1995/11/23 05:13:11
@@ -911,6 +911,7 @@ hash_value(int type, void *v, HASH *state)
(USB8 *)value->v_rand->buffer, SLEN*FULL_BITS/8); (USB8 *)value->v_rand->buffer, SLEN*FULL_BITS/8);
state = hash_int(type, value->v_rand->j, state); state = hash_int(type, value->v_rand->j, state);
state = hash_int(type, value->v_rand->k, state); state = hash_int(type, value->v_rand->k, state);
state = hash_int(type, value->v_rand->need_to_skip, state);
(state->update)(state, (state->update)(state,
(USB8 *)value->v_rand->slot, SCNT*FULL_BITS/8); (USB8 *)value->v_rand->slot, SCNT*FULL_BITS/8);
(state->update)(state, (state->update)(state,
@@ -940,6 +941,7 @@ hash_value(int type, void *v, HASH *state)
/* hash the CONFIG state */ /* hash the CONFIG state */
state = hash_int(type, value->v_config->outmode, state); state = hash_int(type, value->v_config->outmode, state);
state = hash_int(type, value->v_config->outmode2, state);
state = hash_long(type,(long)value->v_config->outdigits, state); state = hash_long(type,(long)value->v_config->outdigits, state);
state = hash_number(type, value->v_config->epsilon, state); state = hash_number(type, value->v_config->epsilon, state);
state = hash_long(type, state = hash_long(type,
@@ -983,6 +985,15 @@ hash_value(int type, void *v, HASH *state)
state = hash_int(type, value->v_config->ctrl_d, state); state = hash_int(type, value->v_config->ctrl_d, state);
state = hash_str(type, value->v_config->program, state); state = hash_str(type, value->v_config->program, state);
state = hash_str(type, value->v_config->base_name, state); state = hash_str(type, value->v_config->base_name, state);
state = hash_bool(type, value->v_config->windows, state);
state = hash_bool(type, value->v_config->cygwin, state);
state = hash_bool(type, value->v_config->compile_custom, state);
if (value->v_config->allow_custom != NULL &&
*(value->v_config->allow_custom)) {
state = hash_bool(type, TRUE, state);
} else {
state = hash_bool(type, FALSE, state);
}
state = hash_str(type, value->v_config->version, state); state = hash_str(type, value->v_config->version, state);
break; break;

19
hash.h
View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.2 $ * @(#) $Revision: 29.4 $
* @(#) $Id: hash.h,v 29.2 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: hash.h,v 29.4 2001/06/08 21:00:58 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/hash.h,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/hash.h,v $
* *
* Under source code control: 1995/11/14 23:57:45 * Under source code control: 1995/11/14 23:57:45
@@ -33,10 +33,17 @@
#define __HASH_H__ #define __HASH_H__
#include "shs.h" #if defined(CALC_SRC) /* if we are building from the calc source tree */
#include "shs1.h" # include "shs.h"
#include "md5.h" # include "shs1.h"
#include "zmath.h" # include "md5.h"
# include "zmath.h"
#else
# include <calc/shs.h>
# include <calc/shs1.h>
# include <calc/md5.h>
# include <calc/zmath.h>
#endif
/* MAX_CHUNKSIZE is the largest chunksize of any hash */ /* MAX_CHUNKSIZE is the largest chunksize of any hash */

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.1 $ * @(#) $Revision: 29.2 $
* @(#) $Id: have_fpos_pos.c,v 29.1 2000/12/17 11:25:22 chongo Exp $ * @(#) $Id: have_fpos_pos.c,v 29.2 2001/03/18 03:00:11 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/have_fpos_pos.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/have_fpos_pos.c,v $
* *
* Under source code control: 2000/12/17 01:23 * Under source code control: 2000/12/17 01:23
@@ -51,8 +51,17 @@ main(void)
printf("#define HAVE_FPOS_POS 1 /* yes */\n\n"); printf("#define HAVE_FPOS_POS 1 /* yes */\n\n");
/* determine __pos element size */ /* determine __pos element size */
printf("#undef FPOS_POS_BITS\n"); printf("#undef FPOS_POS_BITS\t/* no */\n");
# if defined(FPOS_POS_BITS)
printf("#define FPOS_POS_BITS %d\n\n", FPOS_POS_BITS);
# else
printf("#define FPOS_POS_BITS %d\n\n", sizeof(pos.__pos)*8); printf("#define FPOS_POS_BITS %d\n\n", sizeof(pos.__pos)*8);
# endif
#else
/* we have no __pos element */
printf("#undef HAVE_FPOS_POS\t/* no */\n");
printf("#undef FPOS_POS_BITS\n");
#endif #endif
/* exit(0); */ /* exit(0); */
return 0; return 0;

89
have_unused.c Normal file
View File

@@ -0,0 +1,89 @@
/*
* have_unused - Determine if we want or can support the unused attribute
*
* Copyright (C) 2004 Landon Curt Noll
*
* Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* @(#) $Revision: 29.2 $
* @(#) $Id: have_unused.c,v 29.2 2004/02/23 08:35:42 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/have_unused.c,v $
*
* Under source code control: 2004/02/22 22:36:10
* File existed as early as: 2004
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* usage:
* have_unused
*
* Not all compilers support the unused attribute, so this may not compile
* on your system.
*
* This prog outputs several defines:
*
* HAVE_UNUSED
* defined ==> ok to use unused
* undefined ==> do not use unused
*
* UNUSED
* unused ==> use unused
* (nothing) ==> unused not used
*/
#include <stdio.h>
#if !defined(HAVE_NO_UNUSED)
/* make sure that we can use the __attribute__((unused)) in #define's */
#undef UNUSED
#define UNUSED __attribute__((unused))
/*
* unused_str - a function with an unused argument
*/
static char *
unused_str(char UNUSED *str)
{
return "__attribute__((unused))";
}
#endif /* !HAVE_NO_UNUSED */
int
main(void)
{
#if defined(HAVE_NO_UNUSED)
printf("#undef HAVE_UNUSED /* no */\n");
printf("#undef UNUSED\n");
printf("#define UNUSED /* no */\n");
#else /* HAVE_NO_UNUSED */
printf("#define HAVE_UNUSED /* yes */\n");
printf("#undef UNUSED\n");
printf("#define UNUSED %s /* yes */\n", unused_str(NULL));
#endif /* HAVE_NO_UNUSED */
/* exit(0); */
return 0;
}

23
help.c
View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
* *
* @(#) $Revision: 29.4 $ * @(#) $Revision: 29.8 $
* @(#) $Id: help.c,v 29.4 2000/06/07 14:02:13 chongo Exp $ * @(#) $Id: help.c,v 29.8 2001/04/08 08:29:28 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/help.c,v $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/help.c,v $
* *
* Under source code control: 1997/09/14 10:58:30 * Under source code control: 1997/09/14 10:58:30
@@ -42,6 +42,11 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#if defined(_WIN32)
# define popen _popen
# define pclose _pclose
#endif
/* /*
* some help topics are symbols, so we alias them to nice filenames * some help topics are symbols, so we alias them to nice filenames
@@ -57,6 +62,7 @@ static struct help_alias {
{".", "oldvalue"}, {".", "oldvalue"},
{"%", "mod"}, {"%", "mod"},
{"//", "quo"}, {"//", "quo"},
{"copy", "blkcpy"},
{"copying", "COPYING"}, {"copying", "COPYING"},
{"copying-lgpl", "COPYING-LGPL"}, {"copying-lgpl", "COPYING-LGPL"},
{"copying_lgpl", "COPYING-LGPL"}, {"copying_lgpl", "COPYING-LGPL"},
@@ -65,6 +71,13 @@ static struct help_alias {
{"COPYRIGHT", "copyright"}, {"COPYRIGHT", "copyright"},
{"Copyleft", "copyright"}, {"Copyleft", "copyright"},
{"COPYLEFT", "copyright"}, {"COPYLEFT", "copyright"},
{"read", "command"},
{"write", "command"},
{"quit", "command"},
{"exit", "command"},
{"abort", "command"},
{"cd", "command"},
{"show", "command"},
{"stdlib", "resource"}, {"stdlib", "resource"},
{NULL, NULL} {NULL, NULL}
}; };
@@ -105,7 +118,11 @@ page_file(FILE *stream)
/* /*
* form a write pipe to a pager * form a write pipe to a pager
*/ */
cmd = popen(pager, "w"); if (pager == NULL || pager[0] == '\0') {
cmd = stdout;
} else {
cmd = popen(pager, "w");
}
if (cmd == NULL) { if (cmd == NULL) {
fprintf(stderr, "unable form pipe to pager: %s", pager); fprintf(stderr, "unable form pipe to pager: %s", pager);
return; return;

View File

@@ -2,7 +2,7 @@
# #
# help - makefile for calc help files # help - makefile for calc help files
# #
# Copyright (C) 1999 Landon Curt Noll # Copyright (C) 1999-2002 Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# #
# @(#) $Revision: 29.5 $ # @(#) $Revision: 29.25 $
# @(#) $Id: Makefile,v 29.5 2000/12/14 10:33:06 chongo Exp $ # @(#) $Id: Makefile,v 29.25 2004/07/28 12:21:05 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/help/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/cmd/calc/help/RCS/Makefile,v $
# #
# Under source code control: 1991/07/23 06:47:57 # Under source code control: 1991/07/23 06:47:57
@@ -36,15 +36,120 @@
SHELL= /bin/sh SHELL= /bin/sh
MAKE_FILE = Makefile MAKE_FILE = Makefile
####
# Normally, the upper level makefile will set these values. We provide # Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory. # a default here just in case you want to build from this directory.
# ####
TOPDIR= /usr/local/lib
#TOPDIR= /usr/lib
#TOPDIR= /usr/libdata
LIBDIR= ${TOPDIR}/calc # Where the system include (.h) files are kept
HELPDIR= ${LIBDIR}/help #
# For DJGPP, select:
#
# INCDIR= /dev/env/DJDIR/include
#
# If in doubt, set:
#
# INCDIR= /usr/include
#
#INCDIR= /usr/local/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# where to install calc realted things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
# ${CALC_SHAREDIR} where to install calc help, .cal, startup, config files
#
# NOTE: The install rule prepends installation paths with $T, which
# by default is empty. If $T is non-empty, then installation
# locations will be relative to the $T directory.
#
# For DJGPP, select:
#
# BINDIR= /dev/env/DJDIR/bin
# LIBDIR= /dev/env/DJDIR/lib
# CALC_SHAREDIR= /dev/env/DJDIR/share/calc
#
# If in doubt, set:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= /usr/local/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= /usr/local/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= /usr/local/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
# By default, these values are based CALC_SHAREDIR, INCDIR, BINDIR
# ---------------------------------------------------------------
# ${HELPDIR} where the help directory is installed
# ${CALC_INCDIR} where the calc include files are installed
# ${CUSTOMCALDIR} where custom *.cal files are installed
# ${CUSTOMHELPDIR} where custom help files are installed
# ${CUSTOMINCPDIR} where custom .h files are installed
# ${SCRIPTDIR} where calc shell scripts are installed
#
# NOTE: The install rule prepends installation paths with $T, which
# by default is empty. If $T is non-empty, then installation
# locations will be relative to the $T directory.
#
# If in doubt, set:
#
# HELPDIR= ${CALC_SHAREDIR}/help
# CALC_INCDIR= ${INCDIR}/calc
# CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
# CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
# CUSTOMINCDIR= ${CALC_INCDIR}/custom
# SCRIPTDIR= ${BINDIR}/cscript
#
HELPDIR= ${CALC_SHAREDIR}/help
CALC_INCDIR= ${INCDIR}/calc
CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
CUSTOMINCDIR= ${CALC_INCDIR}/custom
SCRIPTDIR= ${BINDIR}/cscript
# T - top level directory under which calc will be installed
#
# The calc install is performed under $T, the calc build is
# performed under /. The purpose for $T is to allow someone
# to install calc somewhere other than into the system area.
#
# For example, if:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
# and if:
#
# T= /var/tmp/testing
#
# Then the installation locations will be:
#
# calc binary files: /var/tmp/testing/usr/bin
# calc link library: /var/tmp/testing/usr/lib
# calc help, .cal ...: /var/tmp/testing/usr/share/calc
# ... etc ... /var/tmp/testing/...
#
# If $T is empty, calc is installed under /, which is the same
# top of tree for which it was built. If $T is non-empty, then
# calc is installed under $T, as if one had to chroot under
# $T for calc to operate.
#
# If in doubt, use T=
#
T=
# Makefile debug # Makefile debug
# #
@@ -63,6 +168,20 @@ CHMOD= chmod
SED= sed SED= sed
SORT= sort SORT= sort
FMT= fmt FMT= fmt
CMP= cmp
# Some out of date operating systems require / want an executable to
# end with a certain file extension. Some compile systems such as
# Cygwin build calc as calc.exe. The EXT variable is used to denote
# the extension required by such.
#
# EXT= # normal Un*x / Linux / GNU/Linux systems
# EXT=.exe # windoz / Cygwin
#
# If in doubt, use EXT=
#
EXT=
#EXT=.exe
# Standard and Builtin help files # Standard and Builtin help files
# #
@@ -140,12 +259,12 @@ BLT_HELP_FILES= ${BLT_HELP_FILES_3} ${BLT_HELP_FILES_5} \
# This list is prodiced by the detaillist rule when no WARNINGS are detected. # This list is prodiced by the detaillist rule when no WARNINGS are detected.
# #
DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \ DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \
appr arg argv arrow asec asech asin asinh assign atan atan2 atanh avg \ appr arg argv arrow asec asech asin asinh assign atan atan2 atanh \
base bernoulli bit blk blkcpy blkfree blocks bround btrunc calc_tty \ avg base base2 bernoulli bit blk blkcpy blkfree blocks bround btrunc \
calclevel catalan ceil cfappr cfsim char cmdbuf cmp comb conj cos \ calc_tty calclevel catalan ceil cfappr cfsim char cmdbuf cmp comb \
cosh cot coth count cp csc csch ctime delete den dereference det \ conj cos cosh cot coth count cp csc csch ctime delete den dereference \
digit digits dp epsilon errcount errmax errno error euler eval \ det digit digits display dp epsilon errcount errmax errno error euler \
exp fact factor fclose fcnt feof ferror fflush fgetc fgetfield \ eval exp fact factor fclose fcnt feof ferror fflush fgetc fgetfield \
fgetline fgets fgetstr fib files floor fopen forall fprintf fputc \ fgetline fgets fgetstr fib files floor fopen forall fprintf fputc \
fputs fputstr frac free freebernoulli freeeuler freeglobals freeredc \ fputs fputstr frac free freebernoulli freeeuler freeglobals freeredc \
freestatics frem freopen fscan fscanf fseek fsize ftell gcd gcdrem \ freestatics frem freopen fscan fscanf fseek fsize ftell gcd gcdrem \
@@ -164,7 +283,7 @@ DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \
runtime saveval scale scan scanf search sec sech seed segment select \ runtime saveval scale scan scanf search sec sech seed segment select \
sgn sha sha1 sin sinh size sizeof sleep sort sqrt srand srandom \ sgn sha sha1 sin sinh size sizeof sleep sort sqrt srand srandom \
ssq str strcat strerror strlen strpos strprintf strscan strscanf \ ssq str strcat strerror strlen strpos strprintf strscan strscanf \
substr sum swap system tail tan tanh test time trunc xor substr sum swap system tail tan tanh test time trunc version xor
# This list is of files that are clones of DETAIL_HELP files. They are # This list is of files that are clones of DETAIL_HELP files. They are
# built from DETAIL_HELP files. # built from DETAIL_HELP files.
@@ -238,7 +357,8 @@ changes: ../CHANGES
libcalc: ../LIBRARY libcalc: ../LIBRARY
rm -f $@ rm -f $@
${SED} -e 's:$${LIBDIR}:${LIBDIR}:g' < ../LIBRARY > $@ ${SED} -e 's:$${LIBDIR}:${LIBDIR}:g' \
-e 's:$${CALC_INCDIR}:${CALC_INCDIR}:g' < ../LIBRARY > $@
${CHMOD} 0444 $@ ${CHMOD} 0444 $@
-@if [ -z "${Q}" ]; then \ -@if [ -z "${Q}" ]; then \
echo ''; \ echo ''; \
@@ -389,11 +509,13 @@ full: ${FULL_HELP_FILES} ${MAKE_FILE}
# Singular files are the same files as their plural form. # Singular files are the same files as their plural form.
# #
${SINGULAR_FILES}: ${PLURAL_FILES} ${SINGULAR_FILES}: ${PLURAL_FILES}
${Q}for i in ${SINGULAR_FILES}; do \ ${Q}for i in ${SINGULAR_FILES} /dev/null; do \
echo "rm -f $${i}"; \ if [ X"$$i" != X"/dev/null" ]; then \
rm -f $${i}; \ echo "rm -f $${i}"; \
echo "cp $${i}s $${i}"; \ rm -f $${i}; \
cp $${i}s $${i}; \ echo "cp $${i}s $${i}"; \
cp $${i}s $${i}; \
fi; \
done done
-@if [ -z "${Q}" ]; then \ -@if [ -z "${Q}" ]; then \
echo ''; \ echo ''; \
@@ -425,12 +547,13 @@ builtin: builtin.top builtin.end ../func.c funclist.sed
${Q}echo "forming builtin help file" ${Q}echo "forming builtin help file"
-${Q}rm -f funclist.c -${Q}rm -f funclist.c
${Q}${SED} -n -f funclist.sed ../func.c > funclist.c ${Q}${SED} -n -f funclist.sed ../func.c > funclist.c
-${Q}rm -f funclist.o funclist -${Q}rm -f funclist.o funclist${EXT}
${Q}${LCC} ${ICFLAGS} -DFUNCLIST -I/usr/include -I.. funclist.c -c ${Q}${LCC} ${ICFLAGS} -DFUNCLIST -I/usr/include \
${Q}${LCC} ${ILDFLAGS} funclist.o -o funclist -I.. funclist.c -c 2>/dev/null
${Q}${LCC} ${ILDFLAGS} funclist.o -o funclist${EXT}
-${Q}rm -f builtin -${Q}rm -f builtin
${Q}cat builtin.top > builtin ${Q}cat builtin.top > builtin
${Q}./funclist | \ ${Q}./funclist${EXT} | \
${SED} -e 's/^/ /' -e 's/[ ][ ]*$$//' >> builtin ${SED} -e 's/^/ /' -e 's/[ ][ ]*$$//' >> builtin
${Q}cat builtin.end >> builtin ${Q}cat builtin.end >> builtin
${Q}echo "builtin help file formed" ${Q}echo "builtin help file formed"
@@ -453,9 +576,11 @@ builtin: builtin.top builtin.end ../func.c funclist.sed
## ##
distlist: ${DISTLIST} distlist: ${DISTLIST}
${Q}for i in ${DISTLIST}; do \ ${Q}for i in ${DISTLIST} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo help/$$i; \ echo help/$$i; \
done | ${SORT} fi; \
done | LANG=C ${SORT}
distdir: distdir:
${Q}echo help ${Q}echo help
@@ -479,57 +604,95 @@ bsdi: all
# #
detaillist: detaillist:
${Q}-(echo "xxxxx"; \ ${Q}-(echo "xxxxx"; \
for i in ${DETAIL_HELP}; do \ for i in ${DETAIL_HELP} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
if [ ! -f RCS/$$i,v ]; then \ if [ ! -f RCS/$$i,v ]; then \
echo "WARNING: $$i not under RCS control" 1>&2; \ echo "WARNING: $$i not under RCS control" 1>&2; \
else \ else \
echo $$i; \ echo $$i; \
fi; \ fi; \
done | ${SORT}) | ${FMT} -70 | \ fi; \
done | LANG=C ${SORT}) | ${FMT} -70 | \
${SED} -e '1s/xxxxx/DETAIL_HELP=/' -e '2,$$s/^/ /' \ ${SED} -e '1s/xxxxx/DETAIL_HELP=/' -e '2,$$s/^/ /' \
-e 's/$$/ \\/' -e '$$s/ \\$$//' -e 's/$$/ \\/' -e '$$s/ \\$$//'
##
#
# rpm rules
#
##
echo_inst_files:
${Q}for i in ${STD_HELP_FILES} full ${BLT_HELP_FILES} \
builtin ${DETAIL_HELP} ${SINGULAR_FILES} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo __file__ ${HELPDIR}/$$i; \
fi; \
done
${Q}echo __file__ ${HELPDIR}/obj
##
#
# Utility rules
#
##
clean: clean:
rm -f obj mkbuiltin funclist.c funclist.o funclist rm -f obj mkbuiltin funclist.c funclist.o funclist${EXT}
rm -f COPYING COPYING-LGPL rm -f COPYING COPYING-LGPL
clobber: clobber:
rm -f ${BLT_HELP_FILES} full .all calc rm -f ${BLT_HELP_FILES} full .all calc
rm -f obj mkbuiltin funclist.c funclist.o funclist rm -f obj mkbuiltin funclist.c funclist.o funclist${EXT}
rm -f COPYING COPYING-LGPL rm -f COPYING COPYING-LGPL
rm -f ${SINGULAR_FILES} ${DETAIL_CLONE} rm -f ${SINGULAR_FILES} ${DETAIL_CLONE}
install: all install: all
-${Q}if [ ! -d ${TOPDIR} ]; then \ -${Q}if [ ! -d $T${CALC_SHAREDIR} ]; then \
echo mkdir ${TOPDIR}; \ echo mkdir $T${CALC_SHAREDIR}; \
mkdir ${TOPDIR}; \ mkdir $T${CALC_SHAREDIR}; \
if [ ! -d "$T${CALC_SHAREDIR}" ]; then \
echo mkdir -p "$T${CALC_SHAREDIR}"; \
mkdir -p "$T${CALC_SHAREDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${CALC_SHAREDIR}; \
${CHMOD} 0755 $T${CALC_SHAREDIR}; \
else \ else \
true; \ true; \
fi fi
-${Q}if [ ! -d ${LIBDIR} ]; then \ -${Q}if [ ! -d $T${HELPDIR} ]; then \
echo mkdir ${LIBDIR}; \ echo mkdir $T${HELPDIR}; \
mkdir ${LIBDIR}; \ mkdir $T${HELPDIR}; \
if [ ! -d "$T${HELPDIR}" ]; then \
echo mkdir -p "$T${HELPDIR}"; \
mkdir -p "$T${HELPDIR}"; \
fi; \
echo ${CHMOD} 0755 $T${HELPDIR}; \
${CHMOD} 0755 $T${HELPDIR}; \
else \ else \
true; \ true; \
fi fi
-${Q}if [ ! -d ${HELPDIR} ]; then \ -${Q}for i in ${STD_HELP_FILES} ${BLT_HELP_FILES} builtin \
echo mkdir ${HELPDIR}; \ full ${DETAIL_HELP} ${SINGULAR_FILES} /dev/null; do \
mkdir ${HELPDIR}; \ if [ "$$i" = "/dev/null" ]; then \
else \ continue; \
true; \ fi; \
fi if ${CMP} -s $$i $T${HELPDIR}/$$i; then \
${Q}for i in ${STD_HELP_FILES} ${BLT_HELP_FILES} builtin \ true; \
full ${DETAIL_HELP} ${SINGULAR_FILES}; do \ else \
echo rm -f ${HELPDIR}/$$i; \ rm -f $T${HELPDIR}/$$i.new; \
rm -f ${HELPDIR}/$$i; \ cp -f $$i $T${HELPDIR}/$$i.new; \
echo cp $$i ${HELPDIR}; \ ${CHMOD} 0444 $T${HELPDIR}/$$i.new; \
cp $$i ${HELPDIR}; \ mv -f $T${HELPDIR}/$$i.new $T${HELPDIR}/$$i; \
echo ${CHMOD} 0444 ${HELPDIR}/$$i; \ echo "installed $T${HELPDIR}/$$i"; \
${CHMOD} 0444 ${HELPDIR}/$$i; \ fi; \
done done
rm -f ${HELPDIR}/obj -${Q}if ${CMP} -s obj.file $T${HELPDIR}/obj; then \
cp obj.file ${HELPDIR}/obj true; \
${CHMOD} 0444 ${HELPDIR}/obj else \
${Q}echo remove files that are obsolete rm -f $T${HELPDIR}/obj.new; \
-rm -f rmblk block stdlib cp -f obj.file $T${HELPDIR}/obj.new; \
-rm -f ${HELPDIR}/rmblk ${HELPDIR}/block ${HELPDIR}/stdlib ${CHMOD} 0444 $T${HELPDIR}/obj.new; \
mv -f $T${HELPDIR}/obj.new $T${HELPDIR}/obj; \
echo "installed $T${HELPDIR}/obj"; \
fi

View File

@@ -23,7 +23,7 @@ DESCRIPTION
0 <= i < sizeof(B). &B[i] then returns the address at which this 0 <= i < sizeof(B). &B[i] then returns the address at which this
octet is located until the block is freed or relocated. Freeing octet is located until the block is freed or relocated. Freeing
of an unnamed block B occurs when a new value is assigned to B or of an unnamed block B occurs when a new value is assigned to B or
when B ceases to exist; a named block B is freed by blkfree(B(). when B ceases to exist; a named block B is freed by blkfree(B).
A block is relocated when an operation like copying to B requires A block is relocated when an operation like copying to B requires
a change of sizeof(B). a change of sizeof(B).
@@ -70,18 +70,18 @@ DESCRIPTION
> p = &"abc" > p = &"abc"
> A = "abc" > A = "abc"
The address &*A of the value of A will be equal to p. the address &*A of the value of A will be equal to p.
Except in cases like strcat(A, "") when *A identified with a literal Except in cases like strcat(A, "") when *A identified with a literal
string as above, definitions of string values using strcat() or substr() string as above, definitions of string values using strcat() or substr()
will copy the relevant strings to newly allocated addresses which will will copy the relevant strings to newly allocated addresses which will
be useable only while the variables retain these defined values. be useable only while the variables retain these defined values.
For example, 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 &*B and &*C will be different. If p is defined by p = &*B, p should
not be used after a mew value is assigned to B, or B ceases to exist, not be used after a new value is assigned to B, or B ceases to exist,
etc. etc.
When compilation of a function encounters for the first time a particular When compilation of a function encounters for the first time a particular
@@ -117,7 +117,7 @@ DESCRIPTION
> A = B = C = f(2); > A = B = C = f(2);
which, not only performs the addition n f() only once, but stores the which, not only performs the addition in f() only once, but stores the
number values for A, B and C at the same address. number values for A, B and C at the same address.
Whether a value V is a pointer and if so, its type, is indicated by the Whether a value V is a pointer and if so, its type, is indicated by the
@@ -176,8 +176,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: address,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: address,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/address,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/address,v $
## ##
## Under source code control: 1997/09/06 20:03:34 ## Under source code control: 1997/09/06 20:03:34

View File

@@ -13,7 +13,7 @@ TYPES
DESCRIPTION DESCRIPTION
p->X returns the same as (*p).X. Thus the current value of *p is p->X returns the same as (*p).X. Thus the current value of *p is
to be an object of a type for which X identifies one element. to be an object of a type for which X identifies one element.
p->X then returns the lvalue corresponding to that element of of the p->X then returns the lvalue corresponding to that element of the
value of *p. value of *p.
The expression *p.X will cause a runtime error since this is The expression *p.X will cause a runtime error since this is
@@ -66,8 +66,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: arrow,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: arrow,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arrow,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arrow,v $
## ##
## Under source code control: 1997/09/06 20:03:34 ## Under source code control: 1997/09/06 20:03:34

View File

@@ -14,7 +14,7 @@ DESCRIPTION
Returns the asin of x to a multiple of eps with error less in Returns the asin of x to a multiple of eps with error less in
absolute value than .75 * eps. absolute value than .75 * eps.
v = asin(x) is the number in [-p1/2, pi/2] for which sin(v) = x. v = asin(x) is the number in [-pi/2, pi/2] for which sin(v) = x.
EXAMPLE EXAMPLE
> print asin(.5, 1e-5), asin(.5, 1e-10), asin(.5, 1e-15), asin(.5, 1e-20) > print asin(.5, 1e-5), asin(.5, 1e-10), asin(.5, 1e-15), asin(.5, 1e-20)
@@ -45,8 +45,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: asin,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: asin,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asin,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asin,v $
## ##
## Under source code control: 1994/03/19 01:40:24 ## Under source code control: 1994/03/19 01:40:24

View File

@@ -32,10 +32,9 @@ DESCRIPTION
may have different numbers (between 1 and 4 inclusive) of indices, may have different numbers (between 1 and 4 inclusive) of indices,
and these indices need not be integers in specified ranges. and these indices need not be integers in specified ranges.
Assignments of a null value Assignment of a null value to an element of an association does not
to an element of an association does not delete the element, but delete the element, but a later reference to that element will return
a later reference to that element will return the null value as if the null value as if the element is undefined.
the element is undefined.
The elements of an association are stored in a hash table for The elements of an association are stored in a hash table for
quick access. The index values are hashed to select the correct quick access. The index values are hashed to select the correct
@@ -99,8 +98,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: assoc,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: assoc,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/assoc,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/assoc,v $
## ##
## Under source code control: 1994/09/25 20:22:31 ## Under source code control: 1994/09/25 20:22:31

View File

@@ -14,7 +14,7 @@ DESCRIPTION
Returns the atan of x to a multiple of eps with error less in Returns the atan of x to a multiple of eps with error less in
absolute value than .75 * eps. absolute value than .75 * eps.
v = atan(x) is the number in (-p1/2, pi/2) for which tan(v) = x. v = atan(x) is the number in (-pi/2, pi/2) for which tan(v) = x.
EXAMPLE EXAMPLE
> print atan(2, 1e-5), atan(2, 1e-10), atan(2, 1e-15), atan(2, 1e-20) > print atan(2, 1e-5), atan(2, 1e-10), atan(2, 1e-15), atan(2, 1e-20)
@@ -45,8 +45,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: atan,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: atan,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atan,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/atan,v $
## ##
## Under source code control: 1994/03/19 01:40:25 ## Under source code control: 1994/03/19 01:40:25

View File

@@ -57,7 +57,7 @@ DESCRIPTION
base(1e20) base(2^64) base(2^8191-1) base(1e20) base(2^64) base(2^8191-1)
However the base() function will only return one of the base values However the base() function will only return one of the base values
lised in the table above. listed in the table above.
EXAMPLE EXAMPLE
> base() > base()
@@ -79,7 +79,7 @@ LINK LIBRARY
MODE_REAL, MODE_EXP, MODE_HEX, MODE_OCTAL, MODE_BINARY MODE_REAL, MODE_EXP, MODE_HEX, MODE_OCTAL, MODE_BINARY
SEE ALSO SEE ALSO
config base2, config, str
## Copyright (C) 1999 Landon Curt Noll ## Copyright (C) 1999 Landon Curt Noll
## ##
@@ -97,8 +97,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.5 $
## @(#) $Id: base,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: base,v 29.5 2002/12/29 09:17:54 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/base,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/base,v $
## ##
## Under source code control: 1994/09/30 00:09:39 ## Under source code control: 1994/09/30 00:09:39

120
help/base2 Normal file
View File

@@ -0,0 +1,120 @@
NAME
base2 - set 2nd output base
SYNOPSIS
base2([mode])
TYPES
mode real
return real
DESCRIPTION
By default, calc will output values according to the default base
as controlled by the base() builtin function.
The base2() builtin function, if given a non-zero argument, enables
double base output mode. In double base output mode, calc values
are displayed twice, once according to base() and again according
to base2(). In double base output mode, the second time a value is
displayed, it is displayed within comments:
21701 /* 0x54c5 */
The arguments for base2() are identical to base() with the addition
of the 0 value:
base2 equivalent
config("mode2")'s
2 "binary" base 2 fractions
"bin"
8 "octal" base 8 fractions
"oct"
10 "real" base 10 floating point
"float"
"default"
-10 "integer" base 10 integers
"int"
16 "hexadecimal" base 16 fractions
"hex"
1/3 "fraction" base 10 fractions
"frac"
1e20 "scientific" base 10 scientific notation
"sci"
"exp"
0 "off" disable double base output
For convenience, any non-integer non-zero value is assumed to mean
base 10 fractions and any integer >= 2^64 is assumed to mean base 10
scientific notation.
These base2() calls have the same meaning as config("mode2", "fraction"):
base2(1/3) base2(0.1415) base2(16/37)
These base2() calls have the same meaning as config("mode2", "scientific"):
base2(1e20) base2(2^64) base2(2^8191-1)
However the base2() function will only return one of the base values
listed in the table above.
EXAMPLE
> base2()
0
> base2(8)
0 /* 0 */
> print 10
10 /* 012 */
> base2(16),
> 131072
131072 /* 0x20000 */
> 2345
2345 /* 0x929 */
LIMITS
none
LINK LIBRARY
int math_setmode2(int newmode)
NOTE: newmode must be one of MODE_DEFAULT, MODE_FRAC, MODE_INT,
MODE_REAL, MODE_EXP, MODE_HEX, MODE_OCTAL, MODE_BINARY,
MODE2_OFF
SEE ALSO
base, config, str
## Copyright (C) 2002 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: 1.3 $
## @(#) $Id: base2,v 1.3 2002/12/29 09:17:54 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/base2,v $
##
## Under source code control: 2002/12/29 00:21:07
## File existed as early as: 2002
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

View File

@@ -15,7 +15,7 @@ DESCRIPTION
t/(exp(t) - 1) = Sum B_n * t^n/n! t/(exp(t) - 1) = Sum B_n * t^n/n!
bernouuli(n) is zero both for n < 0 and for n odd and > 2. bernoulli(n) is zero both for n < 0 and for n odd and > 2.
When bernoulli(n) is computed for positive even n, the values for When bernoulli(n) is computed for positive even n, the values for
n and smaller positive even indices are stored in a table so that n and smaller positive even indices are stored in a table so that
a later call to bernoulli(k) with 0 <= k < n will be executed quickly. a later call to bernoulli(k) with 0 <= k < n will be executed quickly.
@@ -57,8 +57,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.4 $ ## @(#) $Revision: 29.5 $
## @(#) $Id: bernoulli,v 29.4 2000/12/17 12:27:58 chongo Exp $ ## @(#) $Id: bernoulli,v 29.5 2002/07/10 11:47:04 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bernoulli,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/bernoulli,v $
## ##
## Under source code control: 2000/07/13 01:33:00 ## Under source code control: 2000/07/13 01:33:00

View File

@@ -122,7 +122,7 @@ DESCRIPTION
Named blocks are assigned index numbers 0, 1, 2, ..., in the order Named blocks are assigned index numbers 0, 1, 2, ..., in the order
of their creation. The block with index id is returned by blocks(id). of their creation. The block with index id is returned by blocks(id).
With no argument, blocks() returns the number of current unfreed With no argument, blocks() returns the number of current unfreed
named blocks. A named block may be used named blocks.
The memory allocated to a named block is freed by the blkfree() The memory allocated to a named block is freed by the blkfree()
function with argument the named block, its name, or its id number. function with argument the named block, its name, or its id number.
@@ -234,8 +234,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: blk,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: blk,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blk,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blk,v $
## ##
## Under source code control: 1997/04/05 13:07:13 ## Under source code control: 1997/04/05 13:07:13

View File

@@ -1,5 +1,5 @@
NAME NAME
blocks - return a named file or number of unfreed named blocks blocks - return a named block or number of unfreed named blocks
SYNOPSIS SYNOPSIS
blocks([id]) blocks([id])
@@ -58,8 +58,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: blocks,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: blocks,v 29.3 2002/07/10 11:47:04 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blocks,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/blocks,v $
## ##
## Under source code control: 1997/04/05 13:07:13 ## Under source code control: 1997/04/05 13:07:13

View File

@@ -16,6 +16,7 @@ Configuration parameters
"epsilon" sets error value for transcendentals. "epsilon" sets error value for transcendentals.
"maxprint" sets maximum number of elements printed. "maxprint" sets maximum number of elements printed.
"mode" sets printout mode. "mode" sets printout mode.
"mode2" sets 2nd base printout mode.
"mul2" sets size for alternative multiply. "mul2" sets size for alternative multiply.
"sq2" sets size for alternative squaring. "sq2" sets size for alternative squaring.
"pow2" sets size for alternate powering. "pow2" sets size for alternate powering.
@@ -47,6 +48,10 @@ Configuration parameters
"ctrl_d" The interactive meaning of ^D (Control D) "ctrl_d" The interactive meaning of ^D (Control D)
"program" Read-only calc program or shell script path "program" Read-only calc program or shell script path
"basename" Read-only basename of the program value "basename" Read-only basename of the program value
"windows" Read-only indicator of MS windows
"cygwin" TRUE=>calc compiled with cygwin, Read-only
"compile_custom" TRUE=>calc was compiled with custom functions
"allow_custom" TRUE=>custom functions are enabled
"version" Read-only calc version "version" Read-only calc version
The "all" config value allows one to save/restore the configuration The "all" config value allows one to save/restore the configuration
@@ -183,6 +188,7 @@ Detailed config descriptions
=-= =-=
config("mode", "mode_string") config("mode", "mode_string")
config("mode2", "mode_string")
The "mode" parameter is a string specifying the mode for printing of The "mode" parameter is a string specifying the mode for printing of
numbers by the unformatted print functions, and the default numbers by the unformatted print functions, and the default
@@ -218,7 +224,17 @@ Detailed config descriptions
Where multiple strings are given, the first string listed is what Where multiple strings are given, the first string listed is what
config("mode") will return. config("mode") will return.
The default "mode" is "real". The "mode2" controls the double base output. When set to a value
other than "off", calc outputs files in both the "base" mode as
well as the "base2" mode. The "mode2" value may be any of the
"mode" values with the addition of:
"off" disable 2nd base output mode base2(0)
The base() builtin function sets and returns the "mode" value.
The base2() builtin function sets and returns the "mode2" value.
The default "mode" is "real". The default "mode2" is "off".
=-= =-=
@@ -509,7 +525,9 @@ Detailed config descriptions
5 Report on changes to the run state of calc. 5 Report on changes to the run state of calc.
Bits >= 6 are reserved for future use and should not be used at this time. 6 Report on rand() subtractive 100 shuffle generator issues.
Bits >= 7 are reserved for future use and should not be used at this time.
By default, "calc_debug" is 0. The initial value may be overridden By default, "calc_debug" is 0. The initial value may be overridden
by the -D command line option. by the -D command line option.
@@ -537,7 +555,10 @@ Detailed config descriptions
is displayed. is displayed.
2 Show func will display more information about a functions 2 Show func will display more information about a functions
arguments as well as more argument sdummary information. arguments and argument summary information.
3 During execution, allow calc standard resource files
to output additional debugging information.
The value for config("resource_debug") in both oldstd and newstd is 3, 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. but if calc is invoked with the -d flag, its initial value is zero.
@@ -574,12 +595,14 @@ Detailed config descriptions
The "verbose_quit" controls the print of the message: The "verbose_quit" controls the print of the message:
Quit or abort executed quit or abort executed
when a non-interactive quit or abort without an argument is encountered. when a non-interactive quit or abort without an argument is encountered.
A quit of abort without an argument does not display a message when A quit of abort without an argument does not display a message when
invoked at the interactive level. invoked at the interactive level.
By deafult, "verbose_quit" is false.
=-= =-=
config("ctrl_d", "ctrl_d_string") config("ctrl_d", "ctrl_d_string")
@@ -674,6 +697,57 @@ Detailed config descriptions
=-= =-=
config("windows") <== NOTE: This is a read-only config value
Returns TRUE if you are running on a MS windows system, false if you
are running on an operating system that does not hate you.
This config parameter is read-only and cannot be set.
=-=
config("cygwin") <== NOTE: This is a read-only config value
Returns TRUE if you calc was compiled with cygwin, false otherwise.
This config parameter is read-only and cannot be set.
=-=
config("compile_custom") <== NOTE: This is a read-only config value
Returns TRUE if you calc was compiled with -DCUSTOM. By default,
the calc Makefile uses ALLOW_CUSTOM= -DCUSTOM so by default
config("compile_custom") is TRUE. If, however, calc is compiled
without -DCUSTOM, then config("compile_custom") will be FALSE.
The config("compile_custom") value is only affected by compile
flags. The calc -D runtime command line option does not change
the config("compile_custom") value.
See also config("allow_custom").
This config parameter is read-only and cannot be set.
=-=
config("allow_custom") <== NOTE: This is a read-only config value
Returns TRUE if you custom functions are enabled. To allow the use
of custom functions, calc must be compiled with -DCUSTOM (which it
is by default) AND calc run be run with the -D runtime command line
option (which it is not by default).
If config("allow_custom") is TRUE, then custom functions are allowed.
If config("allow_custom") is FALSE, then custom functions are not
allowed.
See also config("compile_custom").
This config parameter is read-only and cannot be set.
=-=
config("version") <== NOTE: This is a read-only config value config("version") <== NOTE: This is a read-only config value
The version string of the calc program can be obtained by: The version string of the calc program can be obtained by:
@@ -698,8 +772,8 @@ Detailed config descriptions
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.10 $
## @(#) $Id: config,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: config,v 29.10 2004/07/27 23:45:52 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/config,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/config,v $
## ##
## Under source code control: 1991/07/21 04:37:17 ## Under source code control: 1991/07/21 04:37:17

View File

@@ -35,24 +35,41 @@ If your change is large, you should send entire files (either
as a diff -c /dev/null your-file patch, or as a uuencoded and as a diff -c /dev/null your-file patch, or as a uuencoded and
gziped (or compressed) tar file). gziped (or compressed) tar file).
You should send submissions to: To contribute code, scripts, resource files and/or to help please
join the low volume calc mailing list by sending EMail to:
calc-contrib at asthe dot com calc-contrib at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] [[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]] [[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
Your subject must contain the words:
calc mailing list subscription
You may have additional words in your subject line.
Feel free to follow the name line with additional EMail text as desired.
Thanks for considering submitting code to calc. Calc is a collective Thanks for considering submitting code to calc. Calc is a collective
work by a number of people. It would not be what it is today without work by a number of people. It would not be what it is today without
your efforts and submissions! your efforts and submissions!
Calc bug reports, however, should be sent to: =-=
Calc bug reports and calc bug fixes should be sent to:
calc-bugs at asthe dot com calc-bugs at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] [[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]] [[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
Your subject must contain the words:
calc bug report
You may have additional words in your subject line.
See the BUGS file or try the help command: See the BUGS file or try the help command:
help bugs help bugs
@@ -61,26 +78,10 @@ for details on bug reporting.
=-= =-=
One may join the calc testing group by sending a request to:
calc-tester-request at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
Your message body (not the subject) should consist of:
subscribe calc-tester address
end
name your_full_name
where "address" is your EMail address and "your_full_name"
is your full name.
Landon Curt Noll Landon Curt Noll
http://www.isthe.com/chongo/ http://www.isthe.com/chongo/
chongo <was here> /\../\ chongo (share and enjoy) /\../\
## Copyright (C) 1999 Landon Curt Noll ## Copyright (C) 1999 Landon Curt Noll
## ##
@@ -98,8 +99,8 @@ chongo <was here> /\../\
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.4 $
## @(#) $Id: contrib,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: contrib,v 29.4 2001/06/01 11:37:14 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/contrib,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/contrib,v $
## ##
## Under source code control: 1997/03/09 16:33:22 ## Under source code control: 1997/03/09 16:33:22

View File

@@ -11,20 +11,38 @@ TYPES
return integer return integer
DESCRIPTION DESCRIPTION
Returns the least non-negative integer n for which abs(x) < b^n. Returns number of digits in the standard base-b representation
when x is truncated to an integer and the sign is ignored.
digits(x, b) = 0 if and only if abs(x) < 1. To be more precise: when abs(int(x)) > 0, this function returns
the value 1 + ilog(x, b). When abs(int(x)) == 0, then this
function returns the value 1.
For real x with absolute value >= 1, digits(x, b) is the number If omitted, b is assumed to be 10. If given, b must be an
of digits in the standard base-b "decimal" representation of int(abs(x)); integer > 1.
this is also given by 1 + ilog(x, b).
One should remember these special cases:
digits(12.3456) == 2 computes with the integer part only
digits(-1234) == 4 computes with the absolute value only
digits(0) == 1 specical case
digits(-0.123) == 1 combination of all of the above
EXAMPLE EXAMPLE
> print digits(0), digits(0.0123), digits(3.7), digits(-27), digits(-99.7) > print digits(100), digits(23209), digits(2^72)
0 0 1 2 2 3 5 22
> print digits(0), digits(1), digits(-1)
1 1 1
> print digits(-1234), digits(12.3456), digits(107.207)
4 2 3
> print digits(17^463-1, 17), digits(10000, 100), digits(21701, 2)
3, 15 14
LIMITS LIMITS
none b > 1
LINK LIBRARY LINK LIBRARY
long qdigits(NUMBER *q, ZVALUE base) long qdigits(NUMBER *q, ZVALUE base)
@@ -32,7 +50,7 @@ LINK LIBRARY
SEE ALSO SEE ALSO
digit, places digit, places
## Copyright (C) 1999 Landon Curt Noll ## Copyright (C) 1999-2003 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -48,8 +66,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.3 $ ## @(#) $Revision: 29.5 $
## @(#) $Id: digits,v 29.3 2000/12/14 10:32:24 chongo Exp $ ## @(#) $Id: digits,v 29.5 2003/01/26 19:41:35 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/digits,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/digits,v $
## ##
## Under source code control: 1995/10/03 10:40:01 ## Under source code control: 1995/10/03 10:40:01

81
help/display Normal file
View File

@@ -0,0 +1,81 @@
NAME
display - set and/or return decimal digits for displaying numbers
SYNOPSIS
display([d])
TYPES
d integer >= 0
return integer
DESCRIPTION
When given an argument, this function sets the maximum number of
digits after the decimal point to be printed in real or exponential
mode in normal unformatted printing (print, strprint, fprint) or in
formatted printing (printf, strprintf, fprintf) when precision is
not specified. The return value is the previous display digit value.
When given no arguments, this function returns the current
display digit value.
The builtin function:
display(d)
display()
is an alias for:
config("display", d)
config("display")
The display digit value does not change the stored value of a number.
It only changes how a stored value is displayed.
Where rounding is necessary to display up to d decimal places,
the type of rounding to be used is controlled by config("outround").
EXAMPLE
> print display(), 2/3
20 ~0.66666666666666666667
> print display(40), 2/3
20 ~0.6666666666666666666666666666666666666667
> print display(5), 2/3
40 ~0.66667
LIMITS
d >= 0
LINK LIBRARY
none
SEE ALSO
config
## Copyright (C) 2004 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 29.1 $
## @(#) $Id: display,v 29.1 2004/07/26 06:54:41 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/display,v $
##
## Under source code control: 2004/07/25 23:50:40
## File existed as early as: 2004
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

View File

@@ -9,11 +9,11 @@ Environment variables
If this variable does not exist, a compiled value If this variable does not exist, a compiled value
is used. Typically compiled in value is: is used. Typically compiled in value is:
.:./cal:~/cal:${LIBDIR}/calc:${LIBDIR}/custom .:./cal:~/cal:${CALC_SHAREDIR}:${CUSTOMCALDIR}
where ${LIBDIR} is usually: which is usually:
/usr/local/lib/calc .:./cal:~/cal:/usr/share/calc:/usr/share/calc/custom
This value is used by the READ command. It is an error This value is used by the READ command. It is an error
if no such readable file is found. if no such readable file is found.
@@ -30,11 +30,11 @@ Environment variables
If this variable does not exist, a compiled value If this variable does not exist, a compiled value
is used. Typically compiled in value is: is used. Typically compiled in value is:
${LIBDIR}/startup:~/.calcrc ${CALC_SHAREDIR}/startup:~/.calcrc:./.calcinit
where ${LIBDIR} is usually: which is usually:
/usr/local/lib/calc /usr/share/calc/startup:~/.calcrc:./.calcinit
Missing files along the $CALCRC path are silently ignored. Missing files along the $CALCRC path are silently ignored.
@@ -104,8 +104,8 @@ Environment variables
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: environment,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: environment,v 29.3 2004/07/26 07:10:43 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/environment,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/environment,v $
## ##
## Under source code control: 1991/07/23 05:47:25 ## Under source code control: 1991/07/23 05:47:25

View File

@@ -15,9 +15,39 @@ DESCRIPTION
opened for either reading, writing, or appending. The mode opened for either reading, writing, or appending. The mode
is controlled by the mode flag as follows: is controlled by the mode flag as follows:
"r" reading allow allow file is positioned file(*)
"w" writing mode reading writing truncated at mode
"a" appending ---- ------- ------- --------- --------- ----
r Y N N beginning text
rb Y N N beginning binary
r+ Y N N beginning text
r+b Y N N beginning binary
rb+ Y N N beginning binary
w N Y Y beginning text
wb N Y Y beginning binary
w+ Y Y Y beginning text
w+b Y Y Y beginning binary
wb+ Y Y Y beginning binary
a N Y Y end text
ab N Y Y end binary
a+ Y Y Y end text
a+b Y Y Y end binary
ab+ Y Y Y end binary
(*) NOTE on 'b' / binary/text mode:
The 'b' or fopen binary mode has no effect on POSIX / Linux
/ Un*x-like systems. On those systems a text file is the
same as a binary file (as it should be for any modern-day
operating system). Adding 'b' to an fopen has no effect
and is ignored.
Some non-POSIX systems sucn as MS Windoz treat text files
and binary files differently. In text mode MS Windoz consider
"\r\n" and end-of-line character. On an Apple MAC, the
text mode end-of-line character is "\r".
Names of files are subject to ~ expansion just like the C or Names of files are subject to ~ expansion just like the C or
Korn shell. For example, the file name: Korn shell. For example, the file name:
@@ -90,8 +120,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: fopen,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: fopen,v 29.3 2001/04/10 21:46:45 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/fopen,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/fopen,v $
## ##
## Under source code control: 1994/10/27 03:04:17 ## Under source code control: 1994/10/27 03:04:17

View File

@@ -1,5 +1,5 @@
NAME NAME
freebernoulli - free stored Benoulli numbers freebernoulli - free stored Bernoulli numbers
SYNOPSIS SYNOPSIS
freebernoulli() freebernoulli()
@@ -39,8 +39,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: freebernoulli,v 29.2 2000/07/17 15:36:26 chongo Exp $ ## @(#) $Id: freebernoulli,v 29.3 2004/07/26 05:54:00 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/freebernoulli,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/freebernoulli,v $
## ##
## Under source code control: 2000/07/13 ## Under source code control: 2000/07/13

View File

@@ -1,5 +1,5 @@
NAME NAME
hash - FNV-1 hash value hash - return the calc hash value
SYNOPSIS SYNOPSIS
hash(x_1 [, x_2, x_3, ...]) hash(x_1 [, x_2, x_3, ...])
@@ -12,27 +12,16 @@ TYPES
DESCRIPTION DESCRIPTION
Returns a hash value for one or more values of arbitrary types. Returns a hash value for one or more values of arbitrary types.
The basis of this hash algorithm was taken from an idea sent The calc hash value is based on the core Fowler/Noll/Vo hash
as reviewer comments to the IEEE POSIX P1003.2 committee by: known as FNV-1. The return value, however, cannot be used
as an FNV hash value because calc's internal function also
takes into account more abstract concepts such as data types.
Phong Vo (http://www.research.att.com/info/kpv/) See:
Glenn Fowler (http://www.research.att.com/~gsf/)
In a subsequent ballot round:
Landon Curt Noll (http://www.isthe.com/chongo/)
improved on their algorithm. Some people tried this hash
and found that it worked rather well. In an EMail message
to Landon, they named it ``Fowler/Noll/Vo'' or the FNV hash.
FNV hashes are architected to be fast while maintaining a low
collision rate. The FNV speed allows one to quickly hash lots
of data while maintaining a reasonable collision rate. See:
http://www.isthe.com/chongo/tech/comp/fnv/ http://www.isthe.com/chongo/tech/comp/fnv/
for more details as well as other forms of the FNV hash. information about the Fowler/Noll/Vo (FNV) hash.
EXAMPLE EXAMPLE
> a = isqrt(2e1000); s = "xyz"; > a = isqrt(2e1000); s = "xyz";
@@ -48,7 +37,7 @@ LINK LIBRARY
SEE ALSO SEE ALSO
sha, sha1, md5 sha, sha1, md5
## Copyright (C) 1999 Landon Curt Noll ## Copyright (C) 1999-2003 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -64,8 +53,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: hash,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: hash,v 29.3 2003/03/01 01:16:02 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/hash,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/hash,v $
## ##
## Under source code control: 1996/03/12 23:10:01 ## Under source code control: 1996/03/12 23:10:01

View File

@@ -20,7 +20,7 @@ LIMITS
none none
LINK LIBRARY LINK LIBRARY
COMPLEX *cimag(COMPLEX *x) COMPLEX *c_imag(COMPLEX *x)
SEE ALSO SEE ALSO
re re
@@ -41,8 +41,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: im,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: im,v 29.3 2002/03/12 09:38:26 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/im,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/im,v $
## ##
## Under source code control: 1995/10/05 04:52:26 ## Under source code control: 1995/10/05 04:52:26

View File

@@ -16,6 +16,9 @@ DESCRIPTION
places(x,b) = 0 if and only if x is an integer. places(x,b) = 0 if and only if x is an integer.
If omitted, b is assumed to be 10. If given, b must be an
integer > 1.
places(x,b) = n > 0 if and only if the fractional part of abs(x) places(x,b) = n > 0 if and only if the fractional part of abs(x)
has a finite base-b "decimal" representation with n digits of which has a finite base-b "decimal" representation with n digits of which
the last digit is nonzero. This occurs if and only if every prime the last digit is nonzero. This occurs if and only if every prime
@@ -29,7 +32,7 @@ EXAMPLE
-1 3 1 -1 3 1
LIMITS LIMITS
none b > 1
LINK LIBRARY LINK LIBRARY
long qplaces(NUMBER *q, ZVALUE base) long qplaces(NUMBER *q, ZVALUE base)
@@ -37,7 +40,7 @@ LINK LIBRARY
SEE ALSO SEE ALSO
digit, digits digit, digits
## Copyright (C) 1999 Landon Curt Noll ## Copyright (C) 1999-2003 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -53,8 +56,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.4 $ ## @(#) $Revision: 29.5 $
## @(#) $Id: places,v 29.4 2000/12/17 12:27:58 chongo Exp $ ## @(#) $Id: places,v 29.5 2003/01/26 19:43:45 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/places,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/places,v $
## ##
## Under source code control: 1995/10/03 10:40:02 ## Under source code control: 1995/10/03 10:40:02

View File

@@ -1,5 +1,5 @@
NAME NAME
rand - additive 55 shuffle pseudo-random number generator rand - subtractive 100 shuffle pseudo-random number generator
SYNOPSIS SYNOPSIS
rand([[min, ] max]) rand([[min, ] max])
@@ -11,7 +11,7 @@ TYPES
return integer return integer
DESCRIPTION DESCRIPTION
Generate a pseudo-random number using an additive 55 shuffle generator. Generate a pseudo-random number using an subtractive 100 shuffle generator.
We return a pseudo-random number over the half closed interval [min,max). We return a pseudo-random number over the half closed interval [min,max).
By default, min is 0 and max is 2^64. By default, min is 0 and max is 2^64.
@@ -38,36 +38,40 @@ DESCRIPTION
when seeded with the same seed. when seeded with the same seed.
The rand generator has two distinct parts, the additive 55 method The rand generator has two distinct parts, the subtractive 100 method
and the shuffle method. The additive 55 method is described in: and the shuffle method. The subtractive 100 method is described in:
"The Art of Computer Programming - Seminumerical Algorithms" "The Art of Computer Programming - Seminumerical Algorithms",
by Knuth, Vol 2, 2nd edition (1981), Section 3.2.2, page 27, Vol 2, 3rd edition (1998), Section 3.6, page 186, formula (2).
Algorithm A.
The period and other properties of the additive 55 method The "use only the first 100 our of every 1009" is described in
Knuth's "The Art of Computer Programming - Seminumerical Algorithms",
Vol 2, 3rd edition (1998), Section 3.6, page 188".
The period and other properties of the subtractive 100 method
make it very useful to 'seed' other generators. make it very useful to 'seed' other generators.
The shuffle method is feed values by the additive 55 method. The shuffle method is feed values by the subtractive 100 method.
The shuffle method is described in: The shuffle method is described in:
"The Art of Computer Programming - Seminumerical Algorithms" "The Art of Computer Programming - Seminumerical Algorithms",
by Knuth, Vol 2, 2nd edition (1981), Section 3.2.2, page 32, Vol 2, 3rd edition (1998), Section 3.2.2, page 34, Algorithm B.
Algorithm B.
The rand generator has a good period, and is fast. It is reasonable as The rand generator has a good period, and is fast. It is reasonable as
generators go, though there are better ones available. The shuffle generators go, though there are better ones available. The shuffle
method has a very good period, and is fast. It is fairly good as method has a very good period, and is fast. It is fairly good as
generators go, particularly when it is feed reasonably random generators go, particularly when it is feed reasonably random
numbers. Because of this, we use feed values from the additive 55 numbers. Because of this, we use feed values from the subtractive 100
method into the shuffle method. method into the shuffle method.
The rand generator uses two internal tables: The rand generator uses two internal tables:
additive table - 55 entries of 64 bits used by the additive 55 method additive table - 100 entries of 64 bits used by the subtractive
100 method
shuffle table - 256 entries of 64 bits used by the shuffle method shuffle table - 256 entries of 64 bits used by the shuffle method
feed by the additive 55 method from the additive table feed by the subtractive 100 method from the
subtractive table
The goals of this generator are: The goals of this generator are:
@@ -95,21 +99,21 @@ DESCRIPTION
a standard against which other generators may be measured. a standard against which other generators may be measured.
The Rand book of numbers was groups into groups of 20 digits. The The Rand book of numbers was groups into groups of 20 digits. The
first 55 groups < 2^64 were used to initialize the default additive first 100 groups < 2^64 were used to initialize the default additive
table. The size of 20 digits was used because 2^64 is 20 digits table. The size of 20 digits was used because 2^64 is 20 digits
long. The restriction of < 2^64 was used to prevent modulus biasing. long. The restriction of < 2^64 was used to prevent modulus biasing.
The shuffle table size is longer than the 100 entries recommended The shuffle table size is longer than the 100 entries recommended
by Knuth. We use a power of 2 shuffle table length so that the by Knuth. We use a power of 2 shuffle table length so that the
shuffle process can select a table entry from a new additive 55 shuffle process can select a table entry from a new subtractive 100
value by extracting its low order bits. The value 256 is convenient value by extracting its low order bits. The value 256 is convenient
in that it is the size of a byte which allows for easy extraction. in that it is the size of a byte which allows for easy extraction.
We use the upper byte of the additive 55 value to select the We use the upper byte of the subtractive 100 value to select the
shuffle table entry because it allows all of 64 bits to play a part shuffle table entry because it allows all of 64 bits to play a part
in the entry selection. If we were to select a lower 8 bits in the in the entry selection. If we were to select a lower 8 bits in the
64 bit value, carries that propagate above our 8 bits would not 64 bit value, carries that propagate above our 8 bits would not
impact the additive 55 generator output. impact the subtractive 100 generator output.
It is 'nice' when a seed of "n" produces a 'significantly different' It is 'nice' when a seed of "n" produces a 'significantly different'
sequence than a seed of "n+1". Generators, by convention, assign sequence than a seed of "n+1". Generators, by convention, assign
@@ -161,7 +165,7 @@ DESCRIPTION
The values 'a' and 'c for randreseed64 are taken from the Rand book The values 'a' and 'c for randreseed64 are taken from the Rand book
of numbers. Because m=2^64 is 20 decimal digits long, we will of numbers. Because m=2^64 is 20 decimal digits long, we will
search the Rand book of numbers 20 at a time. We will skip any of search the Rand book of numbers 20 at a time. We will skip any of
the 55 values that were used to initialize the additive 55 the 100 values that were used to initialize the subtractive 100
generators. The values obtained from the Rand book are: generators. The values obtained from the Rand book are:
a = 6316878969928993981 a = 6316878969928993981
@@ -190,36 +194,40 @@ DESCRIPTION
The truly paranoid might suggest that my claims in the MAGIC NUMBERS The truly paranoid might suggest that my claims in the MAGIC NUMBERS
section are a lie intended to entrap people. Well they are not, but section are a lie intended to entrap people. Well they are not, but
you need not take my (Landon Curt Noll) word for it. if you that paranoid why would you use a non-cryprographically strong
pseudo-random number generator in the first place? You would be
better off using the random() builtin function.
The random numbers from the Rand book of random numbers can be The two constants that were picked from the Rand Book of Random Numbers
The random numbers from the Rand Book of Random Numbers can be
verified by anyone who obtains the book. As these numbers were verified by anyone who obtains the book. As these numbers were
created before I (Landon Curt Noll) was born (you can look up my created before I (Landon Curt Noll) was born (you can look up
birth record if you want), I claim to have no possible influence on my birth record if you want), I claim to have no possible influence
their generation. on their generation.
There is a very slight chance that the electronic copy of the There is a very slight chance that the electronic copy of the
Rand book that I was given access to differs from the printed text. Rand Book of Random Numbers that I was given access to differs
I am willing to provide access to this electronic copy should from the printed text. I am willing to provide access to this
anyone wants to compare it to the printed text. electronic copy should anyone wants to compare it to the printed text.
When using the a55 generator, one may select your own 55 additive When using the s100 generator, one may select your own 100 subtractive
values by calling: values by calling:
srand(mat55) srand(mat100)
and avoid using my magic numbers. Of course, you must pick good and avoid using my magic numbers. The randreseed64 process is NOT
additive 55 values yourself! applied to the matrix values. Of course, you must pick good subtractive
100 values yourself!
EXAMPLE EXAMPLE
> print srand(0), rand(), rand(), rand() > print srand(0), rand(), rand(), rand()
RAND state 14384206130809570460 10173010522823332484 5713611208311484212 RAND state 2298441576805697181 3498508396312845423 5031615567549397476
> print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123) > print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123)
17 104 74 47 48 46 106 59 99 99 25 88
> print rand(2,12), rand(2^50,3^50), rand(0,2), rand(-400000, 120000) > print rand(2,12), rand(2^50,3^50), rand(0,2), rand(-400000, 120000)
11 170570393286648531699560 1 -96605 2 658186291252503497642116 1 -324097
LIMITS LIMITS
min < max min < max
@@ -248,8 +256,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: rand,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: rand,v 29.3 2001/04/14 22:46:33 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/rand,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/rand,v $
## ##
## Under source code control: 1996/01/01 02:16:09 ## Under source code control: 1996/01/01 02:16:09

View File

@@ -20,7 +20,7 @@ LIMITS
none none
LINK LIBRARY LINK LIBRARY
COMPLEX *cimag(COMPLEX *x) COMPLEX *c_imag(COMPLEX *x)
SEE ALSO SEE ALSO
im im
@@ -41,8 +41,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: re,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: re,v 29.3 2002/03/12 09:38:26 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/re,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/re,v $
## ##
## Under source code control: 1995/10/05 04:52:27 ## Under source code control: 1995/10/05 04:52:27

View File

@@ -144,9 +144,9 @@ Calc shell scripts
For systems that support interpreter files, essentially the For systems that support interpreter files, essentially the
same thing may be done more efficiently by using calc as an same thing may be done more efficiently by using calc as an
interpreter. Assuming the full path for calc is interpreter. Assuming the full path for calc is
/usr/bin/calc, one could use the file addall3 with contents /usr/local/bin/calc, one could use the file addall3 with contents
#!/usr/bin/calc -q -s -f #!/usr/local/bin/calc -q -s -f
global i, n, s; global i, n, s;
n = argv(); n = argv();
for (i = 1; i <= n; i++) for (i = 1; i <= n; i++)
@@ -166,7 +166,7 @@ Calc shell scripts
or what is essentially an interpreter equivalent sqrts2: or what is essentially an interpreter equivalent sqrts2:
#!/usr/bin/calc -q -f #!/usr/local/bin/calc -q -f
global s; global s;
while (scanf('%s', s) == 1) while (scanf('%s', s) == 1)
print sqrt(eval(s)); print sqrt(eval(s));
@@ -283,8 +283,8 @@ For more information use the following calc commands:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.4 $ ## @(#) $Revision: 29.5 $
## @(#) $Id: script,v 29.4 2000/07/17 15:36:26 chongo Exp $ ## @(#) $Id: script,v 29.5 2001/04/08 07:56:32 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/script,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/script,v $
## ##
## Under source code control: 1999/11/30 05:29:48 ## Under source code control: 1999/11/30 05:29:48

View File

@@ -19,9 +19,9 @@ DESCRIPTION
is almost certainly non-chaotic. This function is likely not is almost certainly non-chaotic. This function is likely not
suitable for applications (such as cryptographic applications) suitable for applications (such as cryptographic applications)
where the unpredictability of seeds is critical. For such critical where the unpredictability of seeds is critical. For such critical
applications, lavarand should be used. See the URL: applications, LavaRnd should be used. See the URL:
http://lavarand.sgi.com/index.html http://www.LavaRnd.org/
for information about seeding a pseudo-random number generator for information about seeding a pseudo-random number generator
(such as rand() or random()) with the cryptographic hash of the (such as rand() or random()) with the cryptographic hash of the
@@ -67,8 +67,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: seed,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: seed,v 29.3 2001/05/13 13:26:26 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/seed,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/seed,v $
## ##
## Under source code control: 1999/10/03 10:04:29 ## Under source code control: 1999/10/03 10:04:29

View File

@@ -1,5 +1,5 @@
NAME NAME
srand - seed the additive 55 shuffle pseudo-random number generator srand - seed the subtractive 100 shuffle pseudo-random number generator
SYNOPSIS SYNOPSIS
srand([seed]) srand([seed])
@@ -10,43 +10,43 @@ TYPES
return rand state return rand state
DESCRIPTION DESCRIPTION
Seed the pseudo-random number using an additive 55 shuffle generator. Seed the pseudo-random number using an subtractive 100 shuffle generator.
For integer seed != 0: For integer seed != 0:
Any buffered rand generator bits are flushed. The additive table Any buffered rand generator bits are flushed. The subtractive table
for the rand generator is loaded with the default additive table. for the rand generator is loaded with the default subtractive table.
The low order 64 bits of seed is xor-ed against each table value. The low order 64 bits of seed is xor-ed against each table value.
The additive table is shuffled according to seed/2^64. The subtractive table is shuffled according to seed/2^64.
The following calc code produces the same effect on the internal The following calc code produces the same effect on the internal
additive table: subtractive table:
/* reload default additive table xor-ed with low 64 seed bits */ /* reload default subtractive table xor-ed with low 64 seed bits */
seed_xor = seed & ((1<<64)-1); seed_xor = seed & ((1<<64)-1);
for (i=0; i < 55; ++i) { for (i=0; i < 100; ++i) {
additive[i] = xor(default_additive[i], seed_xor); subtractive[i] = xor(default_subtractive[i], seed_xor);
} }
/* shuffle the additive table */ /* shuffle the subtractive table */
seed >>= 64; seed >>= 64;
for (i=55; seed > 0 && i > 0; --i) { for (i=100; seed > 0 && i > 0; --i) {
quomod(seed, i+1, seed, j); quomod(seed, i+1, seed, j);
swap(additive[i], additive[j]); swap(subtractive[i], subtractive[j]);
} }
Seed must be >= 0. All seed values < 0 are reserved for future use. Seed must be >= 0. All seed values < 0 are reserved for future use.
The additive table pointers are reset to additive[23] and additive[54]. The subtractive table pointers are reset to subtractive[36]
Last the shuffle table is loaded with successive values from the and subtractive[99]. Last the shuffle table is loaded with
additive 55 generator. successive values from the subtractive 100 generator.
There is no limit on the size of a seed. On the other hand, There is no limit on the size of a seed. On the other hand,
extremely large seeds require large tables and long seed times. extremely large seeds require large tables and long seed times.
Using a seed in the range of [2^64, 2^64 * 55!) should be Using a seed in the range of [2^64, 2^64 * 100!) should be
sufficient for most purposes. An easy way to stay within this sufficient for most purposes. An easy way to stay within this
range to to use seeds that are between 21 and 93 digits, or range to to use seeds that are between 21 and 178 digits, or
64 to 308 bits long. 64 to 588 bits long.
To help make the generator produced by seed S, significantly To help make the generator produced by seed S, significantly
different from S+1, seeds are scrambled prior to use. The different from S+1, seeds are scrambled prior to use. The
@@ -68,9 +68,9 @@ DESCRIPTION
After this call, the rand generator is restored to its initial After this call, the rand generator is restored to its initial
state after calc started. state after calc started.
The additive 55 pointers are reset to additive[23] and additive[54]. The subtractive 100 pointers are reset to subtractive[36]
Last the shuffle table is loaded with successive values from the and subtractive[99]. Last the shuffle table is loaded with
additive 55 generator. successive values from the subtractive 100 generator.
The call: The call:
@@ -80,14 +80,14 @@ DESCRIPTION
For matrix arg: For matrix arg:
Any buffered random bits are flushed. The additive table with the Any buffered random bits are flushed. The subtractive table with the
first 55 entries of the matrix mod 2^64. first 100 entries of the matrix mod 2^64.
The additive 55 pointers are reset to additive[23] and additive[54]. The subtractive 100 pointers are reset to subtractive[36]
Last the shuffle table is loaded with successive values from the and subtractive[99]. Last the shuffle table is loaded with
additive 55 generator. successive values from the subtractive 100 generator.
This form allows one to load the internal additive 55 generator This form allows one to load the internal subtractive 100 generator
with user supplied values. with user supplied values.
The randreseed64 process is NOT applied to the matrix values. The randreseed64 process is NOT applied to the matrix values.
@@ -114,7 +114,7 @@ DESCRIPTION
For no arg given: For no arg given:
Return current a55 generator state. This call does not alter Return current s100 generator state. This call does not alter
the generator state. the generator state.
This call allows one to take a snapshot of the current generator state. This call allows one to take a snapshot of the current generator state.
@@ -126,25 +126,25 @@ EXAMPLE
RAND state RAND state
> state = srand(); > state = srand();
> print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123); > print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123);
32 60 67 71 1 77 80 95 41 78 100 27
> print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123); > print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123);
52 72 110 15 69 58 122 109 12 95 80 32
> state2 = srand(state); > state2 = srand(state);
> print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123); > print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123);
32 60 67 71 1 77 80 95 41 78 100 27
> print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123); > print rand(123), rand(123), rand(123), rand(123), rand(123), rand(123);
52 72 110 15 69 58 122 109 12 95 80 32
> state3 = srand(); > state3 = srand();
> print state3 == state2; > print state3 == state2;
1 1
> print rand(); > print rand();
641407694185874626 10710588361472584495
LIMITS LIMITS
for matrix arg, the matrix must have at least 55 integers for matrix arg, the matrix must have at least 100 integers
LINK LIBRARY LINK LIBRARY
RAND *zsrand(ZVALUE *pseed, MATRIX *pmat55) RAND *zsrand(ZVALUE *pseed, MATRIX *pmat100)
RAND *zsetrand(RAND *state) RAND *zsetrand(RAND *state)
SEE ALSO SEE ALSO
@@ -166,8 +166,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: srand,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: srand,v 29.3 2001/04/14 22:46:33 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/srand,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/srand,v $
## ##
## Under source code control: 1996/01/01 04:19:07 ## Under source code control: 1996/01/01 04:19:07

View File

@@ -220,11 +220,11 @@ DESCRIPTION
Blum moduli. Blum moduli.
The pre-defined Blum moduli and quadratic residues were selected The pre-defined Blum moduli and quadratic residues were selected
by lavarand, a hardware random number generator. See the URL: by LavaRnd, a hardware random number generator. See the URL:
http://lavarand.sgi.com/index.html http://www.LavaRnd.org/
for an explanation of how the lavarand random number generator works. for an explanation of how the LavaRnd random number generator works.
For more information, see the comments at the top of the calc For more information, see the comments at the top of the calc
source file, zrandom.c. source file, zrandom.c.
@@ -354,8 +354,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: srandom,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: srandom,v 29.3 2001/05/13 13:26:26 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/srandom,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/srandom,v $
## ##
## Under source code control: 1997/02/17 01:18:22 ## Under source code control: 1997/02/17 01:18:22

View File

@@ -18,7 +18,7 @@ DESCRIPTION
For real or complex x, str(x) returns the string representing x For real or complex x, str(x) returns the string representing x
in the current printing mode; configuration parameters affecting in the current printing mode; configuration parameters affecting
this are "mode", "display", "outround", "tilde", "leadzero", this are "mode", "mode2", "display", "outround", "tilde", "leadzero",
EXAMPLE EXAMPLE
> str("") > str("")
@@ -28,6 +28,10 @@ EXAMPLE
> print str(123), str("+"), str(4i), str("is the same as"), str(123+4i) > print str(123), str("+"), str(4i), str("is the same as"), str(123+4i)
123 + 4i is the same as 3+4i 123 + 4i is the same as 3+4i
> base2(16),
> print str(23209)
23209 /* 0x5aa9 */
LIMITS LIMITS
none none
@@ -41,9 +45,9 @@ LINK LIBRARY
char *math_getdivertedio(); char *math_getdivertedio();
SEE ALSO SEE ALSO
XXX - fill in base, base2, config
## Copyright (C) 1999 Landon Curt Noll ## Copyright (C) 1999-2002 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -59,8 +63,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.3 $
## @(#) $Id: str,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: str,v 29.3 2002/12/29 09:19:56 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/str,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/str,v $
## ##
## Under source code control: 1995/10/05 04:52:27 ## Under source code control: 1995/10/05 04:52:27

View File

@@ -59,6 +59,15 @@ Very High priority items:
* Fix any 'Known bugs' as noted in the BUGS file or as * Fix any 'Known bugs' as noted in the BUGS file or as
displayed by 'calc help bugs'. displayed by 'calc help bugs'.
* Internationalize calc by converting calc error messages and
text strings (e.g., calc startup banner, show output, etc.)
into calls to the GNU gettext internationalization facility.
If somebody translated these strings into another language,
setting $LANG would allow calc to produce error messages
and text strings in that language.
* Consider using GNU autoconf / configure to build the calc Makefile.
=-= =-=
High priority items: High priority items:
@@ -76,8 +85,6 @@ High priority items:
* Perform a code coverage analysis of the 'make check' action * Perform a code coverage analysis of the 'make check' action
and improve the coverage (within reason) of the regress.cal suite. and improve the coverage (within reason) of the regress.cal suite.
* Create a Linux rpm (Red Hat Package Manager) package for calc.
* Address, if possible and reasonable, any Calc Mis-features * Address, if possible and reasonable, any Calc Mis-features
as noted in the BUGS file or as displayed by 'calc help bugs'. as noted in the BUGS file or as displayed by 'calc help bugs'.
@@ -115,9 +122,7 @@ Medium priority items:
* Add a builtin function to access the 64 bit FNV hash which * Add a builtin function to access the 64 bit FNV hash which
is currently being used internally in seed.c. is currently being used internally in seed.c.
* Consider using configure to build the calc Makefile. ## Copyright (C) 1999-2003 Landon Curt Noll
## Copyright (C) 1999 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -133,8 +138,8 @@ Medium priority items:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.2 $ ## @(#) $Revision: 29.5 $
## @(#) $Id: todo,v 29.2 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: todo,v 29.5 2003/02/25 20:26:17 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/todo,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/todo,v $
## ##
## Under source code control: 1999/10/20 07:42:55 ## Under source code control: 1999/10/20 07:42:55

View File

@@ -148,10 +148,14 @@ Calc command line
when the mode disables opening of files for reading. when the mode disables opening of files for reading.
-n Use the new configuration defaults instead of the old -O Use the old classic defaults instead of the default
default classic defaults. This flag as the same effect configuration. This flag as the same effect as executing
as executing config("all", "newcfg") at startup time. config("all", "oldcfg") at startup time.
NOTE: Older versions of calc used -n to setup a modified
form of the default calc configuration. The -n flag
currently does nothing. Use of the -n flag is now
deprecated and may used for something else in the future.
-p Pipe processing is enabled by use of -p. For example: -p Pipe processing is enabled by use of -p. For example:
@@ -249,8 +253,8 @@ Calc command line
./myfile.cal ./myfile.cal
${LIBDIR}/myfile ${LIBDIR}/myfile
${LIBDIR}/myfile.cal ${LIBDIR}/myfile.cal
${CUSTOMLIBDIR}/myfile ${CUSTOMCALDIR}/myfile
${CUSTOMLIBDIR}/myfile.cal ${CUSTOMCALDIR}/myfile.cal
If the file is found, the search stops and the commands in If the file is found, the search stops and the commands in
the file are executed. It is an error if no readable file the file are executed. It is an error if no readable file
@@ -353,8 +357,8 @@ For more information use the following calc commands:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
## ##
## @(#) $Revision: 29.3 $ ## @(#) $Revision: 29.6 $
## @(#) $Id: usage,v 29.3 2000/06/07 14:02:33 chongo Exp $ ## @(#) $Id: usage,v 29.6 2003/06/10 21:39:34 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/usage,v $ ## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/usage,v $
## ##
## Under source code control: 1991/07/21 04:37:25 ## Under source code control: 1991/07/21 04:37:25

59
help/version Normal file
View File

@@ -0,0 +1,59 @@
NAME
version - return the calc version string
SYNOPSIS
version()
TYPES
return string
DESCRIPTION
Returns the calc version string.
Calc version strings can be of the form:
x.y.z.w
x.y.z
x.y
where x, y, z, w, v are integers (without leading 0's) and,
t is the the liternal character 't'.
EXAMPLE
> version()
"2.11.5.4"
LIMITS
none
LINK LIBRARY
none
SEE ALSO
n/a
## Copyright (C) 2001 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 29.3 $
## @(#) $Id: version,v 29.3 2001/06/09 23:32:45 chongo Exp $
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/version,v $
##
## Under source code control: 2001/05/28 17:38:01
## File existed as early as: 2001
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

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