mirror of
https://github.com/lcn2/calc.git
synced 2025-08-19 01:13:27 +03:00
Compare commits
27 Commits
2.11.5t4.1
...
2.12.0.4
Author | SHA1 | Date | |
---|---|---|---|
|
afe37ec851 | ||
|
bd3086138b | ||
|
9d62873a02 | ||
|
23a5fc3ede | ||
|
58d94b08d8 | ||
|
7165fa17c7 | ||
|
64a732b678 | ||
|
a6a37f9cad | ||
|
42b089a87c | ||
|
8c5e9e62fa | ||
|
29e956819c | ||
|
66c3d26611 | ||
|
b4952bd44f | ||
|
0d06d90751 | ||
|
e1a3dfda0b | ||
|
8db4e7af47 | ||
|
bb5c624382 | ||
|
8aedcf801a | ||
|
b60eec99bb | ||
|
383290a844 | ||
|
7e40db44e3 | ||
|
a57ee19ca5 | ||
|
a6e226fa80 | ||
|
86e0f98c8f | ||
|
e4dcbf7ecf | ||
|
10c0bd2d95 | ||
|
ad44f1e3ab |
154
BUGS
154
BUGS
@@ -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,
|
||||
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
|
||||
|
||||
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
|
||||
[[ 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:
|
||||
|
||||
* a description of the problem
|
||||
* 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
|
||||
* the type of system you were using
|
||||
* the type of compiler you were using
|
||||
@@ -54,30 +61,54 @@ When you send your report, please include the following information:
|
||||
|
||||
Stack traces from core dumps are useful to send as well.
|
||||
|
||||
=-=
|
||||
|
||||
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.
|
||||
Fell free to use the above address to send in big fixes (in the form
|
||||
of a context diff patch).
|
||||
|
||||
=-=
|
||||
|
||||
Known bugs:
|
||||
|
||||
The stoponerror() facility does not seem to work, or perhaps
|
||||
the stoponerror help file is incorrect. The stoponerror help file
|
||||
lacks examples because of this problem.
|
||||
|
||||
We are sure some more bugs exist. When you find them, please let
|
||||
us know! See the above for details on how to report and were to
|
||||
EMail your bug reports and hopefully patches to fix them.
|
||||
|
||||
=-=
|
||||
|
||||
Problems with known work-a-rounds:
|
||||
mis-features in calc:
|
||||
|
||||
Some problems are not bugs but rarther mis-features / things that could
|
||||
work better. The following is a list of mis-features that should be
|
||||
addressed and improved someday.
|
||||
|
||||
* 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.
|
||||
|
||||
=-=
|
||||
|
||||
Problems with old systems that have known work-a-rounds:
|
||||
|
||||
* There is a bug in gcc-2.95 that causes calc, when compiled with -O2,
|
||||
to fail the regression test. The work-a-round is to compile with -O
|
||||
@@ -128,59 +159,6 @@ Problems with known work-a-rounds:
|
||||
if (n < 0) n = 0;
|
||||
z.sign = 0;
|
||||
|
||||
* Solaris cc somtimes barfs while compiling zrand.c. In particular, calc
|
||||
barfs on on the SVAL macro. The work-a-round is to use the Solaric cc
|
||||
Makefile set sets -DFORCE_STDC. I.e,:
|
||||
|
||||
CCWARN=
|
||||
CCOPT= ${DEBUG} ${NO_SHARED}
|
||||
CCMISC= -DFORCE_STDC
|
||||
#
|
||||
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
|
||||
ICFLAGS= ${CCWARN} ${CCMISC}
|
||||
#
|
||||
LCFLAGS=
|
||||
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
|
||||
ILDFLAGS=
|
||||
#
|
||||
LCC= cc
|
||||
CC= ${PURIFY} ${LCC}
|
||||
|
||||
* There is a bug in some versions of the Dec/Compaq cc for the Alpha
|
||||
where the following:
|
||||
|
||||
#include <stdio.h>
|
||||
#define SVAL(a,b) (unsigned long)(0x ## a ## b ## ULL)
|
||||
main(){SVAL(b8a8aeb0,8168eadc);}
|
||||
|
||||
fails because it puts a space inside the concatenated hex. Calc
|
||||
has code that is affected by this bug. This bug has been reported
|
||||
to Compaq and may be fixed in the future. A work-a-round is to
|
||||
compile with cc -std0 or to use a later version of their compiler.
|
||||
|
||||
* On a Digital UNIX V4.0F (Rev. 1229) on a 500 Mhz 21264, make check
|
||||
dies a horrible death starting in test 600 and 622 gives 100s of
|
||||
messages for calc version 2.11.0t9.4 using the Dec's cc with -O2:
|
||||
|
||||
600: Beginning test_bignums
|
||||
601: muldivcheck 1
|
||||
**** abc != acb: 602: muldivcheck 2
|
||||
**** acb != bac: 602: muldivcheck 2
|
||||
...
|
||||
**** t4 != a4: 622: algcheck 1
|
||||
**** t5 != a5: 622: algcheck 1
|
||||
**** t6 != a6: 622: algcheck 1
|
||||
**** t4 != a4: 622: algcheck 1
|
||||
...
|
||||
|
||||
it finally hangs at test 2000.
|
||||
|
||||
The work-a-round is to compile calc without the optimizer. If this
|
||||
happens to you, try compiling without -O and without -O2. I.e., in
|
||||
the Makefile, set:
|
||||
|
||||
DEBUG= -g
|
||||
|
||||
* There are problems compiling calc on the sparcv9 under 64 bit
|
||||
Solaris. On that platform, gcc-2.96 is able to compile calc, but
|
||||
calc dumps core very early on in startup. It is said that sparcv9
|
||||
@@ -196,41 +174,7 @@ Problems with known work-a-rounds:
|
||||
CCWARN="-DFORCE_STDC -w"
|
||||
DEBUG="-fast -xarch=v9"
|
||||
|
||||
* Under BSDI v4, the warnings of the form:
|
||||
|
||||
/usr/include/ctype.h:147: warning: `__runetype' defined but not used
|
||||
/usr/include/ctype.h:161: warning: `__isctype' defined but not used
|
||||
/usr/include/ctype.h:170: warning: `toupper' defined but not used
|
||||
/usr/include/ctype.h:177: warning: `tolower' defined but not used
|
||||
|
||||
are seen. These warnings are the result of mis-features in BSDI
|
||||
include files. They do not have an impact on the operation
|
||||
or performance. The work-a-round is to ignore these warnings
|
||||
under BSDI.
|
||||
|
||||
* The chi.cal resource file does not work well with odd degrees
|
||||
of freedom. Can someone improve this algorithm?
|
||||
|
||||
* The intfile.cal resource file reads and writes big or little Endian
|
||||
integers to/from files the hard way. It does NOT use blkcpy. The
|
||||
following code:
|
||||
|
||||
i = (ord("\n") << 16) | (ord("i") << 8) | ord("H")
|
||||
b = blk()
|
||||
copy(i, b)
|
||||
fd = fopen("file", "w")
|
||||
copy(b, fd);
|
||||
fclose(fd)
|
||||
|
||||
will write an extra NUL octet to the file. Where as:
|
||||
|
||||
read intfile
|
||||
i = (ord("\n") << 16) | (ord("i") << 8) | ord("H")
|
||||
be2file(i, "file2")
|
||||
|
||||
will not.
|
||||
|
||||
## Copyright (C) 1999 Landon Curt Noll
|
||||
## Copyright (C) 1999-2006 Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -246,8 +190,8 @@ Problems with known work-a-rounds:
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.10 $
|
||||
## @(#) $Id: BUGS,v 29.10 2001/04/08 11:32:52 chongo Exp $
|
||||
## @(#) $Revision: 29.24 $
|
||||
## @(#) $Id: BUGS,v 29.24 2006/05/21 07:54:13 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/RCS/BUGS,v $
|
||||
##
|
||||
## Under source code control: 1994/03/18 14:06:13
|
||||
|
30
COPYING
30
COPYING
@@ -12,8 +12,8 @@ This file is Copyrighted
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
# @(#) $Revision: 29.5 $
|
||||
# @(#) $Id: COPYING,v 29.5 2000/12/18 10:22:55 chongo Exp $
|
||||
# @(#) $Revision: 29.8 $
|
||||
# @(#) $Id: COPYING,v 29.8 2006/05/01 19:16:57 chongo Exp $
|
||||
# @(#) $Source: /usr/local/src/cmd/calc/RCS/COPYING,v $
|
||||
|
||||
=-=
|
||||
@@ -55,13 +55,18 @@ Calc is covered by the GNU Lesser General Public License
|
||||
|
||||
The contact addresses for calc is as follows:
|
||||
|
||||
Web: http://www.isthe.com/chongo/tech/comp/calc/index.html
|
||||
EMail: calc-contrib at asthe dot com
|
||||
Web: http://www.isthe.com/chongo/tech/comp/calc/email.html
|
||||
|
||||
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
|
||||
|
||||
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:
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
[[ 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 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
|
||||
@@ -149,12 +164,13 @@ Calc copyrights and exception files
|
||||
Copyright (C) year Landon Curt Noll
|
||||
Copyright (C) year Ernest Bowen and Landon Curt Noll
|
||||
Copyright (C) year Ernest Bowen
|
||||
Copyright (C) year Petteri Kettunen and Landon Curt Noll
|
||||
|
||||
These files are not covered under one of the Copyrights listed above:
|
||||
|
||||
shs1.c shs1.h shs.c shs.h
|
||||
md5.c md5.h COPYING COPYING-LGPL
|
||||
cal/qtime.cal
|
||||
cal/qtime.cal cal/screen.cal
|
||||
|
||||
The file COPYING-LGPL, which contains a copy of the version 2.1
|
||||
GNU Lesser General Public License, is itself Copyrighted by the
|
||||
|
149
HOWTO.INSTALL
149
HOWTO.INSTALL
@@ -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
|
||||
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.
|
||||
and use these RPMs:
|
||||
|
||||
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.
|
||||
* calc*.i686.rpm
|
||||
- all that is needed if you just want to use calc
|
||||
|
||||
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.
|
||||
* calc-devel-*.i686.rpm
|
||||
- calc *.h header and *.a lib files for use in other programs
|
||||
|
||||
Set TOPDIR to be the place under which help files, calc,
|
||||
include files and calc libs are to be installed. As shipped
|
||||
the Makefile assumes a TOPDIR of /usr/local/lib.
|
||||
* calc.*.src.rpm
|
||||
- calc source in RPM package form
|
||||
|
||||
Set BINDIR to the place where calc is installed. As shipped
|
||||
the Makefile assumes a BINDIR /usr/local/bin.
|
||||
The following 4 steps apply to calc source tree that comes from either:
|
||||
|
||||
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.
|
||||
|
||||
2) build calc:
|
||||
2) build calc:
|
||||
|
||||
make all
|
||||
|
||||
@@ -36,13 +132,14 @@ Installing calc in 4 easy steps:
|
||||
you may find. See the BUGS file if you find any compiler
|
||||
warning or errors.
|
||||
|
||||
3) test calc:
|
||||
3) test calc:
|
||||
|
||||
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
|
||||
|
||||
@@ -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.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: HOWTO.INSTALL,v 29.2 2000/06/07 14:02:13 chongo Exp $
|
||||
## @(#) $Revision: 29.7 $
|
||||
## @(#) $Id: HOWTO.INSTALL,v 29.7 2003/04/15 03:38:34 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/RCS/HOWTO.INSTALL,v $
|
||||
##
|
||||
## Under source code control: 1999/09/27 20:48:44
|
||||
|
28
LIBRARY
28
LIBRARY
@@ -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
|
||||
obscure internal routines won't change or disappear in future releases!
|
||||
|
||||
When calc is installed, all of the include files needed to build
|
||||
libcalc.a along with the link library itself are installed into ${LIBDIR}.
|
||||
When calc is installed, all of libraries 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:
|
||||
|
||||
-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
|
||||
@@ -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.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: LIBRARY,v 29.2 2000/06/07 14:02:13 chongo Exp $
|
||||
## @(#) $Revision: 29.5 $
|
||||
## @(#) $Id: LIBRARY,v 29.5 2001/06/08 22:57:35 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/RCS/LIBRARY,v $
|
||||
##
|
||||
## Under source code control: 1993/07/30 19:44:49
|
||||
|
24
README
24
README
@@ -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
|
||||
|
||||
[[ 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 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:
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
@@ -98,6 +108,12 @@ Calc bug reports, however should be sent to:
|
||||
|
||||
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:
|
||||
|
||||
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.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: README,v 29.2 2000/06/07 14:02:13 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: README,v 29.3 2001/06/01 11:26:53 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/RCS/README,v $
|
||||
##
|
||||
## Under source code control: 1995/10/25 05:27:59
|
||||
|
109
README.WINDOWS
109
README.WINDOWS
@@ -3,15 +3,6 @@ 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 Windoz port is extremely experimental, untested and perhaps
|
||||
incomplete. We are in the process of making it easier. The
|
||||
following should help anyone who is trying to make a go of this
|
||||
under the current code conditions.
|
||||
|
||||
NOTE: We are currently ONLY making an effort to support building under
|
||||
Windoz using the Cygwin project (http://sources.redhat.com/cygwin/)
|
||||
with the GCC compiler and Un*x tools for Windows.
|
||||
|
||||
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
|
||||
@@ -19,7 +10,67 @@ NOTE: The main developers do not have access to a Windoz based platform.
|
||||
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
|
||||
@@ -41,27 +92,29 @@ The major porting work was performed by Thomas Jones-Low
|
||||
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 calcexe.exe which is the command line interface.
|
||||
library, and calc.exe which is the command line interface.
|
||||
|
||||
He recommends that you generate by hand all of the header files generated
|
||||
by the make file:
|
||||
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:
|
||||
|
||||
align32.h args.h calcerr.h conf.h endian_calc.h
|
||||
fposval.h have_const.h have_fpos.h have_fpos_pos.h have_malloc.h
|
||||
have_memmv.h have_newstr.h have_offscl.h have_posscl.h
|
||||
have_stdlib.h have_string.h have_times.h have_uid_t.h
|
||||
have_unistd.h longbits.h longlong.h terminal.h
|
||||
have_ustat.h have_getsid.h have_getpgid.h
|
||||
have_gettime.h have_getprid.h have_urandom.h have_rusage.h
|
||||
have_strdup.h
|
||||
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. Just copy the win32/*.[ch] files up into the top level calc
|
||||
source directory, edited (if needed) and build using the Cygwin GCC
|
||||
compiler.
|
||||
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:
|
||||
|
||||
@@ -89,7 +142,7 @@ was changed to:
|
||||
DLL extern int configtype(char*);
|
||||
|
||||
|
||||
## Copyright (C) 2001 Landon Curt Noll and Thomas Jones-Low
|
||||
## 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
|
||||
@@ -105,8 +158,8 @@ was changed to:
|
||||
## 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: README.WINDOWS,v 29.6 2001/04/08 22:13:38 chongo Exp $
|
||||
## @(#) $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
|
||||
|
243
addop.c
243
addop.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* addop - add opcodes to a function being compiled
|
||||
*
|
||||
* Copyright (C) 1999 David I. Bell and Ernest Bowen
|
||||
* Copyright (C) 1999-2006 David I. Bell and Ernest Bowen
|
||||
*
|
||||
* Primary author: David I. Bell
|
||||
*
|
||||
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: addop.c,v 29.3 2000/07/17 15:35:49 chongo Exp $
|
||||
* @(#) $Revision: 29.13 $
|
||||
* @(#) $Id: addop.c,v 29.13 2006/06/20 10:28:06 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/addop.c,v $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:48:10
|
||||
@@ -44,7 +44,7 @@
|
||||
#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 char *newname; /* name of new function */
|
||||
static long oldop; /* previous opcode */
|
||||
@@ -184,8 +184,8 @@ void
|
||||
endfunc(void)
|
||||
{
|
||||
register FUNC *fp; /* function just finished */
|
||||
unsigned long size; /* size of just created function */
|
||||
long index;
|
||||
size_t size; /* size of just created function */
|
||||
unsigned long index;
|
||||
|
||||
if (oldop != OP_RETURN) {
|
||||
addop(OP_UNDEF);
|
||||
@@ -195,8 +195,8 @@ endfunc(void)
|
||||
checklabels();
|
||||
|
||||
if (errorcount) {
|
||||
printf("\"%s\": %ld error%s\n", newname, errorcount,
|
||||
((errorcount == 1) ? "" : "s"));
|
||||
scanerror(T_NULL,"Compilation of \"%s\" failed: %ld error(s)",
|
||||
newname, errorcount);
|
||||
return;
|
||||
}
|
||||
size = funcsize(curfunc->f_opcodecount);
|
||||
@@ -211,7 +211,7 @@ endfunc(void)
|
||||
if (newname[0] != '*' && (conf->traceflags & TRACE_FNCODES)) {
|
||||
dumpnames = TRUE;
|
||||
for (size = 0; size < fp->f_opcodecount; ) {
|
||||
printf("%ld: ", (long)size);
|
||||
printf("%ld: ", (unsigned long)size);
|
||||
size += dumpop(&fp->f_opcodes[size]);
|
||||
}
|
||||
}
|
||||
@@ -280,12 +280,13 @@ rmuserfunc(char *name)
|
||||
|
||||
index = findstr(&funcnames, name);
|
||||
if (index < 0) {
|
||||
fprintf(stderr, "%s() has never been defined\n",
|
||||
name);
|
||||
warning("No function named \"%s\" to be undefined", name);
|
||||
return;
|
||||
}
|
||||
if (functions[index] == NULL)
|
||||
if (functions[index] == NULL) {
|
||||
warning("No defined function \"%s\" to be undefined", name);
|
||||
return;
|
||||
}
|
||||
freenumbers(functions[index]);
|
||||
free(functions[index]);
|
||||
if ((inputisterminal() && conf->resource_debug & RSCDBG_STDIN_FUNC) ||
|
||||
@@ -302,7 +303,7 @@ void
|
||||
freefunc(FUNC *fp)
|
||||
{
|
||||
long index;
|
||||
long i;
|
||||
unsigned long i;
|
||||
|
||||
if (fp == NULL)
|
||||
return;
|
||||
@@ -383,7 +384,7 @@ clearopt(void)
|
||||
FUNC *
|
||||
findfunc(long index)
|
||||
{
|
||||
if ((unsigned long) index >= funccount) {
|
||||
if (index >= funccount) {
|
||||
math_error("Undefined function");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
@@ -451,124 +452,122 @@ addop(long op)
|
||||
* slightly optimize the code depending on the various combinations.
|
||||
*/
|
||||
switch (op) {
|
||||
case OP_GETVALUE:
|
||||
switch (oldop) {
|
||||
case OP_NUMBER:
|
||||
case OP_ZERO:
|
||||
case OP_ONE:
|
||||
case OP_IMAGINARY:
|
||||
case OP_GETEPSILON:
|
||||
case OP_SETEPSILON:
|
||||
case OP_STRING:
|
||||
case OP_UNDEF:
|
||||
case OP_GETCONFIG:
|
||||
case OP_SETCONFIG:
|
||||
return;
|
||||
case OP_DUPLICATE:
|
||||
diff = 1;
|
||||
oldop = OP_DUPVALUE;
|
||||
break;
|
||||
case OP_FIADDR:
|
||||
diff = 1;
|
||||
oldop = OP_FIVALUE;
|
||||
break;
|
||||
case OP_GLOBALADDR:
|
||||
diff = 1 + PTR_SIZE;
|
||||
oldop = OP_GLOBALVALUE;
|
||||
break;
|
||||
case OP_LOCALADDR:
|
||||
oldop = OP_LOCALVALUE;
|
||||
break;
|
||||
case OP_PARAMADDR:
|
||||
oldop = OP_PARAMVALUE;
|
||||
break;
|
||||
case OP_ELEMADDR:
|
||||
oldop = OP_ELEMVALUE;
|
||||
break;
|
||||
default:
|
||||
cut = FALSE;
|
||||
case OP_GETVALUE:
|
||||
switch (oldop) {
|
||||
case OP_NUMBER:
|
||||
case OP_ZERO:
|
||||
case OP_ONE:
|
||||
case OP_IMAGINARY:
|
||||
case OP_GETEPSILON:
|
||||
case OP_SETEPSILON:
|
||||
case OP_STRING:
|
||||
case OP_UNDEF:
|
||||
case OP_GETCONFIG:
|
||||
case OP_SETCONFIG:
|
||||
return;
|
||||
case OP_DUPLICATE:
|
||||
diff = 1;
|
||||
oldop = OP_DUPVALUE;
|
||||
break;
|
||||
case OP_FIADDR:
|
||||
diff = 1;
|
||||
oldop = OP_FIVALUE;
|
||||
break;
|
||||
case OP_GLOBALADDR:
|
||||
diff = 1 + PTR_SIZE;
|
||||
oldop = OP_GLOBALVALUE;
|
||||
break;
|
||||
case OP_LOCALADDR:
|
||||
oldop = OP_LOCALVALUE;
|
||||
break;
|
||||
case OP_PARAMADDR:
|
||||
oldop = OP_PARAMVALUE;
|
||||
break;
|
||||
case OP_ELEMADDR:
|
||||
oldop = OP_ELEMVALUE;
|
||||
break;
|
||||
default:
|
||||
cut = FALSE;
|
||||
|
||||
}
|
||||
if (cut) {
|
||||
fp->f_opcodes[count - diff] = oldop;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (cut) {
|
||||
fp->f_opcodes[count - diff] = oldop;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case OP_POP:
|
||||
switch (oldop) {
|
||||
case OP_ASSIGN:
|
||||
fp->f_opcodes[count-1] = OP_ASSIGNPOP;
|
||||
oldop = OP_ASSIGNPOP;
|
||||
return;
|
||||
case OP_NUMBER:
|
||||
case OP_IMAGINARY:
|
||||
q = constvalue(fp->f_opcodes[count-1]);
|
||||
qfree(q);
|
||||
break;
|
||||
case OP_POP:
|
||||
switch (oldop) {
|
||||
case OP_ASSIGN:
|
||||
fp->f_opcodes[count-1] = OP_ASSIGNPOP;
|
||||
oldop = OP_ASSIGNPOP;
|
||||
return;
|
||||
case OP_NUMBER:
|
||||
case OP_IMAGINARY:
|
||||
q = constvalue(fp->f_opcodes[count-1]);
|
||||
qfree(q);
|
||||
break;
|
||||
case OP_STRING:
|
||||
sfree(findstring((long)fp->f_opcodes[count-1]));
|
||||
break;
|
||||
case OP_LOCALADDR:
|
||||
case OP_PARAMADDR:
|
||||
break;
|
||||
case OP_GLOBALADDR:
|
||||
diff = 1 + PTR_SIZE;
|
||||
break;
|
||||
case OP_UNDEF:
|
||||
fp->f_opcodecount -= 1;
|
||||
oldop = OP_NOP;
|
||||
oldoldop = OP_NOP;
|
||||
return;
|
||||
default:
|
||||
cut = FALSE;
|
||||
}
|
||||
if (cut) {
|
||||
fp->f_opcodecount -= diff;
|
||||
oldop = OP_NOP;
|
||||
oldoldop = OP_NOP;
|
||||
fprintf(stderr,
|
||||
"Line %ld: unused value ignored\n",
|
||||
linenumber());
|
||||
return;
|
||||
}
|
||||
case OP_STRING:
|
||||
sfree(findstring((long)fp->f_opcodes[count-1]));
|
||||
break;
|
||||
case OP_NEGATE:
|
||||
if (oldop == OP_NUMBER) {
|
||||
q = constvalue(fp->f_opcodes[count-1]);
|
||||
fp->f_opcodes[count-1] = addqconstant(qneg(q));
|
||||
qfree(q);
|
||||
return;
|
||||
}
|
||||
case OP_LOCALADDR:
|
||||
case OP_PARAMADDR:
|
||||
break;
|
||||
case OP_GLOBALADDR:
|
||||
diff = 1 + PTR_SIZE;
|
||||
break;
|
||||
case OP_UNDEF:
|
||||
fp->f_opcodecount -= 1;
|
||||
oldop = OP_NOP;
|
||||
oldoldop = OP_NOP;
|
||||
return;
|
||||
default:
|
||||
cut = FALSE;
|
||||
}
|
||||
if (cut) {
|
||||
fp->f_opcodecount -= diff;
|
||||
oldop = OP_NOP;
|
||||
oldoldop = OP_NOP;
|
||||
warning("Constant before comma operator");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case OP_NEGATE:
|
||||
if (oldop == OP_NUMBER) {
|
||||
q = constvalue(fp->f_opcodes[count-1]);
|
||||
fp->f_opcodes[count-1] = addqconstant(qneg(q));
|
||||
qfree(q);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (oldop == OP_NUMBER) {
|
||||
if (oldoldop == OP_NUMBER) {
|
||||
q1 = constvalue(fp->f_opcodes[count - 3]);
|
||||
q2 = constvalue(fp->f_opcodes[count - 1]);
|
||||
switch (op) {
|
||||
case OP_DIV:
|
||||
if (qiszero(q2)) {
|
||||
cut = FALSE;
|
||||
break;
|
||||
}
|
||||
q = qqdiv(q1,q2);
|
||||
break;
|
||||
case OP_MUL:
|
||||
q = qmul(q1,q2);
|
||||
break;
|
||||
case OP_ADD:
|
||||
q = qqadd(q1,q2);
|
||||
break;
|
||||
case OP_SUB:
|
||||
q = qsub(q1,q2);
|
||||
break;
|
||||
case OP_POWER:
|
||||
if (qisfrac(q2) || qisneg(q2))
|
||||
cut = FALSE;
|
||||
else
|
||||
q = qpowi(q1,q2);
|
||||
break;
|
||||
default:
|
||||
case OP_DIV:
|
||||
if (qiszero(q2)) {
|
||||
cut = FALSE;
|
||||
break;
|
||||
}
|
||||
q = qqdiv(q1,q2);
|
||||
break;
|
||||
case OP_MUL:
|
||||
q = qmul(q1,q2);
|
||||
break;
|
||||
case OP_ADD:
|
||||
q = qqadd(q1,q2);
|
||||
break;
|
||||
case OP_SUB:
|
||||
q = qsub(q1,q2);
|
||||
break;
|
||||
case OP_POWER:
|
||||
if (qisfrac(q2) || qisneg(q2))
|
||||
cut = FALSE;
|
||||
else
|
||||
q = qpowi(q1,q2);
|
||||
break;
|
||||
default:
|
||||
cut = FALSE;
|
||||
}
|
||||
if (cut) {
|
||||
qfree(q1);
|
||||
|
6
alloc.h
6
alloc.h
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: alloc.h,v 29.3 2001/05/29 00:16:53 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: alloc.h,v 29.4 2001/06/08 21:00:58 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/alloc.h,v $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:48:29
|
||||
@@ -32,7 +32,7 @@
|
||||
#define __ALLOC_H__
|
||||
|
||||
|
||||
#if defined(SRC) /* if we are building from the calc source tree */
|
||||
#if defined(CALC_SRC) /* if we are building from the calc source tree */
|
||||
# include "have_malloc.h"
|
||||
# include "have_newstr.h"
|
||||
# include "have_string.h"
|
||||
|
182
blkcpy.c
182
blkcpy.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* blkcpy - general values and related routines used by the calculator
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll and Ernest Bowen
|
||||
* Copyright (C) 1999-2006 Landon Curt Noll and Ernest Bowen
|
||||
*
|
||||
* Primary author: Landon Curt Noll
|
||||
*
|
||||
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: blkcpy.c,v 29.3 2001/04/10 22:06:46 chongo Exp $
|
||||
* @(#) $Revision: 29.9 $
|
||||
* @(#) $Id: blkcpy.c,v 29.9 2006/05/20 08:43:55 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/blkcpy.c,v $
|
||||
*
|
||||
* Under source code control: 1997/04/18 20:41:26
|
||||
@@ -73,51 +73,51 @@ copystod(VALUE *svp, long ssi, long num, VALUE *dvp, long dsi)
|
||||
* determine/check source type
|
||||
*/
|
||||
switch(svp->v_type) {
|
||||
case V_NBLOCK:
|
||||
if (svp->v_nblock->subtype & V_NOCOPYFROM)
|
||||
return E_COPY15;
|
||||
sblk = svp->v_nblock->blk;
|
||||
if (sblk->data == NULL)
|
||||
return E_COPY8;
|
||||
break;
|
||||
case V_BLOCK:
|
||||
sblk = svp->v_block;
|
||||
break;
|
||||
case V_STR:
|
||||
case V_OCTET:
|
||||
case V_NUM:
|
||||
case V_FILE:
|
||||
case V_MAT:
|
||||
case V_LIST:
|
||||
break;
|
||||
default:
|
||||
return E_COPY9;
|
||||
case V_NBLOCK:
|
||||
if (svp->v_nblock->subtype & V_NOCOPYFROM)
|
||||
return E_COPY15;
|
||||
sblk = svp->v_nblock->blk;
|
||||
if (sblk->data == NULL)
|
||||
return E_COPY8;
|
||||
break;
|
||||
case V_BLOCK:
|
||||
sblk = svp->v_block;
|
||||
break;
|
||||
case V_STR:
|
||||
case V_OCTET:
|
||||
case V_NUM:
|
||||
case V_FILE:
|
||||
case V_MAT:
|
||||
case V_LIST:
|
||||
break;
|
||||
default:
|
||||
return E_COPY9;
|
||||
}
|
||||
|
||||
/*
|
||||
* determine/check destination type
|
||||
*/
|
||||
switch(dvp->v_type) {
|
||||
case V_NBLOCK:
|
||||
if (dvp->v_nblock->subtype & V_NOCOPYTO)
|
||||
return E_COPY16;
|
||||
noreloc |=((dvp->v_nblock->subtype & V_NOREALLOC) != 0);
|
||||
dblk = dvp->v_nblock->blk;
|
||||
if (dblk->data == NULL)
|
||||
return E_COPY10;
|
||||
break;
|
||||
case V_BLOCK:
|
||||
noreloc = ((dvp->v_subtype & V_NOREALLOC) != 0);
|
||||
dblk = dvp->v_block;
|
||||
break;
|
||||
case V_STR:
|
||||
case V_NUM:
|
||||
case V_FILE:
|
||||
case V_MAT:
|
||||
case V_LIST:
|
||||
break;
|
||||
default:
|
||||
return E_COPY11;
|
||||
case V_NBLOCK:
|
||||
if (dvp->v_nblock->subtype & V_NOCOPYTO)
|
||||
return E_COPY16;
|
||||
noreloc |=((dvp->v_nblock->subtype & V_NOREALLOC) != 0);
|
||||
dblk = dvp->v_nblock->blk;
|
||||
if (dblk->data == NULL)
|
||||
return E_COPY10;
|
||||
break;
|
||||
case V_BLOCK:
|
||||
noreloc = ((dvp->v_subtype & V_NOREALLOC) != 0);
|
||||
dblk = dvp->v_block;
|
||||
break;
|
||||
case V_STR:
|
||||
case V_NUM:
|
||||
case V_FILE:
|
||||
case V_MAT:
|
||||
case V_LIST:
|
||||
break;
|
||||
default:
|
||||
return E_COPY11;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -280,20 +280,20 @@ copymat2mat(MATRIX *smat, long ssi, long num, MATRIX *dmat, long dsi)
|
||||
VALUE *vp;
|
||||
VALUE *vq;
|
||||
VALUE *vtemp;
|
||||
short subtype;
|
||||
unsigned short subtype;
|
||||
|
||||
if (ssi > smat->m_size)
|
||||
return E_COPY2;
|
||||
|
||||
if (num < 0)
|
||||
num = smat->m_size - ssi;
|
||||
if ((USB32) ssi + num > smat->m_size)
|
||||
if (ssi + num > smat->m_size)
|
||||
return E_COPY5;
|
||||
if (num == 0)
|
||||
return 0;
|
||||
if (dsi < 0)
|
||||
dsi = 0;
|
||||
if ((USB32) dsi + num > dmat->m_size)
|
||||
if (dsi + num > dmat->m_size)
|
||||
return E_COPY7;
|
||||
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
|
||||
if (vtemp == NULL) {
|
||||
@@ -311,7 +311,7 @@ copymat2mat(MATRIX *smat, long ssi, long num, MATRIX *dmat, long dsi)
|
||||
subtype = vq->v_subtype;
|
||||
freevalue(vq);
|
||||
*vq = *vp;
|
||||
vq->v_subtype = subtype;
|
||||
vq->v_subtype |= subtype;
|
||||
}
|
||||
free(vtemp);
|
||||
return 0;
|
||||
@@ -329,19 +329,19 @@ copyblk2mat(BLOCK *blk, long ssi, long num, MATRIX *dmat, long dsi)
|
||||
VALUE *vq;
|
||||
VALUE *vtemp;
|
||||
long i;
|
||||
short subtype;
|
||||
unsigned short subtype;
|
||||
|
||||
if (ssi > blk->datalen)
|
||||
return E_COPY2;
|
||||
if (num < 0)
|
||||
num = blk->datalen - ssi;
|
||||
if ((USB32) ssi + num > blk->datalen)
|
||||
if (ssi + num > blk->datalen)
|
||||
return E_COPY5;
|
||||
if (num == 0)
|
||||
return 0;
|
||||
if (dsi < 0)
|
||||
dsi = 0;
|
||||
if ((USB32) dsi + num > dmat->m_size)
|
||||
if (dsi + num > dmat->m_size)
|
||||
return E_COPY7;
|
||||
op = blk->data + ssi;
|
||||
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
|
||||
@@ -363,7 +363,7 @@ copyblk2mat(BLOCK *blk, long ssi, long num, MATRIX *dmat, long dsi)
|
||||
subtype = vq->v_subtype;
|
||||
freevalue(vq);
|
||||
*vq = *vp;
|
||||
vq->v_subtype = subtype;
|
||||
vq->v_subtype |= subtype;
|
||||
}
|
||||
free(vtemp);
|
||||
return 0;
|
||||
@@ -389,7 +389,7 @@ copymat2blk(MATRIX *smat, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
|
||||
num = smat->m_size - ssi;
|
||||
if (num == 0)
|
||||
return 0;
|
||||
if ((USB32) ssi + num > smat->m_size)
|
||||
if (ssi + num > smat->m_size)
|
||||
return E_COPY5;
|
||||
if (dsi < 0)
|
||||
dsi = dblk->datalen;
|
||||
@@ -429,6 +429,7 @@ copymat2list(MATRIX *smat, long ssi, long num, LIST *lp, long dsi)
|
||||
LISTELEM *ep;
|
||||
VALUE *vtemp;
|
||||
long i;
|
||||
unsigned short subtype;
|
||||
|
||||
if (ssi > smat->m_size)
|
||||
return E_COPY2;
|
||||
@@ -436,11 +437,11 @@ copymat2list(MATRIX *smat, long ssi, long num, LIST *lp, long dsi)
|
||||
num = smat->m_size - ssi;
|
||||
if (num == 0)
|
||||
return 0;
|
||||
if ((USB32) ssi + num > smat->m_size)
|
||||
if (ssi + num > smat->m_size)
|
||||
return E_COPY5;
|
||||
if (dsi < 0)
|
||||
dsi = 0;
|
||||
if ((USB32) dsi + num > lp->l_count)
|
||||
if (dsi + num > lp->l_count)
|
||||
return E_COPY7;
|
||||
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
|
||||
if (vtemp == NULL) {
|
||||
@@ -456,8 +457,10 @@ copymat2list(MATRIX *smat, long ssi, long num, LIST *lp, long dsi)
|
||||
ep = listelement(lp, (long) dsi);
|
||||
i = num;
|
||||
while (i-- > 0) {
|
||||
subtype = ep->e_value.v_subtype;
|
||||
freevalue(&ep->e_value);
|
||||
ep->e_value = *vq++;
|
||||
ep->e_value.v_subtype |= subtype;
|
||||
ep = ep->e_next;
|
||||
}
|
||||
free(vtemp);
|
||||
@@ -476,7 +479,7 @@ copylist2mat(LIST *lp, long ssi, long num, MATRIX *dmat, long dsi)
|
||||
LISTELEM *ep;
|
||||
VALUE *vtemp;
|
||||
long i;
|
||||
short subtype;
|
||||
unsigned short subtype;
|
||||
|
||||
if (ssi > lp->l_count)
|
||||
return E_COPY2;
|
||||
@@ -484,11 +487,11 @@ copylist2mat(LIST *lp, long ssi, long num, MATRIX *dmat, long dsi)
|
||||
num = lp->l_count - ssi;
|
||||
if (num == 0)
|
||||
return 0;
|
||||
if ((USB32) ssi + num > lp->l_count)
|
||||
if (ssi + num > lp->l_count)
|
||||
return E_COPY5;
|
||||
if (dsi < 0)
|
||||
dsi = 0;
|
||||
if ((USB32) dsi + num > dmat->m_size)
|
||||
if (dsi + num > dmat->m_size)
|
||||
return E_COPY7;
|
||||
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
|
||||
if (vtemp == NULL) {
|
||||
@@ -508,7 +511,7 @@ copylist2mat(LIST *lp, long ssi, long num, MATRIX *dmat, long dsi)
|
||||
subtype = vq->v_subtype;
|
||||
freevalue(vq);
|
||||
*vq = *vp;
|
||||
vq->v_subtype = subtype;
|
||||
vq->v_subtype |= subtype;
|
||||
}
|
||||
free(vtemp);
|
||||
return 0;
|
||||
@@ -526,6 +529,7 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
|
||||
LISTELEM *dep;
|
||||
VALUE *vtemp;
|
||||
VALUE *vp;
|
||||
unsigned short subtype;
|
||||
|
||||
if (ssi > slp->l_count)
|
||||
return E_COPY2;
|
||||
@@ -533,11 +537,11 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
|
||||
num = slp->l_count - ssi;
|
||||
if (num == 0)
|
||||
return 0;
|
||||
if ((USB32) ssi + num > slp->l_count)
|
||||
if (ssi + num > slp->l_count)
|
||||
return E_COPY5;
|
||||
if (dsi < 0)
|
||||
dsi = 0;
|
||||
if ((USB32) dsi + num > dlp->l_count)
|
||||
if (dsi + num > dlp->l_count)
|
||||
return E_COPY7;
|
||||
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
|
||||
if (vtemp == NULL) {
|
||||
@@ -555,8 +559,10 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
|
||||
vp = vtemp;
|
||||
i = num;
|
||||
while (i-- > 0) {
|
||||
subtype = dep->e_value.v_subtype;
|
||||
freevalue(&dep->e_value);
|
||||
dep->e_value = *vp++;
|
||||
dep->e_value.v_subtype |= subtype;
|
||||
dep = dep->e_next;
|
||||
}
|
||||
free(vtemp);
|
||||
@@ -572,7 +578,7 @@ copyblk2file(BLOCK *sblk, long ssi, long num, FILEID id, long dsi)
|
||||
{
|
||||
FILEIO *fiop;
|
||||
FILE *fp;
|
||||
unsigned int numw;
|
||||
long numw;
|
||||
|
||||
if (ssi > sblk->datalen)
|
||||
return E_COPY2;
|
||||
@@ -609,7 +615,7 @@ copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
|
||||
{
|
||||
FILEIO *fiop;
|
||||
FILE *fp;
|
||||
unsigned int numw;
|
||||
long numw;
|
||||
ZVALUE fsize;
|
||||
long filelen;
|
||||
long newlen;
|
||||
@@ -639,7 +645,7 @@ copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
|
||||
num = filelen - ssi;
|
||||
if (num == 0)
|
||||
return 0;
|
||||
if ((USB32) ssi + num > filelen)
|
||||
if (ssi + num > filelen)
|
||||
return E_COPY5;
|
||||
if (fseek(fp, ssi, 0)) /* using system fseek XXX */
|
||||
return E_COPYF2;
|
||||
@@ -677,7 +683,7 @@ copystr2file(STRING *str, long ssi, long num, FILEID id, long dsi)
|
||||
{
|
||||
long len;
|
||||
FILEIO *fiop;
|
||||
unsigned int numw;
|
||||
long numw;
|
||||
FILE *fp;
|
||||
|
||||
len = str->s_len;
|
||||
@@ -688,7 +694,7 @@ copystr2file(STRING *str, long ssi, long num, FILEID id, long dsi)
|
||||
num = len - ssi;
|
||||
if (num <= 0) /* Nothing to be copied */
|
||||
return 0;
|
||||
if ((USB32) ssi + num > len)
|
||||
if (ssi + num > len)
|
||||
return E_COPY5; /* Insufficient memory in str */
|
||||
fiop = findid(id, TRUE);
|
||||
if (fiop == NULL)
|
||||
@@ -726,7 +732,7 @@ copyblk2blk(BLOCK *sblk, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc
|
||||
num = sblk->datalen - ssi;
|
||||
if (num == 0) /* Nothing to be copied */
|
||||
return 0;
|
||||
if ((unsigned int) ssi + num > sblk->datalen)
|
||||
if (ssi + num > sblk->datalen)
|
||||
return E_COPY5;
|
||||
if (dsi < 0)
|
||||
dsi = dblk->datalen;
|
||||
@@ -806,13 +812,13 @@ copystr2str(STRING *sstr, long ssi, long num, STRING *dstr, long dsi)
|
||||
{
|
||||
char *c, *c1;
|
||||
|
||||
if (num < 0 || ssi + num > sstr->s_len)
|
||||
if (num < 0 || (size_t)(ssi + num) > sstr->s_len)
|
||||
num = sstr->s_len - ssi;
|
||||
if (num <= 0)
|
||||
return 0; /* Nothing to be copied */
|
||||
if (dsi < 0) /* default destination index */
|
||||
dsi = 0;
|
||||
if (dsi + num > dstr->s_len)
|
||||
if ((size_t)(dsi + num) > dstr->s_len)
|
||||
num = dstr->s_len - dsi;
|
||||
c1 = sstr->s_str + ssi;
|
||||
c = dstr->s_str + dsi;
|
||||
@@ -838,7 +844,7 @@ copyblk2str(BLOCK *sblk, long ssi, long num, STRING *dstr, long dsi)
|
||||
return 0; /* Nothing to be copied */
|
||||
if (dsi < 0) /* default destination index */
|
||||
dsi = 0;
|
||||
if (dsi + num > dstr->s_len)
|
||||
if ((size_t)(dsi + num) > dstr->s_len)
|
||||
num = dstr->s_len - dsi;
|
||||
c1 = sblk->data + ssi;
|
||||
c = (USB8 *)dstr->s_str + dsi;
|
||||
@@ -852,18 +858,18 @@ copyblk2str(BLOCK *sblk, long ssi, long num, STRING *dstr, long dsi)
|
||||
int
|
||||
copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi)
|
||||
{
|
||||
long len;
|
||||
size_t len;
|
||||
char *c, *c1;
|
||||
|
||||
len = (long)strlen(sstr);
|
||||
len = strlen(sstr);
|
||||
|
||||
if (num < 0 || ssi + num > len)
|
||||
if (num < 0 || (size_t)(ssi + num) > len)
|
||||
num = len - ssi;
|
||||
if (num <= 0) /* Nothing to be copied */
|
||||
return 0;
|
||||
if (dsi < 0)
|
||||
dsi = 0; /* Default destination index */
|
||||
if (dsi + num > dstr->s_len)
|
||||
if ((size_t)(dsi + num) > dstr->s_len)
|
||||
num = dstr->s_len - dsi;
|
||||
c1 = sstr + ssi;
|
||||
c = dstr->s_str + dsi;
|
||||
@@ -879,16 +885,16 @@ copyostr2str(char *sstr, long ssi, long num, STRING *dstr, long dsi)
|
||||
int
|
||||
copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
|
||||
{
|
||||
int len;
|
||||
int newlen;
|
||||
int newsize;
|
||||
size_t len;
|
||||
size_t newlen;
|
||||
size_t newsize;
|
||||
USB8 *newdata;
|
||||
|
||||
len = strlen(str) + 1;
|
||||
|
||||
if (ssi > len)
|
||||
if (ssi > 0 && (size_t)ssi > len)
|
||||
return E_COPY2;
|
||||
if (num < 0 || (unsigned long) ssi + num > len)
|
||||
if (num < 0 || (size_t)(ssi + num) > len)
|
||||
num = len - ssi;
|
||||
if (num <= 0) /* Nothing to be copied */
|
||||
return 0;
|
||||
@@ -897,7 +903,7 @@ copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
|
||||
newlen = dsi + num;
|
||||
if (newlen <= 0)
|
||||
return E_COPY7;
|
||||
if (newlen >= dblk->maxsize) {
|
||||
if (newlen >= (size_t)dblk->maxsize) {
|
||||
if (noreloc)
|
||||
return E_COPY17;
|
||||
newsize = (1 + newlen/dblk->blkchunk) * dblk->blkchunk;
|
||||
@@ -910,7 +916,7 @@ copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
|
||||
dblk->maxsize = newsize;
|
||||
}
|
||||
memmove(dblk->data + dsi, str + ssi, num);
|
||||
if (newlen > dblk->datalen)
|
||||
if (newlen > (size_t)dblk->datalen)
|
||||
dblk->datalen = newlen;
|
||||
return 0;
|
||||
}
|
||||
@@ -978,8 +984,8 @@ memmove(void *s1, const void *s2, CALC_SIZE_T n)
|
||||
int
|
||||
copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
|
||||
{
|
||||
long newlen;
|
||||
long newsize;
|
||||
size_t newlen;
|
||||
size_t newsize;
|
||||
USB8 *newdata;
|
||||
#if CALC_BYTE_ORDER == BIG_ENDIAN
|
||||
ZVALUE *swnum; /* byte swapped numerator */
|
||||
@@ -991,14 +997,14 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
|
||||
num = snum->num.len - ssi;
|
||||
if (num == 0) /* Nothing to be copied */
|
||||
return 0;
|
||||
if ((unsigned long) ssi + num > snum->num.len)
|
||||
if (ssi + num > snum->num.len)
|
||||
return E_COPY5;
|
||||
if (dsi < 0)
|
||||
dsi = dblk->datalen;
|
||||
newlen = dsi + (long)(num*sizeof(HALF));
|
||||
newlen = dsi + (num*sizeof(HALF));
|
||||
if (newlen <= 0)
|
||||
return E_COPY7;
|
||||
if (newlen >= dblk->maxsize) {
|
||||
if (newlen >= (size_t)dblk->maxsize) {
|
||||
if (noreloc)
|
||||
return E_COPY17;
|
||||
newsize = (1 + newlen/dblk->blkchunk) * dblk->blkchunk;
|
||||
@@ -1017,7 +1023,7 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
|
||||
memmove(dblk->data+dsi, (char *)(swnum->v+ssi), num*sizeof(HALF));
|
||||
zfree(*swnum);
|
||||
#endif
|
||||
if (newlen > dblk->datalen)
|
||||
if (newlen > (size_t)dblk->datalen)
|
||||
dblk->datalen = newlen;
|
||||
return 0;
|
||||
}
|
||||
@@ -1029,7 +1035,7 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
|
||||
int
|
||||
copyblk2num(BLOCK *sblk, long ssi, long num, NUMBER *dnum, long dsi, NUMBER **res)
|
||||
{
|
||||
long newlen;
|
||||
size_t newlen;
|
||||
NUMBER *ret; /* cloned and modified numerator */
|
||||
#if CALC_BYTE_ORDER == BIG_ENDIAN
|
||||
HALF *swapped; /* byte swapped input data */
|
||||
@@ -1044,11 +1050,11 @@ copyblk2num(BLOCK *sblk, long ssi, long num, NUMBER *dnum, long dsi, NUMBER **re
|
||||
num = sblk->datalen - ssi;
|
||||
if (num == 0) /* Nothing to be copied */
|
||||
return 0;
|
||||
if ((unsigned long) ssi + num > sblk->datalen)
|
||||
if (ssi + num > sblk->datalen)
|
||||
return E_COPY5;
|
||||
if (dsi < 0)
|
||||
dsi = dnum->num.len;
|
||||
newlen = dsi + (long)((num+sizeof(HALF)-1)/sizeof(HALF));
|
||||
newlen = dsi + ((num+sizeof(HALF)-1)/sizeof(HALF));
|
||||
if (newlen <= 0)
|
||||
return E_COPY7;
|
||||
|
||||
|
6
block.c
6
block.c
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: block.c,v 29.2 2000/06/07 14:02:13 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: block.c,v 29.3 2006/05/01 19:16:57 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/block.c,v $
|
||||
*
|
||||
* Under source code control: 1997/02/27 00:29:40
|
||||
@@ -57,7 +57,7 @@ static void blkchk(BLOCK*);
|
||||
*
|
||||
* given:
|
||||
* len - initial memory length of the block
|
||||
* type - BLK_TYPE_XXX
|
||||
* type - BLK_TYPE_XYZ
|
||||
* chunk - allocation chunk size
|
||||
*
|
||||
* returns:
|
||||
|
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: byteswap.h,v 29.3 2001/05/29 00:16:53 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: byteswap.h,v 29.4 2001/06/08 21:00:58 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/byteswap.h,v $
|
||||
*
|
||||
* Under source code control: 1995/10/11 04:44:01
|
||||
@@ -33,7 +33,7 @@
|
||||
#define __BYTESWAP_H__
|
||||
|
||||
|
||||
#if defined(SRC) /* if we are building from the calc source tree */
|
||||
#if defined(CALC_SRC) /* if we are building from the calc source tree */
|
||||
# include "longbits.h"
|
||||
#else
|
||||
# include <calc/longbits.h>
|
||||
|
183
cal/Makefile
183
cal/Makefile
@@ -18,8 +18,8 @@
|
||||
# received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# @(#) $Revision: 29.9 $
|
||||
# @(#) $Id: Makefile,v 29.9 2001/05/28 21:56:08 chongo Exp $
|
||||
# @(#) $Revision: 29.19 $
|
||||
# @(#) $Id: Makefile,v 29.19 2006/06/10 13:01:34 chongo Exp $
|
||||
# @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/Makefile,v $
|
||||
#
|
||||
# Under source code control: 1991/07/21 05:00:54
|
||||
@@ -36,16 +36,120 @@
|
||||
SHELL = /bin/sh
|
||||
MAKE_FILE = Makefile
|
||||
|
||||
####
|
||||
# Normally, the upper level makefile will set these values. We provide
|
||||
# a default here just in case you want to build from this directory.
|
||||
#
|
||||
# where to install things
|
||||
#SHAREDIR= /usr/local/lib
|
||||
#SHAREDIR= /usr/lib
|
||||
SHAREDIR= /usr/share
|
||||
#SHAREDIR= /usr/libdata
|
||||
####
|
||||
|
||||
CSHAREDIR= ${SHAREDIR}/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
|
||||
#
|
||||
@@ -66,13 +170,14 @@ CALC_FILES= README bigprime.cal deg.cal ellip.cal lucas.cal lucas_chk.cal \
|
||||
lucas_tbl.cal mersenne.cal mod.cal pell.cal pi.cal pix.cal \
|
||||
pollard.cal poly.cal psqrt.cal quat.cal regress.cal solve.cal \
|
||||
sumsq.cal surd.cal unitfrac.cal varargs.cal chrem.cal mfactor.cal \
|
||||
bindings randmprime.cal test1700.cal randrun.cal \
|
||||
bindings randmprime.cal test1700.cal randrun.cal linear.cal \
|
||||
randbitrun.cal bernoulli.cal test2300.cal test2600.cal \
|
||||
test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \
|
||||
test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \
|
||||
beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \
|
||||
randomrun.cal xx_print.cal natnumset.cal qtime.cal test8400.cal \
|
||||
test8500.cal test8600.cal chi.cal intfile.cal
|
||||
randomrun.cal repeat.cal xx_print.cal natnumset.cal qtime.cal \
|
||||
test8400.cal test8500.cal test8600.cal chi.cal intfile.cal screen.cal \
|
||||
dotest.cal set8700.cal set8700.line alg_config.cal
|
||||
|
||||
# These files are found (but not built) in the distribution
|
||||
#
|
||||
@@ -104,8 +209,10 @@ all: ${CALC_FILES} ${MAKE_FILE} .all
|
||||
##
|
||||
|
||||
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; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
distdir:
|
||||
@@ -124,12 +231,11 @@ calcliblist:
|
||||
#
|
||||
##
|
||||
|
||||
echo_CALC_FILES: ${MAKE_FILE}
|
||||
@echo ${CALC_FILES}
|
||||
|
||||
echo_install.list: ${MAKE_FILE}
|
||||
@for i in ${CALC_FILES}; do \
|
||||
echo ${CSHAREDIR}/$$i; \
|
||||
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
|
||||
|
||||
##
|
||||
@@ -144,30 +250,29 @@ clobber:
|
||||
rm -f .all
|
||||
|
||||
install: all
|
||||
-${Q}if [ ! -d ${SHAREDIR} ]; then \
|
||||
echo mkdir ${SHAREDIR}; \
|
||||
mkdir ${SHAREDIR}; \
|
||||
echo ${CHMOD} 0755 ${SHAREDIR}; \
|
||||
${CHMOD} 0755 ${SHAREDIR}; \
|
||||
-${Q}if [ ! -d $T${CALC_SHAREDIR} ]; then \
|
||||
echo mkdir $T${CALC_SHAREDIR}; \
|
||||
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 \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${CSHAREDIR} ]; then \
|
||||
echo mkdir ${CSHAREDIR}; \
|
||||
mkdir ${CSHAREDIR}; \
|
||||
echo ${CHMOD} 0755 ${CSHAREDIR}; \
|
||||
${CHMOD} 0755 ${CSHAREDIR}; \
|
||||
else \
|
||||
true; \
|
||||
fi
|
||||
${Q}for i in ${CALC_FILES}; do \
|
||||
if ${CMP} -s $$i ${CSHAREDIR}/$$i; then \
|
||||
${Q}for i in ${CALC_FILES} /dev/null; do \
|
||||
if [ "$$i" = "/dev/null" ]; then \
|
||||
continue; \
|
||||
fi; \
|
||||
if ${CMP} -s $$i $T${CALC_SHAREDIR}/$$i; then \
|
||||
true; \
|
||||
else \
|
||||
rm -f ${CSHAREDIR}/$$i.new; \
|
||||
cp -f $$i ${CSHAREDIR}/$$i.new; \
|
||||
${CHMOD} 0444 ${CSHAREDIR}/$$i.new; \
|
||||
mv -f ${CSHAREDIR}/$$i.new ${CSHAREDIR}/$$i; \
|
||||
echo "installed ${CSHAREDIR}/$$i"; \
|
||||
rm -f $T${CALC_SHAREDIR}/$$i.new; \
|
||||
cp -f $$i $T${CALC_SHAREDIR}/$$i.new; \
|
||||
${CHMOD} 0444 $T${CALC_SHAREDIR}/$$i.new; \
|
||||
mv -f $T${CALC_SHAREDIR}/$$i.new $T${CALC_SHAREDIR}/$$i; \
|
||||
echo "installed $T${CALC_SHAREDIR}/$$i"; \
|
||||
fi; \
|
||||
done
|
||||
|
198
cal/README
198
cal/README
@@ -12,7 +12,7 @@ Normally a resource file will simply define some functions. By default,
|
||||
most resource files will print out a short message when they are read.
|
||||
For example:
|
||||
|
||||
> read lucas
|
||||
; read lucas
|
||||
lucas(h,n) defined
|
||||
gen_u0(h,n,v1) defined
|
||||
gen_v1(h,n) defined
|
||||
@@ -22,9 +22,9 @@ will cause calc to load and execute the 'lucas.cal' resource file.
|
||||
Executing the resource file will cause several functions to be defined.
|
||||
Executing the lucas function:
|
||||
|
||||
> lucas(149,60)
|
||||
; lucas(149,60)
|
||||
1
|
||||
> lucas(146,61)
|
||||
; lucas(146,61)
|
||||
0
|
||||
|
||||
shows that 149*2^60-1 is prime whereas 146*2^61-1 is not.
|
||||
@@ -75,7 +75,7 @@ have meanings are as follows:
|
||||
is displayed.
|
||||
|
||||
2 Show func will display more information about a functions
|
||||
arguments as well as more argument sdummary information.
|
||||
arguments as well as more argument summary information.
|
||||
|
||||
3 During execution, allow calc standard resource files
|
||||
to output additional debugging information.
|
||||
@@ -103,7 +103,7 @@ either of the bottom 2 bits set:
|
||||
print "funcB(size, mass, ...) defined";
|
||||
}
|
||||
|
||||
If your the resource file needs to output special debugging informatin,
|
||||
If your the resource file needs to output special debugging information,
|
||||
we recommend that you check for bit 3 of the config("resource_debug")
|
||||
before printing the debug statement:
|
||||
|
||||
@@ -117,12 +117,68 @@ The following is a brief description of some of the calc resource files
|
||||
that are shipped with calc. See above for example of how to read in
|
||||
and execute these files.
|
||||
|
||||
alg_config.cal
|
||||
|
||||
global test_time
|
||||
mul_loop(repeat,x) defined
|
||||
mul_ratio(len) defined
|
||||
best_mul2() defined
|
||||
sq_loop(repeat,x) defined
|
||||
sq_ratio(len) defined
|
||||
best_sq2() defined
|
||||
pow_loop(repeat,x,ex) defined
|
||||
pow_ratio(len) defined
|
||||
best_pow2() defined
|
||||
|
||||
These functions search for an optimal value of config("mul2"),
|
||||
config("sq2"), and config("pow2"). The calc default values of these
|
||||
configuration values were set by running this resource file on a
|
||||
1.8GHz AMD 32-bit CPU of ~3406 BogoMIPS.
|
||||
|
||||
The best_mul2() function returns the optimal value of config("mul2").
|
||||
The best_sq2() function returns the optimal value of config("sq2").
|
||||
The best_pow2() function returns the optimal value of config("pow2").
|
||||
The other functions are just support functions.
|
||||
|
||||
By design, best_mul2(), best_sq2(), and best_pow2() take a few
|
||||
minutes to run. These functions increase the number of times a
|
||||
given computational loop is executed until a minimum amount of CPU
|
||||
time is consumed. To watch these functions progress, one can set
|
||||
the config("user_debug") value.
|
||||
|
||||
Here is a suggested way to use this resource file:
|
||||
|
||||
; read alg_config
|
||||
; config("user_debug",2),;
|
||||
; best_mul2(); best_sq2(); best_pow2();
|
||||
; best_mul2(); best_sq2(); best_pow2();
|
||||
; best_mul2(); best_sq2(); best_pow2();
|
||||
|
||||
NOTE: It is perfectly normal for the optimal value returned to differ
|
||||
slightly from run to run. Slight variations due to inaccuracy in
|
||||
CPU timings will cause the best value returned to differ slightly
|
||||
from run to run.
|
||||
|
||||
One can use a calc startup file to change the initial values of
|
||||
config("mul2"), config("sq2"), and config("pow2"). For example one
|
||||
can place into ~/.calcrc these lines:
|
||||
|
||||
config("mul2", 1780),;
|
||||
config("sq2", 3388),;
|
||||
config("pow2", 176),;
|
||||
|
||||
to automatically and silently change these config values.
|
||||
See help/config and CALCRC in help/environment for more information.
|
||||
|
||||
|
||||
beer.cal
|
||||
|
||||
Calc's contribution to the 99 Bottles of Beer web page:
|
||||
|
||||
http://www.ionet.net/~timtroyr/funhouse/beer.html#calc
|
||||
|
||||
NOTE: This resource produces a lot of output. :-)
|
||||
|
||||
|
||||
bernoulli.cal
|
||||
|
||||
@@ -132,7 +188,7 @@ bernoulli.cal
|
||||
|
||||
NOTE: There is now a bernoulli() builtin function. This file is
|
||||
left here for backward compatibility and now simply returns
|
||||
the buildin function.
|
||||
the builtin function.
|
||||
|
||||
|
||||
bigprime.cal
|
||||
@@ -153,9 +209,9 @@ chi.cal
|
||||
|
||||
The chi_prob() function does not work well with odd degrees of freedom.
|
||||
It is reasonable with even degrees of freedom, although one must give
|
||||
a sifficently small error term as the degress gets large (>100).
|
||||
a sufficiently small error term as the degrees gets large (>100).
|
||||
|
||||
The Z(x) and P(x) are internal statistical funcions.
|
||||
The Z(x) and P(x) are internal statistical functions.
|
||||
|
||||
eps is an optional epsilon() like error term.
|
||||
|
||||
@@ -180,6 +236,38 @@ deg.cal
|
||||
Calculate in degrees, minutes, and seconds.
|
||||
|
||||
|
||||
dotest.cal
|
||||
|
||||
dotest(dotest_file [,dotest_code [,dotest_maxcond]])
|
||||
|
||||
dotest_file
|
||||
|
||||
Search along CALCPATH for dotest_file, which contains lines that
|
||||
should evaluate to 1. Comment lines and empty lines are ignored.
|
||||
Comment lines should use ## instead of the multi like /* ... */
|
||||
because lines are evaluated one line at a time.
|
||||
|
||||
dotest_code
|
||||
|
||||
Assign the code number that is to be printed at the start of
|
||||
each non-error line and after **** in each error line.
|
||||
The default code number is 999.
|
||||
|
||||
dotest_maxcond
|
||||
|
||||
The maximum number of error conditions that may be detected.
|
||||
An error condition is not a sign of a problem, in some cases
|
||||
a line deliberately forces an error condition. A value of -1,
|
||||
the default, implies a maximum of 2147483647.
|
||||
|
||||
Global variables and functions must be declared ahead of time because
|
||||
the dotest scope of evaluation is a line at a time. For example:
|
||||
|
||||
read dotest.cal
|
||||
read set8700.cal
|
||||
dotest("set8700.line");
|
||||
|
||||
|
||||
ellip.cal
|
||||
|
||||
efactor(iN, ia, B, force)
|
||||
@@ -194,6 +282,8 @@ hello.cal
|
||||
http://www.latech.edu/~acm/HelloWorld.shtml
|
||||
http://www.latech.edu/~acm/helloworld/calc.html
|
||||
|
||||
NOTE: This resource produces a lot of output. :-)
|
||||
|
||||
|
||||
intfile.cal
|
||||
|
||||
@@ -222,6 +312,14 @@ intfile.cal
|
||||
of the integer become the last octets of the file.
|
||||
|
||||
|
||||
linear.cal
|
||||
|
||||
linear(x0, y0, x1, y1, x)
|
||||
|
||||
Returns the value y such that (x,y) in on the line (x0,y0), (x1,y1).
|
||||
Requires x0 != y0.
|
||||
|
||||
|
||||
lucas.cal
|
||||
|
||||
lucas(h, n)
|
||||
@@ -480,6 +578,16 @@ randrun.cal
|
||||
|
||||
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
|
||||
|
||||
@@ -487,6 +595,58 @@ regress.cal
|
||||
Errors are reported with '****' messages, or worse. :-)
|
||||
|
||||
|
||||
screen.cal
|
||||
|
||||
up
|
||||
CUU /* same as up */
|
||||
down = CUD
|
||||
CUD /* same as down */
|
||||
forward
|
||||
CUF /* same as forward */
|
||||
back = CUB
|
||||
CUB /* same as back */
|
||||
save
|
||||
SCP /* same as save */
|
||||
restore
|
||||
RCP /* same as restore */
|
||||
cls
|
||||
home
|
||||
eraseline
|
||||
off
|
||||
bold
|
||||
faint
|
||||
italic
|
||||
blink
|
||||
rapidblink
|
||||
reverse
|
||||
concealed
|
||||
/* Lowercase indicates foreground, uppercase background */
|
||||
black
|
||||
red
|
||||
green
|
||||
yellow
|
||||
blue
|
||||
magenta
|
||||
cyan
|
||||
white
|
||||
Black
|
||||
Red
|
||||
Green
|
||||
Yellow
|
||||
Blue
|
||||
Magenta
|
||||
Cyan
|
||||
White
|
||||
|
||||
Define ANSI control sequences providing (i.e., cursor movement, changing
|
||||
foreground or background color, etc.) for VT100 terminals and terminal
|
||||
window emulators (i.e., xterm, Apple OS/X Terminal, etc.) that support them.
|
||||
|
||||
For example:
|
||||
|
||||
read screen
|
||||
print green:"This is green. ":red:"This is red.":black
|
||||
|
||||
seedrandom.cal
|
||||
|
||||
seedrandom(seed1, seed2, bitsize [,trials])
|
||||
@@ -505,6 +665,24 @@ seedrandom.cal
|
||||
Blum primes for the modulus.
|
||||
|
||||
|
||||
set8700.cal
|
||||
|
||||
set8700_getA1() defined
|
||||
set8700_getA2() defined
|
||||
set8700_getvar() defined
|
||||
set8700_f(set8700_x) defined
|
||||
set8700_g(set8700_x) defined
|
||||
|
||||
Declare globals and define functions needed by dotest() (see
|
||||
dotest.cal) to evaluate set8700.line a line at a time.
|
||||
|
||||
|
||||
set8700.line
|
||||
|
||||
A line-by-line evaluation file for dotest() (see dotest.cal).
|
||||
The set8700.cal file (and dotest.cal) should be read first.
|
||||
|
||||
|
||||
solve.cal
|
||||
|
||||
solve(low, high, epsilon)
|
||||
@@ -815,8 +993,8 @@ xx_print.cal
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.8 $
|
||||
## @(#) $Id: README,v 29.8 2001/03/31 16:26:23 chongo Exp $
|
||||
## @(#) $Revision: 29.14 $
|
||||
## @(#) $Id: README,v 29.14 2006/06/11 07:22:05 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/README,v $
|
||||
##
|
||||
## Under source code control: 1990/02/15 01:50:32
|
||||
|
1253
cal/alg_config.cal
Normal file
1253
cal/alg_config.cal
Normal file
File diff suppressed because it is too large
Load Diff
16
cal/deg.cal
16
cal/deg.cal
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: deg.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $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 $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:50:33
|
||||
@@ -42,7 +42,7 @@ define dms(deg, min, sec)
|
||||
ans.deg = deg;
|
||||
ans.min = min;
|
||||
ans.sec = sec;
|
||||
fixdms(&ans);
|
||||
fixdms(ans);
|
||||
return ans;
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ define dms_add(a, b)
|
||||
ans.sec += b.sec;
|
||||
} else
|
||||
ans.deg += b;
|
||||
fixdms(&ans);
|
||||
fixdms(ans);
|
||||
return ans;
|
||||
}
|
||||
|
||||
@@ -75,9 +75,9 @@ define dms_neg(a)
|
||||
{
|
||||
local obj dms ans;
|
||||
|
||||
ans.deg = -ans.deg;
|
||||
ans.min = -ans.min;
|
||||
ans.sec = -ans.sec;
|
||||
ans.deg = -a.deg;
|
||||
ans.min = -a.min;
|
||||
ans.sec = -a.sec;
|
||||
return ans;
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ define dms_mul(a, b)
|
||||
ans.min = b.min * a;
|
||||
ans.sec = b.sec * a;
|
||||
}
|
||||
fixdms(&ans);
|
||||
fixdms(ans);
|
||||
return ans;
|
||||
}
|
||||
|
||||
|
193
cal/dotest.cal
Normal file
193
cal/dotest.cal
Normal file
@@ -0,0 +1,193 @@
|
||||
/*
|
||||
* dotest - test truth statements found in line tests of dotest_testline file
|
||||
*
|
||||
* This file was created by Ernest Bowen <ebowen at une dot edu dot au>
|
||||
* and modified by Landon Curt Noll.
|
||||
*
|
||||
* This dotest_code has been placed in the public domain. Please do not
|
||||
* copyright this dotest_code.
|
||||
*
|
||||
* ERNEST BOWEN AND LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER-
|
||||
* CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT
|
||||
* NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: dotest.cal,v 29.2 2006/05/21 00:55:27 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/dotest.cal,v $
|
||||
*
|
||||
* This file is not covered under version 2.1 of the GNU LGPL.
|
||||
*
|
||||
* Under source dotest_code control: 2006/03/08 05:54:09
|
||||
* File existed as early as: 2006
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* dotest - perform tests from dotest_testline file
|
||||
*
|
||||
* given:
|
||||
* dotest_file filename containing single test lines
|
||||
* dotest_code regress.cal test number to use (def: 0)
|
||||
* dotest_maxcond max error conditions allowed (def: <0 ==> 2^31-1)
|
||||
*
|
||||
* returns:
|
||||
* number of line test failures
|
||||
*
|
||||
* NOTE: All variables used by the dotest() function start with "dotest_".
|
||||
* The dotest_file and dotest_read should not use any variable
|
||||
* that starts with "dotest_".
|
||||
*/
|
||||
define dotest(dotest_file, dotest_code = 0, dotest_maxcond = -1)
|
||||
{
|
||||
local dotest_f_file; /* open file containing test lines */
|
||||
local dotest_testline; /* test line */
|
||||
local dotest_testeval; /* eval value from dotest_testline test line */
|
||||
local dotest_tmperrcnt; /* temp error count after line test */
|
||||
local dotest_errcnt; /* total number of errors */
|
||||
local dotest_failcnt; /* number of line tests failed */
|
||||
local dotest_testnum; /* number of test lines evaluated */
|
||||
local dotest_linenum; /* test line number */
|
||||
local dotest_old_errmax; /* value of errmax() prior to calling */
|
||||
local dotest_old_errcount; /* value of errcount() prior to calling */
|
||||
|
||||
/*
|
||||
* preserve calling stats
|
||||
*/
|
||||
dotest_old_errmax = errmax();
|
||||
dotest_old_errcount = errcount(0);
|
||||
|
||||
/*
|
||||
* initialize test accounting
|
||||
*/
|
||||
dotest_errcnt = errcount();
|
||||
dotest_failcnt = 0;
|
||||
dotest_testnum = 0;
|
||||
dotest_linenum = 0;
|
||||
|
||||
/*
|
||||
* setup error accounting for dotest
|
||||
*/
|
||||
if (dotest_maxcond >= 0 && dotest_maxcond < 2147483647) {
|
||||
errmax(dotest_maxcond + dotest_old_errcount + 1),;
|
||||
} else {
|
||||
errmax(2147483647),;
|
||||
}
|
||||
|
||||
/*
|
||||
* open the test line file
|
||||
*/
|
||||
printf("%d-: opening line file: %d", dotest_code, dotest_file);
|
||||
dotest_f_file = fpathopen(dotest_file, "r");
|
||||
if (!isfile(dotest_f_file)) {
|
||||
printf("**** Unable to file or open file \"%s\"\n",
|
||||
dotest_file);
|
||||
quit;
|
||||
}
|
||||
printf('%d: testing "%s"\n', dotest_code, dotest_file);
|
||||
|
||||
/*
|
||||
* perform dotest_testline test on each line of the file
|
||||
*/
|
||||
for (;;) {
|
||||
|
||||
/* get the next test line */
|
||||
dotest_testline = fgets(dotest_f_file);
|
||||
++dotest_linenum;
|
||||
if (iserror(dotest_testline)) {
|
||||
quit "**** Error while reading file";
|
||||
} else if (isnull(dotest_testline)) {
|
||||
/* EOF - end of test file */
|
||||
break;
|
||||
}
|
||||
|
||||
/* skip empty lines */
|
||||
if (dotest_testline == "\n") {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* evaluate the test line */
|
||||
dotest_testeval = eval(dotest_testline);
|
||||
|
||||
/* ignore white space or comment lines */
|
||||
if (isnull(dotest_testeval)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* look for test line parse errors */
|
||||
if (iserror(dotest_testeval)) {
|
||||
printf("**** evaluation error: ");
|
||||
++dotest_failcnt;
|
||||
|
||||
/* look for test line dotest_failcnt */
|
||||
} else if (dotest_testeval != 1) {
|
||||
printf("**** did not return 1: ");
|
||||
++dotest_failcnt;
|
||||
}
|
||||
|
||||
/* show the test line we just performed */
|
||||
printf("%d-%d: %s", dotest_code, dotest_linenum, dotest_testline);
|
||||
|
||||
/* error accounting */
|
||||
dotest_tmperrcnt = errcount() - dotest_errcnt;
|
||||
if (dotest_tmperrcnt > 0) {
|
||||
|
||||
/* report any other errors */
|
||||
if (dotest_tmperrcnt > 1) {
|
||||
printf("%d-%d: NOTE: %d error conditions(s): %s\n",
|
||||
dotest_code, dotest_linenum, dotest_tmperrcnt);
|
||||
}
|
||||
|
||||
/* report the calc error string */
|
||||
printf("%d-%d: NOTE: last error string: %s\n",
|
||||
dotest_code, dotest_linenum, strerror());
|
||||
|
||||
/* new error count level */
|
||||
dotest_errcnt = errcount();
|
||||
if (dotest_maxcond >= 0 &&
|
||||
dotest_old_errcount-dotest_errcnt > dotest_maxcond) {
|
||||
printf("%d-%d: total error conditions: %d > %d\n",
|
||||
dotest_code, dotest_linenum,
|
||||
dotest_maxcond, dotest_old_errcount-dotest_errcnt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* test the close of the line file
|
||||
*/
|
||||
printf("%d-: detected %d error condition(s), many of which may be OK\n",
|
||||
dotest_code, dotest_old_errcount-dotest_errcnt);
|
||||
printf("%d-: closing line file: %d\n", dotest_code, dotest_file);
|
||||
fclose(dotest_f_file);
|
||||
|
||||
/*
|
||||
* test line file accounting
|
||||
*/
|
||||
if (dotest_failcnt > 0) {
|
||||
printf("**** %d-: %d test failure(s) in %d line(s)\n",
|
||||
dotest_code, dotest_failcnt, dotest_linenum);
|
||||
} else {
|
||||
printf("%d-: no failure(s) in %d line(s)\n",
|
||||
dotest_code, dotest_linenum);
|
||||
}
|
||||
|
||||
/*
|
||||
* preppare to return to the caller environment
|
||||
*
|
||||
* We increase the caller's error count by the number
|
||||
* of line tests that failed, not the number of internal
|
||||
* errors that were noted.
|
||||
*/
|
||||
errmax(dotest_old_errmax),;
|
||||
errcount(dotest_old_errcount + dotest_failcnt),;
|
||||
|
||||
/*
|
||||
* All Done!!! -- Jessica Noll, Age 2
|
||||
*/
|
||||
return dotest_failcnt;
|
||||
}
|
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: ellip.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: ellip.cal,v 29.4 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/ellip.cal,v $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:50:33
|
||||
@@ -28,16 +28,17 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Attempt to factor numbers using elliptic functions.
|
||||
* y^2 = x^3 + a*x + b (mod N).
|
||||
* Attempt to factor numbers using elliptic functions:
|
||||
*
|
||||
* Many points (x,y) (mod N) are found that solve the above equation,
|
||||
* y^2 = x^3 + a*x + b (mod ellip_N).
|
||||
*
|
||||
* Many points (x,y) (mod ellip_N) are found that solve the above equation,
|
||||
* starting from a trivial solution and 'multiplying' that point together
|
||||
* to generate high powers of the point, looking for such a point whose
|
||||
* order contains a common factor with N. The order of the group of points
|
||||
* varies almost randomly within a certain interval for each choice of a
|
||||
* and b, and thus each choice provides an independent opportunity to
|
||||
* factor N. To generate a trivial solution, a is chosen and then b is
|
||||
* order contains a common factor with ellip_N. The order of the group of
|
||||
* points varies almost randomly within a certain interval for each choice of
|
||||
* a and b, and thus each choice provides an independent opportunity to
|
||||
* factor ellip_N. To generate a trivial solution, a is chosen and then b is
|
||||
* selected so that (1,1) is a solution. The multiplication is done using
|
||||
* the basic fact that the equation is a cubic, and so if a line hits the
|
||||
* curve in two rational points, then the third intersection point must
|
||||
@@ -45,9 +46,9 @@
|
||||
* the number of rational solutions can be made very large. When modular
|
||||
* arithmetic is used, solving for the third point requires the taking of a
|
||||
* modular inverse (instead of division), and if this fails, then the GCD
|
||||
* of the failing value and N provides a factor of N. This description is
|
||||
* only an approximation, read "A Course in Number Theory and Cryptography"
|
||||
* by Neal Koblitz for a good explanation.
|
||||
* of the failing value and ellip_N provides a factor of ellip_N.
|
||||
* This description is only an approximation, read "A Course in Number
|
||||
* Theory and Cryptography" by Neal Koblitz for a good explanation.
|
||||
*
|
||||
* efactor(iN, ia, B, force)
|
||||
* iN is the number to be factored.
|
||||
@@ -81,15 +82,15 @@
|
||||
*
|
||||
* If a factor is found, it is returned and is also saved in the global
|
||||
* variable f. The number being factored is also saved in the global
|
||||
* variable N.
|
||||
* variable ellip_N.
|
||||
*/
|
||||
|
||||
|
||||
obj point {x, y};
|
||||
global N; /* number to factor */
|
||||
global a; /* first coefficient */
|
||||
global b; /* second coefficient */
|
||||
global f; /* found factor */
|
||||
global ellip_N; /* number to factor */
|
||||
global ellip_a; /* first coefficient */
|
||||
global ellip_b; /* second coefficient */
|
||||
global ellip_f; /* found factor */
|
||||
|
||||
|
||||
define efactor(iN, ia, B, force)
|
||||
@@ -103,28 +104,28 @@ define efactor(iN, ia, B, force)
|
||||
if (isnull(ia))
|
||||
ia = 1;
|
||||
obj point x;
|
||||
a = ia;
|
||||
b = -ia;
|
||||
N = iN;
|
||||
C = isqrt(N);
|
||||
ellip_a = ia;
|
||||
ellip_b = -ia;
|
||||
ellip_N = iN;
|
||||
C = isqrt(ellip_N);
|
||||
C = 2 * C + 2 * isqrt(C) + 1;
|
||||
f = 0;
|
||||
while (f == 0) {
|
||||
print "A =", a;
|
||||
ellip_f = 0;
|
||||
while (ellip_f == 0) {
|
||||
print "A =", ellip_a;
|
||||
x.x = 1;
|
||||
x.y = 1;
|
||||
print 2, x;
|
||||
x = x ^ (2 ^ (highbit(C) + 1));
|
||||
for (p = 3; ((p < B) && (f == 0)); p += 2) {
|
||||
for (p = 3; ((p < B) && (ellip_f == 0)); p += 2) {
|
||||
if (!ptest(p, 1))
|
||||
continue;
|
||||
print p, x;
|
||||
x = x ^ (p ^ ((highbit(C) // highbit(p)) + 1));
|
||||
}
|
||||
a++;
|
||||
b--;
|
||||
ellip_a++;
|
||||
ellip_b--;
|
||||
}
|
||||
return f;
|
||||
return ellip_f;
|
||||
}
|
||||
|
||||
|
||||
@@ -141,18 +142,18 @@ define point_mul(p1, p2)
|
||||
if (p2 == 1)
|
||||
return p1;
|
||||
if (p1 == p2)
|
||||
return point_square(&p1);
|
||||
return point_square(`p1);
|
||||
obj point r;
|
||||
m = (minv(p2.x - p1.x, N) * (p2.y - p1.y)) % N;
|
||||
m = (minv(p2.x - p1.x, ellip_N) * (p2.y - p1.y)) % ellip_N;
|
||||
if (m == 0) {
|
||||
if (f == 0)
|
||||
f = gcd(p2.x - p1.x, N);
|
||||
if (ellip_f == 0)
|
||||
ellip_f = gcd(p2.x - p1.x, ellip_N);
|
||||
r.x = 1;
|
||||
r.y = 1;
|
||||
return r;
|
||||
}
|
||||
r.x = (m^2 - p1.x - p2.x) % N;
|
||||
r.y = ((m * (p1.x - r.x)) - p1.y) % N;
|
||||
r.x = (m^2 - p1.x - p2.x) % ellip_N;
|
||||
r.y = ((m * (p1.x - r.x)) - p1.y) % ellip_N;
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -162,16 +163,16 @@ define point_square(p)
|
||||
local r, m;
|
||||
|
||||
obj point r;
|
||||
m = ((3 * p.x^2 + a) * minv(p.y << 1, N)) % N;
|
||||
m = ((3 * p.x^2 + ellip_a) * minv(p.y << 1, ellip_N)) % ellip_N;
|
||||
if (m == 0) {
|
||||
if (f == 0)
|
||||
f = gcd(p.y << 1, N);
|
||||
if (ellip_f == 0)
|
||||
ellip_f = gcd(p.y << 1, ellip_N);
|
||||
r.x = 1;
|
||||
r.y = 1;
|
||||
return r;
|
||||
}
|
||||
r.x = (m^2 - p.x - p.x) % N;
|
||||
r.y = ((m * (p.x - r.x)) - p.y) % N;
|
||||
r.x = (m^2 - p.x - p.x) % ellip_N;
|
||||
r.y = ((m * (p.x - r.x)) - p.y) % ellip_N;
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -184,10 +185,10 @@ define point_pow(p, pow)
|
||||
if (isodd(pow))
|
||||
r = p;
|
||||
t = p;
|
||||
for (bit = 2; ((bit <= pow) && (f == 0)); bit <<= 1) {
|
||||
t = point_square(&t);
|
||||
for (bit = 2; ((bit <= pow) && (ellip_f == 0)); bit <<= 1) {
|
||||
t = point_square(`t);
|
||||
if (bit & pow)
|
||||
r = point_mul(&t, &r);
|
||||
r = point_mul(`t, `r);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
26
cal/linear.cal
Normal file
26
cal/linear.cal
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* linear - perform a simple two point 2D linear interpolation
|
||||
*
|
||||
* given:
|
||||
* x0, y0 first known point on the line
|
||||
* x1, y1 second knonw point on the line
|
||||
* x a given point to interpolate on
|
||||
*
|
||||
* returns:
|
||||
* y such that (x,y) is on the line defined by (x0,y0) and (x1,y1)
|
||||
*
|
||||
* NOTE: The line cannot be vertical. So x0 != y0.
|
||||
*/
|
||||
define linear(x0, y0, x1, y1, x)
|
||||
{
|
||||
/* firewall */
|
||||
if (!isnum(x0) || ! isnum(y0) || !isnum(x1) || ! isnum(y1) || !isnum(x)) {
|
||||
quit "non-numeric argument passed to linear";
|
||||
}
|
||||
if (x0 == x1) {
|
||||
quit "linear given a line with an infinite slope";
|
||||
}
|
||||
|
||||
/* return y = y0 + (delta_Y/delta_X) * (x - x0) */
|
||||
return y0 + (((y1-y0)/(x1-x0)) * (x - x0));
|
||||
}
|
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: lucas.cal,v 29.3 2001/03/31 13:31:34 chongo Exp $
|
||||
* @(#) $Revision: 29.6 $
|
||||
* @(#) $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 $
|
||||
*
|
||||
* 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/
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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:
|
||||
*
|
||||
@@ -52,12 +62,19 @@
|
||||
*
|
||||
* 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
|
||||
* broken. Rather than update this file each time, I'll just
|
||||
* congratulate the finders and encourage others to try for
|
||||
* 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
|
||||
* 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
|
||||
* 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
|
||||
* 0 < h < 2^39
|
||||
* h*2^n+1 is not divisible by any small prime < 2^40
|
||||
|
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: natnumset.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: natnumset.cal,v 29.3 2006/05/01 19:19:46 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/natnumset.cal,v $
|
||||
*
|
||||
* Under source code control: 1997/09/07 23:53:51
|
||||
@@ -471,7 +471,7 @@ define set_plus(a) = set_sum(a);
|
||||
define interval(a, b)
|
||||
{
|
||||
local i, j, s;
|
||||
static tail = str("\0\1\3\7\17\37\77\177\377");
|
||||
static tail = "\0\1\3\7\17\37\77\177\377";
|
||||
|
||||
if (!isint(a) || !isint(b))
|
||||
quit "Non-integer argument for interval";
|
||||
|
10
cal/pi.cal
10
cal/pi.cal
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: pi.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.5 $
|
||||
* @(#) $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 $
|
||||
*
|
||||
* Under source code control: 1991/05/22 21:56:37
|
||||
@@ -61,7 +61,7 @@ define qpi(epsilon)
|
||||
yn = sqrt2 - 1;
|
||||
an = 6 - 4 * sqrt2;
|
||||
tn = 2;
|
||||
for (count = 0; count < niter; count++) {
|
||||
for (count = 0; count < niter; ++count) {
|
||||
ym = yn;
|
||||
am = an;
|
||||
tn *= 4;
|
||||
@@ -104,7 +104,7 @@ define piforever()
|
||||
* Next approximation
|
||||
*/
|
||||
p = k * k;
|
||||
q = k + k++;
|
||||
q = k + ++k;
|
||||
|
||||
a2 = a;
|
||||
b2 = b;
|
||||
|
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: prompt.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: prompt.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/prompt.cal,v $
|
||||
*
|
||||
* Under source code control: 1995/12/18 04:43:25
|
||||
@@ -101,7 +101,7 @@ define adder() {
|
||||
}
|
||||
}
|
||||
|
||||
global x;
|
||||
global prompt_x;
|
||||
|
||||
define showvalues(str) {
|
||||
local s;
|
||||
@@ -109,8 +109,8 @@ define showvalues(str) {
|
||||
s = prompt("? ");
|
||||
if (s == "end")
|
||||
break;
|
||||
x = eval(s);
|
||||
if (!isnum(x)) {
|
||||
prompt_x = eval(s);
|
||||
if (!isnum(prompt_x)) {
|
||||
print "Please enter a number";
|
||||
continue;
|
||||
}
|
||||
|
451
cal/regress.cal
451
cal/regress.cal
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* regress - calc regression and correctness test suite
|
||||
*
|
||||
* Copyright (C) 1999 David I. Bell
|
||||
* Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.10 $
|
||||
* @(#) $Id: regress.cal,v 29.10 2001/04/14 22:53:57 chongo Exp $
|
||||
* @(#) $Revision: 29.31 $
|
||||
* @(#) $Id: regress.cal,v 29.31 2006/06/20 10:25:00 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/regress.cal,v $
|
||||
*
|
||||
* 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() */
|
||||
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("calc_debug", 0),; /* disable internal debugging */
|
||||
config("verbose_quit", 0),; /* disable quit messages */
|
||||
@@ -200,7 +201,6 @@ define test_variables()
|
||||
local x1, x2, x3;
|
||||
global g1, g2;
|
||||
local t;
|
||||
global globalvar;
|
||||
local x;
|
||||
|
||||
print '350: Beginning test_variables';
|
||||
@@ -380,19 +380,19 @@ define test_config()
|
||||
/* check the set and return of all config */
|
||||
callcfg = config("all");
|
||||
print '501: callcfg = config("all")';
|
||||
vrfy(callcfg == startcfg, '502: callcfg == startcfg');
|
||||
|
||||
callcfg = config("all", "oldstd");
|
||||
print '502: callcfg = config("all","oldstd")';
|
||||
oldcfg = config("all", "newstd");
|
||||
print '503: oldcfg = config("all","newstd")';
|
||||
print '503: callcfg = config("all","oldstd")';
|
||||
vrfy(callcfg == startcfg, '504: callcfg == startcfg');
|
||||
newcfg = config("all");
|
||||
print '505: newcfg = config("all")';
|
||||
vrfy(config("all") == newcfg, '506: config("all") == newcfg');
|
||||
vrfy(config("all", oldcfg) == newcfg,
|
||||
'507: config("all", oldcfg) == newcfg');
|
||||
oldcfg = config("all");
|
||||
print '505: oldcfg = config("all");';
|
||||
vrfy(config("all") == oldcfg, '506: config("all") == oldcfg');
|
||||
vrfy(oldcfg==config("all","newstd"),
|
||||
'507: oldcfg==config("all","newstd")');
|
||||
vrfy(defcfg == config("all"), '508: defcfg == config("all")');
|
||||
|
||||
/* vrfy the state of the default config */
|
||||
vrfy(config("all") == oldcfg, '508: config("all") == oldcfg');
|
||||
vrfy(config("mode") == "real",
|
||||
'509: config("mode") == "real"');
|
||||
vrfy(config("display") == 20,
|
||||
@@ -403,14 +403,14 @@ define test_config()
|
||||
'512: config("trace") == 0');
|
||||
vrfy(config("maxprint") == 16,
|
||||
'513: config("maxprint") == 16');
|
||||
vrfy(config("mul2") == 20,
|
||||
'514: config("mul2") == 20');
|
||||
vrfy(config("sq2") == 20,
|
||||
'515: config("sq2") == 20');
|
||||
vrfy(config("pow2") == 40,
|
||||
'516: config("pow2") == 40');
|
||||
vrfy(config("redc2") == 50,
|
||||
'517: config("redc2") == 50');
|
||||
vrfy(config("mul2") == 1780,
|
||||
'514: config("mul2") == 1780');
|
||||
vrfy(config("sq2") == 3388,
|
||||
'515: config("sq2") == 3388');
|
||||
vrfy(config("pow2") == 176,
|
||||
'516: config("pow2") == 176');
|
||||
vrfy(config("redc2") == 220,
|
||||
'517: config("redc2") == 220');
|
||||
vrfy(config("tilde"),
|
||||
'518: config("tilde")');
|
||||
vrfy(config("tab"),
|
||||
@@ -429,58 +429,59 @@ define test_config()
|
||||
'525: config("cfappr") == 0');
|
||||
vrfy(config("cfsim") == 8,
|
||||
'526: config("cfsim") == 8');
|
||||
vrfy(config("outround") == 2,
|
||||
'527: config("outround") == 2');
|
||||
vrfy(config("outround") == 24,
|
||||
'527: config("outround") == 24');
|
||||
vrfy(config("round") == 24,
|
||||
'528: config("round") == 24');
|
||||
vrfy(config("leadzero") == 0,
|
||||
'529: config("leadzero") == 0');
|
||||
vrfy(config("leadzero") == 1,
|
||||
'529: config("leadzero") == 1');
|
||||
vrfy(config("fullzero") == 0,
|
||||
'530: config("fullzero") == 0');
|
||||
vrfy(config("maxscan") == 20,
|
||||
'531: config("maxscan") == 20');
|
||||
vrfy(config("prompt") == "> ",
|
||||
'532: config("prompt") == "> "');
|
||||
vrfy(config("more") == ">> ",
|
||||
'533: config("more") == ">> "');
|
||||
vrfy(config("prompt") == "; ",
|
||||
'532: config("prompt") == "; "');
|
||||
vrfy(config("more") == ";; ",
|
||||
'533: config("more") == ";; "');
|
||||
|
||||
/* convert to "newstd" config by individual changes */
|
||||
vrfy(config("display", 10) == 20,
|
||||
'534: config("display") == 20');
|
||||
vrfy(config("epsilon",1e-10)==1e-20,
|
||||
'535: config("epsilon",1e-10)==1e-20');
|
||||
vrfy(config("quo", 0) == 2, '536: config("quo", 0) == 2');
|
||||
vrfy(config("outround", 24) == 2,
|
||||
'537: config("outround", 24) == 2');
|
||||
vrfy(config("leadzero","y") == 0,
|
||||
'538: config("leadzero","y") == 0');
|
||||
vrfy(config("fullzero", 1) == 0,
|
||||
'539: config("fullzero", 1) == 0');
|
||||
vrfy(config("prompt", "; ") == "> ",
|
||||
'540: config("prompt", "; ") == "> "');
|
||||
vrfy(config("more", ";; ") == ">> ",
|
||||
'541: config("more", ";; ") == ">> "');
|
||||
vrfy(config("all") == newcfg, '542: config("all") == newcfg');
|
||||
/* convert to "oldstd" config by individual changes */
|
||||
print '534: test unused';
|
||||
vrfy(config("outround", 2) == 24,
|
||||
'535: config("outround", 2) == 24');
|
||||
vrfy(config("leadzero","n") == 1,
|
||||
'536: config("leadzero","n") == 1');
|
||||
print '537: test unused';
|
||||
vrfy(config("prompt", "> ") == "; ",
|
||||
'538: config("prompt", "> ") == "; "');
|
||||
vrfy(config("more", ">> ") == ";; ",
|
||||
'539: config("more", ">> ") == ";; "');
|
||||
vrfy(config("all") == oldcfg, '540: config("all") == oldcfg');
|
||||
|
||||
/* check on the new config("fullzero") effect */
|
||||
vrfy(config("all","oldstd") == newcfg,
|
||||
'543: config("all",callcfg) == newcfg');
|
||||
/* restore the configation at the start of this function */
|
||||
vrfy(config("all",callcfg) == oldcfg,
|
||||
'541: config("all",callcfg) == oldcfg');
|
||||
|
||||
/* display and fullzero tests */
|
||||
vrfy(config("display",2) == 20,
|
||||
'544: config("display",2) == 20');
|
||||
'542: config("display",2) == 20');
|
||||
vrfy(config("leadzero",0) == 1,
|
||||
'543: config("leadzero",0) == 1');
|
||||
vrfy(config("fullzero",1) == 0,
|
||||
'545: config("fullzero",1) == 0');
|
||||
'544: config("fullzero",1) == 0');
|
||||
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,
|
||||
'547: config("display",20) == 2');
|
||||
vrfy(config("fullzero",0),
|
||||
'548: config("fullzero",0)');
|
||||
'546: config("display",20) == 2');
|
||||
vrfy(config("leadzero",1) == 0,
|
||||
'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",
|
||||
'549: strprintf("%d %d %d", 0, 1, 2) == "0 1 2"');
|
||||
|
||||
/* restore calling config */
|
||||
vrfy(config("all",callcfg) == oldcfg,
|
||||
'550: config("all",callcfg) == oldcfg');
|
||||
vrfy(config("all",callcfg) == startcfg,
|
||||
'550: config("all",callcfg) == startcfg');
|
||||
vrfy(config("all") == callcfg, '551: config("all") == callcfg');
|
||||
vrfy(config("all") == startcfg, '552: config("all") == startcfg');
|
||||
|
||||
@@ -492,7 +493,11 @@ define test_config()
|
||||
vrfy(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()';
|
||||
|
||||
@@ -755,7 +760,7 @@ define test_functions()
|
||||
vrfy(den(17) == 1, '712: den(17) == 1');
|
||||
vrfy(den(3/7) == 7, '713: den(3/7) == 7');
|
||||
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(10) == 2, '717: digits(10) == 2');
|
||||
vrfy(digits(-691) == 3, '718: digits(-691) == 3');
|
||||
@@ -996,9 +1001,9 @@ define test_functions()
|
||||
vrfy(strpos(a, "abc") == 1, '946: strpos(a, "abc") == 1');
|
||||
vrfy(strpos(a, "xyz") == 0, '947: strpos(a, "xyz") == 0');
|
||||
vrfy(strpos(a, a) == 1, '948: strpos(a, a) == 1');
|
||||
if (config("windows")) {
|
||||
print '949: test skipped for windows systems';
|
||||
print '950: test skipped for windows systems';
|
||||
if (config("windows") || config("cygwin")) {
|
||||
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');
|
||||
@@ -1034,8 +1039,8 @@ define test_functions()
|
||||
vrfy(digit(a,-1) == 4, '974: digit(a,-1) == 4');
|
||||
vrfy(digit(a,-2) == 2, '975: digit(a,-2) == 2');
|
||||
vrfy(digit(a,-3) == 8, '976: digit(a,-3) == 8');
|
||||
vrfy(digits(0) == 0, '977: digits(0) == 0');
|
||||
vrfy(digits(0.0123) == 0, '978: digits(0.0123) == 0');
|
||||
vrfy(digits(0) == 1, '977: digits(0) == 1');
|
||||
vrfy(digits(0.0123) == 1, '978: digits(0.0123) == 1');
|
||||
vrfy(digits(3.7) == 1, '979: digits(3.7) == 1');
|
||||
vrfy(digits(-27) == 2, '980: digits(-27) == 2');
|
||||
vrfy(digits(-99.7) == 2, '981: digits(-99.7) == 2');
|
||||
@@ -1304,9 +1309,14 @@ define test_functions()
|
||||
* verify sleep
|
||||
*/
|
||||
vrfy(sleep(1/5) == null(), '1153: sleep(1/5) == null()');
|
||||
vrfy(sleep(1) == null(), '1154: sleep(1) == null()');
|
||||
vrfy(sleep(1/100) == null(), '1154: sleep(1/100) == null()');
|
||||
|
||||
print '1155: Ending test_functions';
|
||||
/*
|
||||
* verify calcpath
|
||||
*/
|
||||
vrfy(isstr(calcpath()), '1155: isstr(calcpath())');
|
||||
|
||||
print '1156: Ending test_functions';
|
||||
}
|
||||
print '017: parsed test_functions()';
|
||||
|
||||
@@ -1793,7 +1803,23 @@ define test_mode()
|
||||
vrfy(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()';
|
||||
|
||||
@@ -2188,6 +2214,7 @@ print '033: read -once test2300';
|
||||
define test_xx_incdec()
|
||||
{
|
||||
local A, B;
|
||||
local n;
|
||||
|
||||
print '2300: Beginning object increment/decrement test';
|
||||
|
||||
@@ -2220,6 +2247,20 @@ define test_xx_incdec()
|
||||
vrfy(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 '034: parsed test_xx_incdec()';
|
||||
@@ -2534,6 +2575,49 @@ define test_2600()
|
||||
i = config("sqrt", i);
|
||||
print tnum++: ': i = config("sqrt", i)';
|
||||
|
||||
i = epsilon(1e-100),;
|
||||
print tnum++: ': i = epsilon(1e-100),;';
|
||||
vrfy(ln(exp(6)) == 6,
|
||||
strcat(str(tnum++), ': ln(exp(6)) == 6'));
|
||||
vrfy(ln(exp(4)^4) == 16,
|
||||
strcat(str(tnum++), ': ln(exp(4)^4) == 16'));
|
||||
vrfy(ln(exp(6.5)^8) == 52,
|
||||
strcat(str(tnum++), ': ln(exp(6.5)^8) == 52'));
|
||||
vrfy(ln(exp(5)^16) == 80,
|
||||
strcat(str(tnum++), ': ln(exp(5)^16) == 80'));
|
||||
vrfy(ln(exp(4.5)^4) == 18,
|
||||
strcat(str(tnum++), ': ln(exp(4.5)^4) == 18'));
|
||||
vrfy(ln(exp(4)^8) == 32,
|
||||
strcat(str(tnum++), ': ln(exp(4)^8) == 32'));
|
||||
vrfy(ln(exp(60/11)^11) == 60,
|
||||
strcat(str(tnum++), ': ln(exp(60/11)^11) == 60'));
|
||||
vrfy(ln(exp(6)^15) == 90,
|
||||
strcat(str(tnum++), ': ln(exp(6)^11) == 90'));
|
||||
vrfy(ln(exp(80/17)^17) == 80,
|
||||
strcat(str(tnum++), ': ln(exp(80/17)^17) == 80'));
|
||||
vrfy(ln(exp(6)^15) == 90,
|
||||
strcat(str(tnum++), ': ln(exp(6)^15) == 90'));
|
||||
vrfy(ln(exp(5)^18) == 90,
|
||||
strcat(str(tnum++), ': ln(exp(5)^18) == 90'));
|
||||
vrfy(log(1e6) == 6,
|
||||
strcat(str(tnum++), ': log(1e6)) == 6'));
|
||||
vrfy(log(1) == 0,
|
||||
strcat(str(tnum++), ': log(1)) == 0'));
|
||||
vrfy(log(100) == 2,
|
||||
strcat(str(tnum++), ': log(100)) == 2'));
|
||||
vrfy(log(1e66) == 66,
|
||||
strcat(str(tnum++), ': log(1e66)) == 66'));
|
||||
vrfy(log(1e127) == 127,
|
||||
strcat(str(tnum++), ': log(1e127)) == 127'));
|
||||
vrfy(round(log(17^47),10) == 57.8310993048,
|
||||
strcat(str(tnum++),
|
||||
': round(log(17^47),10) == 57.8310993048'));
|
||||
vrfy(round(log(127),10) == 2.103803721,
|
||||
strcat(str(tnum++),
|
||||
': round(log(127),10) == 2.103803721'));
|
||||
epsilon(i),;
|
||||
print tnum++: ': epsilon(i),;';
|
||||
|
||||
print tnum: ': Ending extensive numeric function test';
|
||||
}
|
||||
print '037: parsed test_2600()';
|
||||
@@ -3319,11 +3403,12 @@ print '070: parsed test_redc()';
|
||||
*/
|
||||
define test_fileops()
|
||||
{
|
||||
local a, b, c, f, m, n, x, y, z;
|
||||
local a, b, c, f, m, n, p, r, x, y, z;
|
||||
local L = "Landon";
|
||||
local C = "Curt";
|
||||
local N = "Noll";
|
||||
local LCN = "Landon\nCurt\nNoll\n";
|
||||
local long = "0123456789abcdef0123456789abcdef";
|
||||
|
||||
print '4200: Beginning test_fileops';
|
||||
|
||||
@@ -3421,13 +3506,37 @@ define test_fileops()
|
||||
vrfy(y == "Noll", '4258: y == "Noll"');
|
||||
vrfy(isnull(fclose(f)), '4259: isnull(fclose(f))');
|
||||
|
||||
/*
|
||||
* fpathopen tests
|
||||
*/
|
||||
vrfy(!iserror(p=fpathopen("junk4200","r",".")),
|
||||
'4260: !iserror(p=fparhopen("junk4200","r","."))');
|
||||
vrfy(!iserror(fclose(p)), '4261: !iserror(fclose(p))');
|
||||
vrfy(!iserror(r=fpathopen("regress.cal","r")),
|
||||
'4262: !iserror(r=fparhopen("regress.cal","r","."))');
|
||||
vrfy(!iserror(fclose(r)), '4263: !iserror(fclose(r))');
|
||||
|
||||
/*
|
||||
* verify non-stack overflow on long filenames
|
||||
*/
|
||||
long = long + long + long + long;
|
||||
print '4264: long = long + long + long + long;';
|
||||
long = long + long + long + long;
|
||||
print '4265: long = long + long + long + long;';
|
||||
vrfy(strlen(long) == 512, '4266: strlen(long) == 512');
|
||||
/* bump ecnt up by 1 */
|
||||
++ecnt;
|
||||
print '4267: ++ecnt;';
|
||||
vrfy(isfile(p=fopen(long,"r")) == 0,
|
||||
'4268: isfile(p=fopen(long,"r")) == 0');
|
||||
|
||||
/*
|
||||
* cleanup
|
||||
*/
|
||||
x = rm("junk4200");
|
||||
print '4260: x = rm("junk4200")';
|
||||
print '4269: x = rm("junk4200")';
|
||||
|
||||
print '4261: Ending test_fileops';
|
||||
print '4270: Ending test_fileops';
|
||||
}
|
||||
print '071: parsed test_fileops()';
|
||||
|
||||
@@ -3862,7 +3971,7 @@ print '088: parsed test_fileop()';
|
||||
/*
|
||||
* global and static assignment tests
|
||||
*/
|
||||
global a = 10, b, c d = 20, e, f;
|
||||
global a = 10, b, c d = 20, e;
|
||||
print '089: global a = 10, b, c d = 20, e, f';
|
||||
vrfy(a == 10, '090: a == 10');
|
||||
vrfy(b == 0, '091: b == 0');
|
||||
@@ -4547,7 +4656,14 @@ define test_random()
|
||||
vrfy(seed() < 2^64, '5465: seed() < 2^64');
|
||||
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()';
|
||||
|
||||
@@ -4555,13 +4671,11 @@ print '137: parsed test_random()';
|
||||
/*
|
||||
* test_newsyn - test new command completion syntax and scope rules
|
||||
*/
|
||||
for (s5500 = 0, i = 0; i < 5; i++)
|
||||
s5500 += i;
|
||||
for (s5500 = 0, i = 0; i < 5; i++) s5500 += i;
|
||||
print "138: for (s5500 = 0, i = 0; i < 5; i++) s5500 += i;";
|
||||
vrfy(s5500 == 10, '139: s5500 == 10');
|
||||
vrfy(i == 5, '140: i == 5');
|
||||
for (s5500 = 0, i = 0; i < 9; i++)
|
||||
{
|
||||
for (s5500 = 0, i = 0; i < 9; i++) {
|
||||
s5500 += i;
|
||||
}
|
||||
print "141: for (s5500 = 0, i = 0; i < 9; i++) { s5500 += i; }";
|
||||
@@ -4609,7 +4723,6 @@ define test_newsyn()
|
||||
vrfy(i == 3, '5509: i == 3');
|
||||
/**/
|
||||
{
|
||||
local i;
|
||||
for (s5500 = 0, i = 0; i < 11; i++)
|
||||
s5500 += i;
|
||||
vrfy(s5500 == 55, '5510: s5500 == 45');
|
||||
@@ -5021,8 +5134,6 @@ print '156: parsed test_size()';
|
||||
/*
|
||||
* test_assign - test assignment of constants and variables
|
||||
*/
|
||||
global A, B; /* A, B for "constants" */
|
||||
print '157: global A, B';
|
||||
global X5800, Y5800; /* X5800, Y5800 for "variables" */
|
||||
print '158: global X5800, Y5800';
|
||||
obj xy5800 {x, y};
|
||||
@@ -5044,7 +5155,7 @@ define test_assign(base, work)
|
||||
Y5800 = base+4;
|
||||
print base+4: ': Y5800 = base+4';
|
||||
obj xy5800 A={1,2}, obj xy5800 B={3,4};
|
||||
print base+5: ': obj xy5800 A={1,2}, obj xy5000 B={3,4}';
|
||||
print base+5: ': obj xy5800 A={1,2}, obj xy5800 B={3,4}';
|
||||
|
||||
/*
|
||||
* test assignment
|
||||
@@ -5109,6 +5220,11 @@ define test_is()
|
||||
local square; /* square of an odd prime */
|
||||
local string; /* string */
|
||||
local com; /* complex value */
|
||||
local rndint; /* a random integer */
|
||||
local rndexp; /* a random exponent */
|
||||
local rndval; /* rndint ^ rndexp */
|
||||
local i; /* integer value */
|
||||
local ok; /* 1 ==> issq() tests were OK, 0 ==> failure */
|
||||
|
||||
print '5900: Beginning test_is';
|
||||
|
||||
@@ -5167,7 +5283,7 @@ define test_is()
|
||||
prime = 3217;
|
||||
print '5922: prime = 3217';
|
||||
square = prime^2;
|
||||
print '5923: square = prine^2';
|
||||
print '5923: square = prime^2';
|
||||
string = "a string";
|
||||
print '5924: string = "a string"';
|
||||
com = 3+4i;
|
||||
@@ -6046,15 +6162,75 @@ define test_is()
|
||||
vrfy(istype(matrix,odd) == 0, '6661: istype(matrix,odd) == 0');
|
||||
vrfy(istype(a,odd) == 0, '6662: istype(a,odd) == 0');
|
||||
|
||||
/*
|
||||
* perform more extensive issq() testing
|
||||
*/
|
||||
ok = 1;
|
||||
for (i=0; i < 256; ++i) {
|
||||
/* rndval will be a square - even powers>0 of x>1 */
|
||||
rndexp = random(1, 16) * 2;
|
||||
rndint = random(2, 4294967296);
|
||||
if (issq(rndint)) {
|
||||
++rndint;
|
||||
}
|
||||
rndval = rndint ^ rndexp;
|
||||
if (issq(rndval) == 0) {
|
||||
prob(strprintf("issq(%d^%d) returned 0",
|
||||
rndint, rndexp));
|
||||
ok = 0;
|
||||
}
|
||||
}
|
||||
if (ok) {
|
||||
print '6663: issq() on 256 squares';
|
||||
} else {
|
||||
print '****: failure(s): 6663: faiissq() on 256 squares';
|
||||
}
|
||||
for (i=0; i < 256; ++i) {
|
||||
/* rndval will not be a square - 1 + even powers>0 of x>1 */
|
||||
rndexp = random(1, 16) * 2;
|
||||
rndint = random(2, 4294967296);
|
||||
rndval = rndint ^ rndexp;
|
||||
if (issq(rndval+1) != 0) {
|
||||
prob(strprintf("issq(%d^%d)+1 returned non-zero",
|
||||
rndint, rndexp));
|
||||
ok = 0;
|
||||
}
|
||||
}
|
||||
if (ok) {
|
||||
print '6664: issq() on 256 squares+1';
|
||||
} else {
|
||||
print '****: failure(s): 6664: issq() on 256 squares+1';
|
||||
}
|
||||
print '6664: issq() on 256 squares+1';
|
||||
for (i=0; i < 256; ++i) {
|
||||
/* rndval will not be a square - odd powers>0 of x>1 */
|
||||
rndexp = (random(1, 16) * 2) + 1;
|
||||
rndint = random(2, 4294967296);
|
||||
if (issq(rndint)) {
|
||||
++rndint;
|
||||
}
|
||||
rndval = rndint ^ rndexp;
|
||||
if (issq(rndval) != 0) {
|
||||
prob(strprintf("issq(%d^%d) returned non-zero",
|
||||
rndint, rndexp));
|
||||
ok = 0;
|
||||
}
|
||||
}
|
||||
if (ok) {
|
||||
print '6665: issq() on 256 non-squares';
|
||||
} else {
|
||||
print '****: failure(s): 6665: issq() on 256 non-squares';
|
||||
}
|
||||
|
||||
/*
|
||||
* cleanup
|
||||
*/
|
||||
blkfree("blk5900");
|
||||
print '6663: blkfree("blk5900")';
|
||||
print '6666: blkfree("blk5900")';
|
||||
fclose(ofd);
|
||||
print '6664: fclose(ofd)';
|
||||
print '6667: fclose(ofd)';
|
||||
|
||||
print '6665: Ending test_is';
|
||||
print '6668: Ending test_is';
|
||||
}
|
||||
print '168: test_is()';
|
||||
|
||||
@@ -6166,7 +6342,7 @@ define test_blk()
|
||||
/* A second named block */
|
||||
|
||||
B1 = blk("+++6700", 15, 10) = {1,2,3,4,5};
|
||||
print '6746: B1 = blk("+++6700", , 10);';
|
||||
print '6746: B1 = blk("+++6700", 15 , 10) = {1,2,3,4,5};';
|
||||
vrfy(size(B1) == 15, '6747: size(B1) == 15');
|
||||
vrfy(sizeof(B1) == 20, '6748: sizeof(B1) == 20');
|
||||
vrfy(test(B1) == 1, '6749: test(B1) == 1');
|
||||
@@ -6561,10 +6737,10 @@ define test_sha()
|
||||
0x21e42319a26787046c2b28b7ae70f1b54bf0ba2a,
|
||||
'7122: sha(sha("this is", 7^19-8, ..., "hash")) == 0x21e4...');
|
||||
|
||||
z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi());
|
||||
print '7123: z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi());';
|
||||
vrfy(sha(z) == 0x36dcca3e51865c30a2cf738023cda446f1368340,
|
||||
'7124: sha(z) == 0x36dcca3e51865c30a2cf738023cda446f1368340');
|
||||
z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));
|
||||
print '7123: z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));';
|
||||
vrfy(sha(z) == 257075527903934749824451356785709876382198951165,
|
||||
'7124: sha(z) == 257075527903934749824451356785709876382198951165');
|
||||
|
||||
y = sha();
|
||||
print '7125: y = sha()';
|
||||
@@ -6572,8 +6748,8 @@ define test_sha()
|
||||
print '7126: y = sha(y, list(1,2,3), "curds and whey")';
|
||||
y = sha(y, 2^21701-1);
|
||||
print '7127: y = sha(y, 2^21701-1)';
|
||||
y = sha(y, pi());
|
||||
print '7128: y = sha(y, pi())';
|
||||
y = sha(y, pi(1e-100));
|
||||
print '7128: y = sha(y, pi(1e-100))';
|
||||
vrfy(y == z, '7129: y == z');
|
||||
|
||||
B = blk() = {"a", "b", "c"};
|
||||
@@ -6632,10 +6808,10 @@ define test_sha1()
|
||||
'7209: sha1(sha1("this is",7^19-8,"a composit",3i+4.5,"hash")) == ...');
|
||||
|
||||
|
||||
z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi());
|
||||
print '7210: z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi());';
|
||||
vrfy(sha1(z) == 0xc19e7317675dbf71e293b4c41e117169e9da5b6f,
|
||||
'7211: sha1(z) == 0xc19e7317675dbf71e293b4c41e117169e9da5b6f');
|
||||
z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));
|
||||
print '7210: z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));';
|
||||
vrfy(sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83,
|
||||
'7211: sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83');
|
||||
|
||||
y = sha1();
|
||||
print '7212: y = sha1();';
|
||||
@@ -6643,8 +6819,8 @@ define test_sha1()
|
||||
print '7213: y = sha1(y, list(1,2,3), "curds and whey");';
|
||||
y = sha1(y, 2^21701-1);
|
||||
print '7214: y = sha1(y, 2^21701-1);';
|
||||
y = sha1(y, pi());
|
||||
print '7215: y = sha1(y, pi());';
|
||||
y = sha1(y, pi(1e-100));
|
||||
print '7215: y = sha1(y, pi(1e-100));';
|
||||
vrfy(y == z, '7216: y == z');
|
||||
|
||||
vrfy(sha1(sha1("a"))==0x86f7e437faa5a7fce15d1ddcb9eaeaea377667b8,
|
||||
@@ -6720,18 +6896,18 @@ define test_md5()
|
||||
'7310: md5(md5("this is", 7^19-8, "a composit", 3i+4.5, "hash")) == ...');
|
||||
|
||||
|
||||
z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi());
|
||||
print '7311: z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi());';
|
||||
vrfy(md5(z) == 0x63d2b2fccae2de265227c30b05abb6b5,
|
||||
'7312: md5(z) == 0x63d2b2fccae2de265227c30b05abb6b5');
|
||||
z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));
|
||||
print '7311: z = md5(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));';
|
||||
vrfy(md5(z) == 0x487462e577eabef0302dd13af6632546,
|
||||
'7312: md5(z) == 0x487462e577eabef0302dd13af6632546');
|
||||
y = md5();
|
||||
print '7313: y = md5();';
|
||||
y = md5(y, list(1,2,3), "curds and whey");
|
||||
print '7314: y = md5(y, list(1,2,3), "curds and whey")';
|
||||
y = md5(y, 2^21701-1);
|
||||
print '7315: y = md5(y, 2^21701-1);';
|
||||
y = md5(y, pi());
|
||||
print '7316: y = md5(y, pi());';
|
||||
y = md5(y, pi(1e-100));
|
||||
print '7316: y = md5(y, pi(1e-100));';
|
||||
vrfy(y == z, '7317: y == z');
|
||||
|
||||
vrfy(md5(md5("a")) == 0x0cc175b9c0f1b6a831c399e269772661,
|
||||
@@ -7268,7 +7444,7 @@ define test_somenew()
|
||||
vrfy(size(char(0)) == 1, '8203: size(char(0)) == 1');
|
||||
vrfy(strlen(char(0)) == 0, '8204: strlen(char(0)) == 0');
|
||||
vrfy(char(0) != "", '8205: char(0) != ""');
|
||||
vrfy(strcmp(char(0),"") == 0, '8206: strcmp(char(0),"") == 0');
|
||||
vrfy(str(char(0)) == "", '8206: str(char(0)) == ""');
|
||||
|
||||
vrfy(str("abc") == "abc", '8207: str("abc") == "abc"');
|
||||
|
||||
@@ -7625,18 +7801,54 @@ print '8406: Ending test_quit';
|
||||
* test_divmod - psuedo-random tests on the // and % with various rounding modes
|
||||
*/
|
||||
print;
|
||||
print '8500: Starting test_divmod'
|
||||
print '8500: Starting test of divmod'
|
||||
read -once "test8500";
|
||||
/* 85xx: Ending test_divmod is printed by test8500.cal */
|
||||
/* 85xx: Ending test of divmod is printed by test8500.cal */
|
||||
|
||||
|
||||
/*
|
||||
* test_maxargs - test up to 1024 args being passed to a builtin function
|
||||
*/
|
||||
print;
|
||||
print '8600: Starting test_1024args'
|
||||
print '8600: Starting test of up to 1024 args'
|
||||
read -once "test8600";
|
||||
/* 86xx: Ending test_1024args is printed by test8600.cal */
|
||||
/* 860x: Ending test of up to 1024 args is printed by test8600.cal */
|
||||
|
||||
|
||||
/*
|
||||
* dupvar_warn and redecl_warn testing
|
||||
*/
|
||||
print;
|
||||
print '8650: Starting test of dupvar_warn and redecl_warn config parameters';
|
||||
vrfy(config("redecl_warn",0), '8651: config("redecl_warn",0)');
|
||||
vrfy(config("dupvar_warn",0), '8652: config("dupvar_warn",0)');
|
||||
vrfy(u_glob == 6, '8653: u_glob == 6');
|
||||
global u_glob = 555;
|
||||
print '8654: reclare u_glob';
|
||||
vrfy(u_glob == 555, '8655: u_glob == 555');
|
||||
define func_8650(u_glob) { local u_glob; return u_glob; }
|
||||
print '8656: u_glob as both local and parameter';
|
||||
define func_8650a(u_glob) { static u_glob; return u_glob; }
|
||||
print '8657: u_glob as both static and parameter';
|
||||
vrfy(config("redecl_warn",1)==0, '8658: config("redecl_warn",1)==0');
|
||||
vrfy(config("dupvar_warn",1)==0, '8659: config("dupvar_warn",1)==0');
|
||||
/* 865x: Ending test of up to 1024 args is printed by test8600.cal */
|
||||
|
||||
|
||||
/*
|
||||
* dotest scripts
|
||||
*
|
||||
* We use the dotest driver to evaluate test-97xx data files.
|
||||
*/
|
||||
print;
|
||||
print '8700: Starting dotest runs'
|
||||
print '8701: read -once "dotest"';
|
||||
read -once "dotest";
|
||||
print '8702: read -once "set8700"';
|
||||
read -once "set8700";
|
||||
vrfy(dotest("set8700.line", 8703) == 0,
|
||||
'8703: dotest("set8700.line", 8703) == 0');
|
||||
/* 87xx: Ending dotest runs is printed by set8700.test */
|
||||
|
||||
|
||||
/*
|
||||
@@ -7716,7 +7928,26 @@ read -once varargs;
|
||||
print '9827: read -once varargs';
|
||||
read -once qtime;
|
||||
print '9828: read -once qtime';
|
||||
print '9829: Ending read of selected calc resource files';
|
||||
read -once chi;
|
||||
print '9829: read -once chi';
|
||||
read -once intfile;
|
||||
print '9830: read -once intfile';
|
||||
read -once lucas;
|
||||
print '9831: read -once lucas';
|
||||
read -once lucas_tbl;
|
||||
print '9832: read -once lucas_tbl';
|
||||
read -once natnumset;
|
||||
print '9833: read -once natnumset';
|
||||
read -once repeat;
|
||||
print '9834: read -once repeat';
|
||||
read -once screen;
|
||||
print '9835: read -once screen';
|
||||
read -once linear;
|
||||
print '9836: read -once linear';
|
||||
print '9837: skipping read -once beer.cal because it is an infinite loop';
|
||||
print '9838: skipping read -once hello.cal because it is an infinite loop';
|
||||
print '9839: skipping read -once xx_print.cal because it is a printing demo';
|
||||
print '9840: Ending read of selected calc resource files';
|
||||
|
||||
|
||||
/*
|
||||
|
53
cal/repeat.cal
Normal file
53
cal/repeat.cal
Normal 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);
|
||||
}
|
61
cal/screen.cal
Normal file
61
cal/screen.cal
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* screen - ANSI control sequences
|
||||
*
|
||||
* This file was created by Ernest Bowen <ebowen at une dot edu dot au>.
|
||||
*
|
||||
* This code has been placed in the public domain. Please do not
|
||||
* copyright this code.
|
||||
*
|
||||
* ERNEST BOWEN DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MER-
|
||||
* CHANTABILITY AND FITNESS. IN NO EVENT SHALL LANDON CURT
|
||||
* NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: screen.cal,v 29.2 2006/05/01 19:21:18 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/screen.cal,v $
|
||||
*
|
||||
* This file is not covered under version 2.1 of the GNU LGPL.
|
||||
*
|
||||
* Under source code control: 2006/03/08 05:54:09
|
||||
* File existed as early as: 2006
|
||||
*/
|
||||
|
||||
up = CUU ="\e[A";
|
||||
down = CUD = "\e[B}";
|
||||
forward = CUF = "\e[C";
|
||||
back = CUB = "\e[D";
|
||||
save = SCP = "\e[s";
|
||||
restore = RCP = "\e[u";
|
||||
cls = "\e[2J";
|
||||
home = "\e[F";
|
||||
eraseline = "\e[K";
|
||||
off = "\e[0m";
|
||||
bold = "\e[1m";
|
||||
faint = "\e[2m";
|
||||
italic = "\e[3m";
|
||||
blink = "\e[5m";
|
||||
rapidblink = "\e[6m";
|
||||
reverse = "\e[7m";
|
||||
concealed = "\e[8m";
|
||||
/* Lowercase indicates foreground, uppercase background" */
|
||||
black = "\e[30m";
|
||||
red = "\e[31m";
|
||||
green = "\e[32m";
|
||||
yellow = "\e[33m";
|
||||
blue = "\e[34m";
|
||||
magenta = "\e[35m";
|
||||
cyan = "\e[36m";
|
||||
white = "\e[37m";
|
||||
Black = "\e[40m";
|
||||
Red = "\e[41m";
|
||||
Green = "\e[42m";
|
||||
Yellow = "\e[43m";
|
||||
Blue = "\e[44m";
|
||||
Magenta = "\e[45m";
|
||||
Cyan = "\e[46m";
|
||||
White = "\e[47m";
|
72
cal/set8700.cal
Normal file
72
cal/set8700.cal
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* set8700 - environment for dotest line tests for the 8700 set of regress.cal
|
||||
*
|
||||
* Copyright (C) 2006 Ernest Bowen and Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* Calc is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
|
||||
* Public License for more details.
|
||||
*
|
||||
* A copy of version 2.1 of the GNU Lesser General Public License is
|
||||
* distributed with calc under the filename COPYING-LGPL. You should have
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.1 $
|
||||
* @(#) $Id: set8700.cal,v 29.1 2006/05/20 19:35:33 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/set8700.cal,v $
|
||||
*
|
||||
* Under source code control: 2006/05/20 14:10:11
|
||||
* File existed as early as: 2006
|
||||
*
|
||||
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
|
||||
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* setup global variables for dotest() to use with set8700.set
|
||||
*/
|
||||
|
||||
global set8700_A;
|
||||
global set8700_B;
|
||||
global set8700_M;
|
||||
global set8700_M1;
|
||||
global set8700_M2;
|
||||
global set8700_L;
|
||||
global set8700_L1;
|
||||
global set8700_L2;
|
||||
global set8700_O;
|
||||
global set8700_P;
|
||||
global set8700_P1;
|
||||
global set8700_P2;
|
||||
global set8700_Q;
|
||||
global set8700_R;
|
||||
global set8700_S;
|
||||
global set8700_X;
|
||||
global set8700_Y;
|
||||
global set8700_x;
|
||||
global set8700_y;
|
||||
|
||||
define set8700_getA1() = set8700_A;
|
||||
|
||||
define set8700_getA2() { return set8700_A; }
|
||||
|
||||
define set8700_getvar() {local a = 42; protect(a,256); return a;}
|
||||
|
||||
define set8700_f(set8700_x) = set8700_x^2;
|
||||
|
||||
define set8700_g(set8700_x)
|
||||
{
|
||||
if (isodd(set8700_x)) protect(set8700_x, 256);
|
||||
return set8700_x;
|
||||
}
|
||||
|
||||
obj set8700_point {
|
||||
set8700_x, set8700_y, set8700_z
|
||||
}
|
404
cal/set8700.line
Normal file
404
cal/set8700.line
Normal file
@@ -0,0 +1,404 @@
|
||||
##
|
||||
## set8700 - dotest line tests for the 8700 set of regress.cal
|
||||
##
|
||||
## Copyright (C) 2006 Ernest Bowen and Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
## as published by the Free Software Foundation.
|
||||
##
|
||||
## Calc is distributed in the hope that it will be useful, but WITHOUT
|
||||
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
|
||||
## Public License for more details.
|
||||
##
|
||||
## A copy of version 2.1 of the GNU Lesser General Public License is
|
||||
## distributed with calc under the filename COPYING-LGPL. You should have
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: set8700.line,v 29.2 2006/06/20 09:29:16 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/set8700.line,v $
|
||||
##
|
||||
## Under source code control: 2006/05/20 14:10:11
|
||||
## File existed as early as: 2006
|
||||
##
|
||||
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
|
||||
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
|
||||
|
||||
|
||||
strcpy("", "") == ""
|
||||
strcpy("", "xyz") == ""
|
||||
strcpy("a", "xyz") == "x"
|
||||
strcpy("ab", "xyz") == "xy"
|
||||
strcpy("abc", "xyz") == "xyz"
|
||||
strcpy("abcd", "xyz") == "xyz\0" ## Result will print as "xyz"
|
||||
strcpy("abcde", "xyz") == "xyz\0e"
|
||||
strcpy("abcdef", "xyz") == "xyz\0ef"
|
||||
strcpy("abcdef", "x\0z") == "x\0z\0ef" ## Note z is copied
|
||||
strcpy("abc", "") == "\0bc"
|
||||
|
||||
strncpy("abcdef", "xyz", 0) == "abcdef" ## No characters copied
|
||||
strncpy("abcdef", "xyz", 1) == "xbcdef" ## One character copied, no '\0'
|
||||
strncpy("abcdef", "xyz", 2) == "xycdef"
|
||||
strncpy("abcdef", "xyz", 3) == "xyzdef"
|
||||
strncpy("abcdef", "xyz", 4) == "xyz\0ef"
|
||||
strncpy("abcdef", "xyz", 5) == "xyz\0\0f" ## Two nulls as in C
|
||||
strncpy("abcdef", "xyz", 6) == "xyz\0\0\0"
|
||||
strncpy("abcdef", "xyz", 7) == "xyz\0\0\0" ## Size of first string unchanged
|
||||
strncpy("a\0cdef", "\0yz", 4) == "\0yz\0ef"
|
||||
strncpy("ab", "xyz", 3) == "xy"
|
||||
|
||||
strcmp("", "") == 0
|
||||
strcmp("", "a") == -1
|
||||
strcmp("\n", "\n") == 0
|
||||
strcmp("\0", "") == 1 ## '\0' treated like other characters
|
||||
strcmp("ab", "") == 1
|
||||
strcmp("ab", "a") == 1
|
||||
strcmp("ab", "ab") == 0
|
||||
strcmp("ab", "abc") == -1
|
||||
strcmp("abc", "abb") == 1
|
||||
strcmp("abc", "abc") == 0
|
||||
strcmp("abc", "abd") == -1
|
||||
strcmp("abc\0", "abc") == 1
|
||||
|
||||
strncmp("abc", "xyz", 0) == 0
|
||||
strncmp("abc", "xyz", 1) == -1
|
||||
strncmp("abc", "", 1) == 1
|
||||
strncmp("abc", "a", 1) == 0
|
||||
strncmp("", "", 2) == 0
|
||||
strncmp("a", "a", 2) == 0
|
||||
strncmp("a", "b", 2) == -1
|
||||
strncmp("ab", "ab", 2) == 0
|
||||
strncmp("ab", "ac", 2) == -1
|
||||
strncmp("\0ac", "\0b", 2) == -1
|
||||
strncmp("ab", "abc", 2) == 0
|
||||
strncmp("abc", "abd", 2) == 0
|
||||
strncmp("a", "a\0", 2) == -1
|
||||
strncmp("a", "a", 3) == 0
|
||||
strncmp("abc", "abd", 3) == -1
|
||||
strncmp("\0\0\n", "\0\0\t", 3) == 1
|
||||
|
||||
str("abc") == "abc"
|
||||
str("ab\0") == "ab"
|
||||
str("a\0c") == "a"
|
||||
str("\0bc") == ""
|
||||
|
||||
size("") == 0
|
||||
size("a") == 1
|
||||
size("\0") == 1
|
||||
size("a\0") == 2
|
||||
size("a\0b") == 3
|
||||
|
||||
strlen("\0") == 0
|
||||
strlen("a\0") == 1
|
||||
strlen("a\0b") == 1
|
||||
|
||||
0 * "abc" == ""
|
||||
1 * "abc" == "abc"
|
||||
2 * "abc" == "abcabc"
|
||||
3 * "abc" == "abcabcabc"
|
||||
1 * "" == ""
|
||||
-1 * "abc" == "cba"
|
||||
-2 * "abc" == "cbacba"
|
||||
"abc" + "xyz" == "abcxyz"
|
||||
"abc" - "xyz" == "abczyx"
|
||||
|
||||
|
||||
substr("abcd",0,0) == ""
|
||||
substr("abcd",0,1) == "a"
|
||||
substr("abcd",0,2) == "ab"
|
||||
substr("abcd",1,0) == ""
|
||||
substr("abcd",1,1) == "a"
|
||||
substr("abcd",1,2) == "ab"
|
||||
substr("abcd",2,0) == ""
|
||||
substr("abcd",2,1) == "b"
|
||||
substr("abcd",2,2) == "bc";
|
||||
substr("abcd",2,3) == "bcd";
|
||||
substr("abcd",2,4) == "bcd";
|
||||
substr("abcd",2,5) == "bcd"; ## substr stops at end of string
|
||||
substr("abcd",4,0) == ""
|
||||
substr("abcd",4,1) == "d"
|
||||
substr("abcd",4,2) == "d"
|
||||
substr("abcd",4,3) == "d"
|
||||
substr("abcd",5,0) == ""
|
||||
substr("abcd",5,1) == ""
|
||||
substr("a\0c\0",2,2) == "\0c" ## '\0' treated like other characters
|
||||
substr("a\0c\0",2,3) == "\0c\0"
|
||||
|
||||
#"" == 0 ## # operator counts number of bits
|
||||
#"\0" == 0
|
||||
# "a" == 3
|
||||
# "ab" == 6 ## white space ignored
|
||||
# "abc" == 10
|
||||
# 27 == 4
|
||||
# 0b1010111011 == 7
|
||||
|
||||
7 # 9 == 2 ## 7 # 9 = abs(7 - 9)
|
||||
3/4 # 2/3 == 1/12
|
||||
|
||||
a = 5, a #= 2, a == 3
|
||||
a #= 4, a == 1
|
||||
|
||||
## Binary # operator not defined for strings
|
||||
|
||||
protect(set8700_A) == 0
|
||||
## Testing with one lvalue
|
||||
isnull(protect(set8700_A,65))
|
||||
protect(set8700_A) == 65
|
||||
isnull(protect(set8700_A, -1))
|
||||
protect(set8700_A) == 64
|
||||
protect(set8700_A,-2), protect(set8700_A) == 64
|
||||
protect(set8700_A,5), protect(set8700_A) == 69
|
||||
protect(set8700_A,-4), protect(set8700_A) == 65
|
||||
protect(set8700_A,0), protect(set8700_A) == 0
|
||||
protect(set8700_A,1234), protect(set8700_A) == 1234
|
||||
protect(set8700_A,-1234), protect(set8700_A) == 0
|
||||
protect(set8700_A,65535), protect(set8700_A) == 65535
|
||||
protect(set8700_A,-65535), protect(set8700_A) == 0
|
||||
|
||||
## Simple assignments
|
||||
set8700_A = 42, protect(set8700_A,1024), set8700_B = set8700_A, protect(set8700_B) == 1024
|
||||
set8700_A = 6 * 7, protect(set8700_A) == 1024
|
||||
set8700_A == set8700_B
|
||||
|
||||
## Testing matrix protectioon
|
||||
set8700_A = mat [3] = {1, 2, list(3,4)}; 1
|
||||
protect(set8700_A, 65, 1), protect(set8700_A) == 1089
|
||||
protect(set8700_A[0]) == 65
|
||||
protect(set8700_A[2]) == 65
|
||||
protect(set8700_A[2][1]) == 0
|
||||
protect(set8700_A, 65, 2), protect(set8700_A[2][1]) == 65
|
||||
protect(set8700_A,-1024), protect(set8700_A) == 65
|
||||
protect(set8700_A, -1, 1), protect(set8700_A) == 64
|
||||
protect(set8700_A[1]) == 64
|
||||
protect(set8700_A[2]) == 64
|
||||
protect(set8700_A[2][0]) == 65
|
||||
protect(set8700_A,0), protect(set8700_A) == 0
|
||||
protect(set8700_A[1]) == 64
|
||||
protect(set8700_A, 0, 2), protect(set8700_A) == 0
|
||||
protect(set8700_A[1]) == 0
|
||||
protect(set8700_A[2][1]) == 0
|
||||
protect(set8700_A,1024, 2), protect(set8700_A) == 1024
|
||||
protect(set8700_A[2]) == 1024
|
||||
protect(set8700_A[2][0], 512), protect(set8700_A[2][0]) == 1536
|
||||
|
||||
## Testing simple assignment of matrix
|
||||
set8700_B = set8700_A, protect(set8700_B) == 1024 ## protect(set8700_A) copied
|
||||
protect(set8700_B[2]) == 1024 ## protect(set8700_A[2]) copied
|
||||
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
|
||||
|
||||
## copying matrix to list
|
||||
set8700_B = list(5,6,7), protect(set8700_B) == 1024
|
||||
protect(set8700_B[0]) == 0
|
||||
protect(set8700_B[2]) == 0
|
||||
protect(set8700_A,0), protect(set8700_A) == 0
|
||||
copy(set8700_A,set8700_B), set8700_B[0] == 1 && set8700_B[1] == 2
|
||||
set8700_B[2] == list(3,4)
|
||||
protect(set8700_B) == 1024 ## protect(set8700_A) not copied
|
||||
protect(set8700_B[0]) == 1024 ## protect(set8700_A[0]) copied
|
||||
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
|
||||
|
||||
## copying matrix to matrix
|
||||
set8700_B = mat[3], protect(set8700_B) == 1024
|
||||
protect(set8700_B[2]) == 0
|
||||
copy(set8700_A,set8700_B), set8700_B[0] == 1 && set8700_B[1] == 2
|
||||
set8700_B[2] == list(3,4)
|
||||
protect(set8700_B) == 1024 ## protect(set8700_A) not copied
|
||||
protect(set8700_B[0]) == 1024 ## protect(set8700_A[0]) copied
|
||||
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
|
||||
|
||||
## Testing list protection
|
||||
set8700_A = list(1, 2, list(3,4)), 1
|
||||
protect(set8700_A,1024, 2), protect(set8700_A) == 1024
|
||||
protect(set8700_A[2]) == 1024
|
||||
protect(set8700_A[2][0], 512), protect(set8700_A[2][0]) == 1536
|
||||
|
||||
## Simple assignment of list
|
||||
set8700_B = set8700_A, protect(set8700_B) == 1024 ## protect(set8700_A) copied
|
||||
protect(set8700_B[2]) == 1024 ## protect(set8700_A[2]) copied
|
||||
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
|
||||
|
||||
## Copying list to list
|
||||
set8700_B = list(5,6,7), protect(set8700_B) == 1024
|
||||
protect(set8700_B[2]) == 0
|
||||
copy(set8700_A,set8700_B), set8700_B[0] == 1 && set8700_B[1] == 2
|
||||
set8700_B[2] == list(3,4)
|
||||
protect(set8700_B) == 1024 ## protect(set8700_A) not copied
|
||||
protect(set8700_B[0]) == 1024 ## protect(set8700_A[0]) copied
|
||||
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
|
||||
|
||||
## Copying list to matrix
|
||||
set8700_B = mat[3], protect(set8700_B) == 1024
|
||||
protect(set8700_B[2]) == 0
|
||||
copy(set8700_A,set8700_B), set8700_B[0] == 1 && set8700_B[1] == 2
|
||||
set8700_B[2] == list(3,4)
|
||||
protect(set8700_B) == 1024
|
||||
protect(set8700_B[0]) == 1024 ## protect(set8700_A[0]) copied
|
||||
protect(set8700_B[2][0]) == 1536 ## protect(set8700_A[2][0]) copied
|
||||
|
||||
## Protecting one element of a list
|
||||
set8700_A = list(1,4,3,2), protect(set8700_A[1]) == 0
|
||||
protect(set8700_A[1], 1024), protect(set8700_A[1]) == 1024
|
||||
|
||||
## Testing sort
|
||||
set8700_A = sort(set8700_A), set8700_A == list(1,2,3,4)
|
||||
protect(set8700_A[1]) == 0
|
||||
protect(set8700_A[3]) == 1024 ## status of 4
|
||||
|
||||
## Testings reverse
|
||||
set8700_A = reverse(set8700_A), set8700_A == list(4,3,2,1)
|
||||
protect(set8700_A[0]) == 1024 ## status of 4
|
||||
|
||||
## Testing swap
|
||||
swap(set8700_A[0], set8700_A[1]), set8700_A == list(3,4,2,1)
|
||||
protect(set8700_A[0]) == 0 ## status moved
|
||||
protect(set8700_A[1]) == 1024 ## 4 retains protection
|
||||
|
||||
## Testing list with protected list argument
|
||||
protect(set8700_A, 0), protect(set8700_A) == 0
|
||||
protect(set8700_A, 512), protect(set8700_A) == 512
|
||||
protect(set8700_A[1]) == 1024
|
||||
set8700_L = list(1,set8700_A,3), protect(set8700_L) == 0
|
||||
protect(set8700_L[0]) == 0
|
||||
protect(set8700_L[1]) == 512 ## protect(set8700_A) copied
|
||||
protect(set8700_L[1][1]) == 1024 ## protect(set8700_A[1]) copied
|
||||
|
||||
## Testing list with "intialization"
|
||||
set8700_L = list(1,2,3), protect(set8700_L) == 0
|
||||
protect(set8700_L[0]) | protect(set8700_L[1]) | protect(set8700_L[2]) == 0 ## All zero
|
||||
set8700_L = {1,set8700_A}, set8700_L[1] == set8700_A
|
||||
protect(set8700_L[1]) == 512 ## protect(set8700_A) copied
|
||||
protect(set8700_L[1][1]) == 1024 ## protect(set8700_A[1]) copied
|
||||
set8700_L[1] = 2, protect(set8700_L[1]) == 512 ## Not changed
|
||||
|
||||
## Testing matrix with "initialization"
|
||||
set8700_M = mat[3] = {1,set8700_A}, protect(set8700_M) == 0
|
||||
protect(set8700_M[0]) == 0
|
||||
protect(set8700_M[1]) == 512 ## protect(set8700_A) copied
|
||||
protect(set8700_M[2]) == 0
|
||||
protect(set8700_M[1][1]) == 1024 ## protect(set8700_A[1]) copied
|
||||
|
||||
## Testing push, pop, append, remove
|
||||
set8700_A = list(1,2), protect(set8700_A,0,1), protect(set8700_A[0]) == 0
|
||||
protect(set8700_A[0], 256), protect(set8700_A[0]) == 256
|
||||
protect(set8700_A[1]) == 0
|
||||
append(set8700_A, pop(set8700_A)), protect(set8700_A[0]) == 0
|
||||
protect(set8700_A[1]) == 256
|
||||
push(set8700_A, remove(set8700_A)), protect(set8700_A[0]) == 256
|
||||
protect(set8700_A[1]) == 0
|
||||
|
||||
## Testing operation-assignments
|
||||
set8700_A = 5, protect(set8700_A,1024), protect(set8700_A) == 1024
|
||||
protect(set8700_A, 1024), set8700_A = 7, protect(set8700_A) == 1024
|
||||
protect(set8700_A,1024), set8700_A += 2, protect(set8700_A) == 1024
|
||||
protect(set8700_A,1024), set8700_A *= 2, protect(set8700_A) == 1024
|
||||
protect(set8700_A,1024), set8700_A |= 2, protect(set8700_A) == 1024
|
||||
protect(set8700_A,1024), set8700_A &= 2, protect(set8700_A) == 1024
|
||||
protect(set8700_A,1024), set8700_A ^= 2, protect(set8700_A) == 1024
|
||||
|
||||
protect(set8700_B,0), set8700_B = set8700_getA1(), protect(set8700_B) == 1024
|
||||
protect(set8700_B,0), set8700_B = set8700_getA2(), protect(set8700_B) == 1024
|
||||
set8700_B = set8700_getvar(), protect(set8700_B) == 1024 + 256
|
||||
|
||||
set8700_x = 7, protect(set8700_x) == 0
|
||||
protect(7,2) == error(10234)
|
||||
protect(set8700_x,2.5) == error(10235)
|
||||
protect(set8700_x,"abc") == error(10235)
|
||||
protect(set8700_x, 1e6) == error(10235)
|
||||
protect(set8700_x,1), (set8700_x = 2) == error(10366)
|
||||
(set8700_x = 3 + 4) == error(10366)
|
||||
|
||||
protect(set8700_x,2), protect(set8700_x) == 3
|
||||
protect(set8700_x,-1), protect(set8700_x) == 2
|
||||
(set8700_x = 2) == error(10368)
|
||||
(set8700_x = 3 + 4) == 7
|
||||
protect(set8700_x,2), ++set8700_x == error(10379)
|
||||
set8700_x == 7
|
||||
--set8700_x == error(10382)
|
||||
set8700_x == 7
|
||||
set8700_x++ == error(10385)
|
||||
set8700_x == 7
|
||||
set8700_x-- == error(10388)
|
||||
|
||||
protect(set8700_A,0), protect(set8700_A,16), 1
|
||||
set8700_A = "abcdef", protect(set8700_A) == 16 ## No copy to set8700_A
|
||||
protect(set8700_B,0), set8700_B = "xyz", protect(set8700_B) == 0
|
||||
copy(set8700_B, set8700_A) == error(10226)
|
||||
set8700_A == "abcdef" ## set8700_A not changed
|
||||
protect(set8700_A,0), copy(set8700_B,set8700_A), set8700_A == "xyzdef"
|
||||
protect(set8700_B,128), protect(set8700_B) == 128 ## No copy from set8700_B
|
||||
copy(set8700_B,set8700_A,,,3) == error(10225)
|
||||
set8700_A == "xyzdef"
|
||||
protect(set8700_B,0), copy(set8700_B,set8700_A,,,3), set8700_A == "xyzxyz"
|
||||
|
||||
set8700_A = "abcdef", protect(set8700_A, 16), swap(set8700_A[0], set8700_A[5]) == error(10371)
|
||||
set8700_A == "abcdef"
|
||||
protect(set8700_A,0), isnull(swap(set8700_A[0], set8700_A[5]))
|
||||
set8700_A == "fbcdea"
|
||||
protect(set8700_A,2), ++set8700_A[0] == error(10377)
|
||||
--set8700_A[1] == error(10380)
|
||||
set8700_A[2]++ == error(10383)
|
||||
set8700_A[3]-- == error(10386)
|
||||
set8700_A == "fbcdea"
|
||||
protect(set8700_A,0), ++set8700_A[0] == 'g'
|
||||
--set8700_A[1] == 'a'
|
||||
set8700_A[2]++ == ord('c')
|
||||
set8700_A[3]-- == ord('d')
|
||||
set8700_A == "gadcea"
|
||||
|
||||
protect(set8700_x,0), protect(set8700_y,0), protect(set8700_x,256), protect(set8700_y,512),1
|
||||
quomod(11,4,set8700_x,set8700_y), set8700_x == 2 && set8700_y == 3
|
||||
protect(set8700_x) == 256
|
||||
protect(set8700_y) == 512
|
||||
|
||||
set8700_A = mat[3]; protect(set8700_A[0], 1024); protect(set8700_A[0]) == 1024
|
||||
set8700_x = 7, protect(set8700_x,0), protect(set8700_x, 512), 1
|
||||
set8700_A = {set8700_x,,set8700_x}, protect(set8700_A[0]) == 1536
|
||||
protect(set8700_A[1]) == 0
|
||||
protect(set8700_A[2]) == 512
|
||||
protect(set8700_A,16), protect(set8700_A) == 16 ## No copy to
|
||||
set8700_A == (mat[3] = {7,0,7})
|
||||
set8700_A = {1,2,3}, errno() == 10390;
|
||||
set8700_A == (mat[3] = {7,0,7})
|
||||
|
||||
protect(set8700_A,0), set8700_A = {1,2,3}, set8700_A == (mat[3] = {1,2,3})
|
||||
protect(set8700_A[1],1), protect(set8700_A[1]) == 1
|
||||
set8700_A = {4,5,6}, errno() == 10394
|
||||
set8700_A == (mat[3] = {4,2,6})
|
||||
modify(7, "set8700_f") == error(10405)
|
||||
set8700_A = list(2,3,5), modify(set8700_A, 7) == error(10406)
|
||||
protect(set8700_A,2), modify(set8700_A, "set8700_f") == error(10407)
|
||||
protect(set8700_A,0), modify(set8700_A, "h") == error(10408)
|
||||
set8700_B = 42, protect(set8700_B,0), modify(set8700_B, "set8700_f") == error(10409)
|
||||
set8700_A == list(2,3,5) ## set8700_A not affected by failures
|
||||
protect(set8700_A,0,1), modify(set8700_A, "set8700_f") == null()
|
||||
set8700_A == list(4,9,25)
|
||||
modify(set8700_A,"set8700_g") == null()
|
||||
protect(set8700_A[0]) == 0
|
||||
protect(set8700_A[1]) == 256 && protect(set8700_A[2]) == 256
|
||||
|
||||
set8700_A = 0, protect(set8700_A,0), set8700_A = pop(2), set8700_A == error(10181)
|
||||
set8700_A = pop(list(1,2,3)), set8700_A == error(10181)
|
||||
set8700_B = set8700_A = pop(2), set8700_B == error(10181)
|
||||
set8700_A = 32, protect(set8700_A,8), (set8700_A = pop(2)) == error(10370)
|
||||
set8700_A == 32
|
||||
set8700_B = set8700_A = pop(2), set8700_B == error(10370)
|
||||
## Testing copying of protected elements and initialization
|
||||
set8700_M1 = mat[3], protect(set8700_M1,0), protect(set8700_M1[1],1), protect(set8700_M1[1]) == 1
|
||||
set8700_M2 = mat[3], protect(set8700_M2,0), protect(set8700_M2[2],4), protect(set8700_M2[2]) == 4
|
||||
set8700_L = list(set8700_M1, set8700_M2), protect(set8700_L[0][1]) == 1 && protect(set8700_L[1][2]) == 4
|
||||
set8700_L = {{1,2,3},{'a','b','c'}}, set8700_L[0] == (mat[3] = {1,0,3})
|
||||
set8700_L[1] == (mat[3] = {'a','b',0})
|
||||
set8700_M = mat[2], protect(set8700_M,0), set8700_M = {1,2,3,4}, set8700_M == (mat[2] = {1,2})
|
||||
set8700_x = 5, set8700_M = {set8700_x++, set8700_x++, set8700_x++, set8700_x++, set8700_x++}, set8700_M == (mat[2] = {5,6})
|
||||
set8700_x == 10 ## All initialization terms evaluated
|
||||
set8700_S = " ", set8700_S = {'a','b','c','d'}, set8700_S == "abc"
|
||||
|
||||
set8700_P = obj set8700_point = {1,2,3,4}, set8700_P.set8700_x == 1 && set8700_P.set8700_y == 2 && set8700_P.set8700_z == 3
|
||||
protect(set8700_P,16), set8700_Q = set8700_P, set8700_Q = {5,6,7}, set8700_Q == set8700_P
|
||||
set8700_P == (obj set8700_point = {1,2,3})
|
||||
set8700_L = list(mat[1] = {set8700_P}), protect(set8700_L[0][0]) == 16
|
||||
set8700_L = {{{4,5,6}}}, set8700_L[0][0] == set8700_P
|
||||
protect(set8700_L,0,2), set8700_L = {{{4,5,6}}}, set8700_L[0][0] == (obj set8700_point = {4,5,6})
|
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: test2700.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: test2700.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test2700.cal,v $
|
||||
*
|
||||
* Under source code control: 1995/11/01 22:52:25
|
||||
@@ -41,8 +41,7 @@
|
||||
*/
|
||||
|
||||
|
||||
global defaultverbose = 1;
|
||||
global err;
|
||||
defaultverbose = 1;
|
||||
|
||||
define mknonnegreal() {
|
||||
switch(rand(8)) {
|
||||
|
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: test3300.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: test3300.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test3300.cal,v $
|
||||
*
|
||||
* Under source code control: 1995/12/02 04:27:41
|
||||
@@ -30,8 +30,7 @@
|
||||
*/
|
||||
|
||||
|
||||
global defaultverbose = 1; /* default verbose value */
|
||||
global err;
|
||||
defaultverbose = 1; /* default verbose value */
|
||||
|
||||
define testi(str, n, N, verbose)
|
||||
{
|
||||
|
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: test3400.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: test3400.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test3400.cal,v $
|
||||
*
|
||||
* Under source code control: 1995/12/02 05:20:11
|
||||
@@ -54,8 +54,7 @@
|
||||
*/
|
||||
|
||||
|
||||
global defaultverbose = 1; /* default verbose value */
|
||||
global err;
|
||||
defaultverbose = 1; /* default verbose value */
|
||||
|
||||
global pi1k = pi(1e-1000);
|
||||
|
||||
|
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: test3500.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: test3500.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test3500.cal,v $
|
||||
*
|
||||
* Under source code control: 1995/12/18 22:50:46
|
||||
@@ -53,8 +53,7 @@
|
||||
*/
|
||||
|
||||
|
||||
global defaultverbose = 1; /* default verbose value */
|
||||
global err;
|
||||
defaultverbose = 1; /* default verbose value */
|
||||
|
||||
define testfrem(x,y,verbose)
|
||||
{
|
||||
|
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: test4000.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: test4000.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test4000.cal,v $
|
||||
*
|
||||
* Under source code control: 1996/03/13 02:38:45
|
||||
@@ -75,8 +75,7 @@
|
||||
*/
|
||||
|
||||
|
||||
global defaultverbose = 1; /* default verbose value */
|
||||
global err;
|
||||
defaultverbose = 1; /* default verbose value */
|
||||
|
||||
/*
|
||||
* test defaults
|
||||
|
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: test4100.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: test4100.cal,v 29.4 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test4100.cal,v $
|
||||
*
|
||||
* Under source code control: 1996/03/13 03:53:22
|
||||
@@ -70,18 +70,16 @@
|
||||
*/
|
||||
|
||||
|
||||
global defaultverbose = 1; /* default verbose value */
|
||||
global err;
|
||||
defaultverbose = 1; /* default verbose value */
|
||||
|
||||
/*
|
||||
* test defaults
|
||||
*/
|
||||
global K1 = 2^17;
|
||||
global K2 = 2^12;
|
||||
global BASEB = 16;
|
||||
global BASE = 2^BASEB;
|
||||
global test4100_K1 = 2^17;
|
||||
global test4100_K2 = 2^12;
|
||||
global test4100_BASE = 2^config("baseb");
|
||||
|
||||
define rlen_4100(N) = rand(BASE^(N-1), BASE^N);
|
||||
define rlen_4100(N) = rand(test4100_BASE^(N-1), test4100_BASE^N);
|
||||
|
||||
define olen(N)
|
||||
{
|
||||
@@ -234,7 +232,7 @@ define times(str,N,n,verbose)
|
||||
m = olen(N);
|
||||
m2 = m^2;
|
||||
if (isnull(n)) {
|
||||
n = ceil(K1/power(N,1.585));
|
||||
n = ceil(test4100_K1/power(N,1.585));
|
||||
if (verbose > 1)
|
||||
printf("n = %d\n", n);
|
||||
}
|
||||
@@ -308,7 +306,7 @@ define powtimes(str, N1, N2, n, verbose)
|
||||
N2 = 1;
|
||||
|
||||
if (isnull(n)) {
|
||||
n = ceil(K2/power(N1, 1.585)/N2);
|
||||
n = ceil(test4100_K2/power(N1, 1.585)/N2);
|
||||
printf ("n = %d\n", n);
|
||||
}
|
||||
mat A[n];
|
||||
@@ -316,8 +314,8 @@ define powtimes(str, N1, N2, n, verbose)
|
||||
mat B[n];
|
||||
v = olen(N1);
|
||||
|
||||
cp = config("pow2", 1);
|
||||
crc = config("redc2", 1);
|
||||
cp = config("pow2", 2);
|
||||
crc = config("redc2", 2);
|
||||
|
||||
/* initialize redc and lastmod info */
|
||||
|
||||
@@ -346,7 +344,7 @@ define powtimes(str, N1, N2, n, verbose)
|
||||
for (i = 0; i < n; i++)
|
||||
z4 += rcpow(Ar[i], B[i], v);
|
||||
trcsmall = round(runtime() - t, 4);
|
||||
config("redc2", 1);
|
||||
config("redc2", 2);
|
||||
t = runtime();
|
||||
for (i = 0; i < n; i++)
|
||||
z5 += rcpow(Ar[i], B[i], v);
|
||||
@@ -408,7 +406,7 @@ define inittimes(str,N,n,verbose)
|
||||
}
|
||||
m = 0;
|
||||
if (isnull(n)) {
|
||||
n = ceil(K1/N^2);
|
||||
n = ceil(test4100_K1/N^2);
|
||||
if (verbose > 1) {
|
||||
printf ("n = %d\n", n);
|
||||
}
|
||||
|
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: test4600.cal,v 29.4 2001/04/10 22:09:02 chongo Exp $
|
||||
* @(#) $Revision: 29.5 $
|
||||
* @(#) $Id: test4600.cal,v 29.5 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test4600.cal,v $
|
||||
*
|
||||
* Under source code control: 1996/07/02 20:04:40
|
||||
@@ -30,8 +30,7 @@
|
||||
*/
|
||||
|
||||
|
||||
global defaultverbose = 1 /* default verbose value */
|
||||
global err;
|
||||
defaultverbose = 1; /* default verbose value */
|
||||
|
||||
/*
|
||||
* test globals
|
||||
|
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: test5100.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: test5100.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test5100.cal,v $
|
||||
*
|
||||
* Under source code control: 1996/12/02 23:57:10
|
||||
@@ -30,8 +30,7 @@
|
||||
*/
|
||||
|
||||
|
||||
global defaultverbose = 1; /* default verbose value */
|
||||
global err;
|
||||
defaultverbose = 1; /* default verbose value */
|
||||
|
||||
/*
|
||||
* We test the new code generator declaration scope and order.
|
||||
|
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: test5200.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: test5200.cal,v 29.3 2006/06/20 09:29:16 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/test5200.cal,v $
|
||||
*
|
||||
* Under source code control: 1997/02/07 02:48:10
|
||||
@@ -30,8 +30,7 @@
|
||||
*/
|
||||
|
||||
|
||||
global defaultverbose = 1; /* default verbose value */
|
||||
global err;
|
||||
defaultverbose = 1; /* default verbose value */
|
||||
|
||||
/*
|
||||
* test the fix of a global/static bug
|
||||
|
33
calc.c
33
calc.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* calc - arbitrary precision calculator
|
||||
*
|
||||
* Copyright (C) 1999 David I. Bell, Landon Curt Noll and Ernest Bowen
|
||||
* Copyright (C) 1999-2006 David I. Bell, Landon Curt Noll and Ernest Bowen
|
||||
*
|
||||
* Primary author: David I. Bell
|
||||
*
|
||||
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.8 $
|
||||
* @(#) $Id: calc.c,v 29.8 2001/04/10 22:03:13 chongo Exp $
|
||||
* @(#) $Revision: 29.13 $
|
||||
* @(#) $Id: calc.c,v 29.13 2006/05/19 15:26:10 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.c,v $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:48:11
|
||||
@@ -83,6 +83,8 @@
|
||||
# define strdup(x) calc_strdup((CONST char *)(x))
|
||||
#endif /* HAVE_STRDUP */
|
||||
|
||||
#include "have_unused.h"
|
||||
|
||||
|
||||
/*
|
||||
* static definitions and functions
|
||||
@@ -109,7 +111,7 @@ main(int argc, char **argv)
|
||||
BOOL done = FALSE;
|
||||
BOOL havearg;
|
||||
BOOL haveendstr;
|
||||
int len;
|
||||
size_t len;
|
||||
|
||||
/*
|
||||
* parse args
|
||||
@@ -214,7 +216,13 @@ main(int argc, char **argv)
|
||||
havearg = TRUE;
|
||||
break;
|
||||
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;
|
||||
case 'p':
|
||||
p_flag = TRUE;
|
||||
@@ -385,7 +393,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
/* XXX What if *cp = '\''? */
|
||||
*bp++ = '\'';
|
||||
strcpy(bp, cp);
|
||||
strncpy(bp, cp, len+1);
|
||||
bp += len;
|
||||
*bp++ = '\'';
|
||||
cp += len;
|
||||
@@ -425,7 +433,7 @@ main(int argc, char **argv)
|
||||
fprintf(stderr,
|
||||
"usage: %s [-a] [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]\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",
|
||||
program);
|
||||
exit(1);
|
||||
@@ -444,16 +452,19 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
while (index < maxindex) {
|
||||
size_t cplen;
|
||||
|
||||
if (cmdlen > 0)
|
||||
cmdbuf[cmdlen++] = ' ';
|
||||
newcmdlen = cmdlen + strlen(cp);
|
||||
cplen = strlen(cp);
|
||||
newcmdlen = cmdlen + cplen;
|
||||
if (newcmdlen > MAXCMD) {
|
||||
fprintf(stderr,
|
||||
"%s: commands too long\n",
|
||||
program);
|
||||
exit(1);
|
||||
}
|
||||
strcpy(cmdbuf + cmdlen, cp);
|
||||
strncpy(cmdbuf + cmdlen, cp, cplen+1);
|
||||
cmdlen = newcmdlen;
|
||||
index++;
|
||||
if (index < maxindex)
|
||||
@@ -571,7 +582,7 @@ main(int argc, char **argv)
|
||||
if (run_state == RUN_PRE_CMD_ARGS) {
|
||||
if (havecommands) {
|
||||
set_run_state(RUN_CMD_ARGS);
|
||||
(void) openstring(cmdbuf, (long) strlen(cmdbuf));
|
||||
(void) openstring(cmdbuf, strlen(cmdbuf));
|
||||
getcommands(FALSE);
|
||||
closeinput();
|
||||
}
|
||||
@@ -700,7 +711,7 @@ main(int argc, char **argv)
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
static void
|
||||
intint(int arg)
|
||||
intint(int UNUSED arg)
|
||||
{
|
||||
(void) signal(SIGINT, intint);
|
||||
if (inputwait || (++abortlevel >= ABORT_NOW)) {
|
||||
|
25
calc.h
25
calc.h
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* calc - definitions for calculator program
|
||||
*
|
||||
* Copyright (C) 1999 David I. Bell
|
||||
* Copyright (C) 1999-2006 David I. Bell
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.7 $
|
||||
* @(#) $Id: calc.h,v 29.7 2001/05/29 00:16:53 chongo Exp $
|
||||
* @(#) $Revision: 29.18 $
|
||||
* @(#) $Id: calc.h,v 29.18 2006/05/21 07:28:54 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.h,v $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:48:31
|
||||
@@ -32,7 +32,7 @@
|
||||
#define __CALC_H__
|
||||
|
||||
#include <setjmp.h>
|
||||
#if defined(SRC) /* if we are building from the calc source tree */
|
||||
#if defined(CALC_SRC) /* if we are building from the calc source tree */
|
||||
# include "win32dll.h"
|
||||
# include "value.h"
|
||||
# include "have_const.h"
|
||||
@@ -60,7 +60,11 @@
|
||||
#define HOMECHAR '~' /* char which indicates home directory */
|
||||
#define DOTCHAR '.' /* char which indicates current directory */
|
||||
#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 */
|
||||
#endif
|
||||
#define MAXCMD 16384 /* maximum length of command invocation */
|
||||
#define MAXERROR 512 /* maximum length of error message string */
|
||||
|
||||
@@ -94,12 +98,13 @@
|
||||
#define FILEID_STDIN ((FILEID) 0)
|
||||
#define FILEID_STDOUT ((FILEID) 1)
|
||||
#define FILEID_STDERR ((FILEID) 2)
|
||||
#define FILEID_NONE ((FILEID) -1)
|
||||
#define FILEID_NONE ((FILEID) -1) /* must be < 0 */
|
||||
|
||||
/*
|
||||
* File I/O routines.
|
||||
*/
|
||||
extern DLL FILEID openid(char *name, char *mode);
|
||||
extern DLL FILEID openpathid(char *name, char *mode, char *pathlist);
|
||||
extern DLL FILEID indexid(long index);
|
||||
extern DLL BOOL validid(FILEID id);
|
||||
extern DLL BOOL errorid(FILEID id);
|
||||
@@ -144,7 +149,7 @@ extern DLL void trimconstants(void);
|
||||
/*
|
||||
* Input routines.
|
||||
*/
|
||||
extern DLL int openstring(char *str, long num);
|
||||
extern DLL int openstring(char *str, size_t num);
|
||||
extern DLL int openterminal(void);
|
||||
extern DLL int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok);
|
||||
extern DLL char *nextline(void);
|
||||
@@ -201,7 +206,7 @@ extern DLL int d_flag; /* TRUE => disable heading, resource_debug */
|
||||
extern DLL int c_flag; /* TRUE => continue after error if permitted */
|
||||
extern DLL int i_flag; /* TRUE => try to go interactive after error */
|
||||
extern DLL int s_flag; /* TRUE => keep args as strings for argv() */
|
||||
extern DLL int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */
|
||||
extern DLL long stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */
|
||||
extern DLL BOOL abort_now; /* TRUE => try to go interactive */
|
||||
|
||||
extern DLL int argc_value; /* count of argv[] strings for argv() builtin */
|
||||
@@ -227,8 +232,8 @@ extern DLL char *shell; /* $SHELL or default */
|
||||
extern DLL char *program; /* our name (argv[0]) */
|
||||
|
||||
extern DLL int no_env; /* TRUE (-e) => ignore env vars on startup */
|
||||
extern DLL int errmax; /* if >= 0, error when errcount exceeds errmax */
|
||||
extern DLL int new_std; /* TRUE (-n) => use newstd configuration */
|
||||
extern DLL long errmax; /* if >= 0, error when errcount exceeds errmax */
|
||||
extern DLL int use_old_std; /* TRUE (-O) => use classic configuration */
|
||||
|
||||
extern DLL int allow_read; /* FALSE => dont open any files for reading */
|
||||
extern DLL int allow_write; /* FALSE => dont open any files for writing */
|
||||
@@ -258,7 +263,7 @@ extern DLL char *run_state_name(run state);
|
||||
extern int calc_major_ver;
|
||||
extern int calc_minor_ver;
|
||||
extern int calc_major_patch;
|
||||
extern char *calc_minor_patch;
|
||||
extern int calc_minor_patch;
|
||||
extern char *Copyright;
|
||||
extern DLL char *version(void);
|
||||
|
||||
|
284
calc.man
284
calc.man
@@ -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
|
||||
.\" 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.
|
||||
.\" 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
.\"
|
||||
.\" @(#) $Revision: 29.6 $
|
||||
.\" @(#) $Id: calc.man,v 29.6 2001/04/10 21:48:46 chongo Exp $
|
||||
.\" @(#) $Revision: 29.20 $
|
||||
.\" @(#) $Id: calc.man,v 29.20 2006/06/01 12:04:16 chongo Exp $
|
||||
.\" @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.man,v $
|
||||
.\"
|
||||
.\" Under source code control: 1991/07/23 05:48:26
|
||||
@@ -44,17 +44,17 @@ calc \- arbitrary precision calculator
|
||||
.RB [ \-h ]
|
||||
.RB [ \-i ]
|
||||
.RB [ \-m\ \&mode ]
|
||||
.RB [ \-n ]
|
||||
.RB [ \-O ]
|
||||
.br
|
||||
.RB [ \-p ]
|
||||
.RB [ \-q ]
|
||||
.RB [ \-s ]
|
||||
.RB [ \-u ]
|
||||
.RB [ \-v ]
|
||||
.RB [ calc_cmd\ \&.\|.\|. ]
|
||||
.RB [ [\-\-]\ calc_cmd\ \&.\|.\|. ]
|
||||
.in -5n
|
||||
.sp
|
||||
\fI#!${BINDIR}/calc\fP\ \fB\-S\fP\ [other_flags\ \&...]
|
||||
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
|
||||
.SH DESCRIPTION
|
||||
\&
|
||||
.br
|
||||
@@ -63,8 +63,11 @@ CALC OPTIONS
|
||||
|
||||
.TP
|
||||
.B \-c
|
||||
Continue reading command lines even after an execution
|
||||
Continue reading command lines even after an scan/parse
|
||||
error has caused the abandonment of a line.
|
||||
Note that this option only deals with scanning and
|
||||
parsing of the calc language.
|
||||
It does not deal with execution or run-time errors.
|
||||
.sp 1
|
||||
For example:
|
||||
.sp 1
|
||||
@@ -76,7 +79,7 @@ calc read many_errors.cal
|
||||
.sp 1
|
||||
will cause
|
||||
.B calc
|
||||
to abort on the first error, whereas:
|
||||
to abort on the first syntax error, whereas:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
@@ -88,7 +91,7 @@ will
|
||||
cause
|
||||
.B calc
|
||||
to try to process each line being read
|
||||
despite the errors that it encounters.
|
||||
despite the scan/parse errors that it encounters.
|
||||
.sp 1
|
||||
By default, calc startup resource files are silently
|
||||
ignored if not found.
|
||||
@@ -119,7 +122,7 @@ as if \fBconfig("resource_debug", 0)\fP had been executed.
|
||||
For example:
|
||||
.sp 1
|
||||
.in +5n
|
||||
calc 'read qtime; qtime(2)'
|
||||
calc "read qtime; qtime(2)"
|
||||
.in -5n
|
||||
.sp 1
|
||||
will output something like:
|
||||
@@ -135,7 +138,7 @@ whereas:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
calc -d 'read qtime; qtime(2)'
|
||||
calc -d "read qtime; qtime(2)"
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
@@ -183,6 +186,80 @@ help config
|
||||
Ignore any environment variables on startup.
|
||||
The getenv() builtin will still return values, however.
|
||||
|
||||
.TP
|
||||
.B \-f
|
||||
This flag is required when using calc in
|
||||
.BR "shell script mode" .
|
||||
It must be at the end of the initial
|
||||
.B #!
|
||||
line of the script.
|
||||
.sp 1
|
||||
This flag is normally only at the end of a calc shell script.
|
||||
If the first line of an executable file begins
|
||||
.B #!
|
||||
followed by the absolute pathname of the
|
||||
.B calc
|
||||
program and the flag
|
||||
.B \-f
|
||||
as in:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
the rest of the file will be processed in
|
||||
.BR "shell script mode" .
|
||||
See
|
||||
.B "SHELL SCRIPT MODE"
|
||||
section of this man page
|
||||
below for details.
|
||||
.sp 1
|
||||
The actual form of this flag is:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.B \-f
|
||||
filename
|
||||
.in -5n
|
||||
.sp 1
|
||||
On systems that treat an executable that begins with
|
||||
.B #!
|
||||
as a script, the path of the execurable is appended by the kernel
|
||||
as the final argument to the exec() system call.
|
||||
This is why the
|
||||
.B \-f
|
||||
flag at the very end of the
|
||||
.B #!
|
||||
line.
|
||||
.sp 1
|
||||
It is possible use
|
||||
.B \-f\ filename
|
||||
on the command line:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
\fIcalc\fP\ [other_flags\ \&...] \fB\-f\fP filename
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
This will cause calc to process lines in
|
||||
.B filename
|
||||
in
|
||||
.BR "shell script mode" .
|
||||
.sp 1
|
||||
Use of
|
||||
.B \-f
|
||||
implies
|
||||
.BR \-s .
|
||||
In addition,
|
||||
.B \-d
|
||||
and
|
||||
.B \-p
|
||||
are implied if
|
||||
.B \-i
|
||||
is not given.
|
||||
|
||||
.TP
|
||||
.B \-h
|
||||
Print a help message. This option implies
|
||||
@@ -302,11 +379,22 @@ The reading of key bindings is also disabled
|
||||
when the mode disables opening of files for reading.
|
||||
|
||||
.TP
|
||||
.B \-n
|
||||
Use the new configuration defaults instead of the old
|
||||
default classic defaults.
|
||||
.B \-O
|
||||
Use the old classic defaults instead of the
|
||||
default configuration.
|
||||
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
|
||||
.B \-p
|
||||
@@ -316,7 +404,7 @@ For example:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
calc -p '2^21701-1' | fizzbin
|
||||
calc -p "2^21701-1" | fizzbin
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
@@ -350,6 +438,21 @@ Disable buffering of stdin and stdout.
|
||||
Print the
|
||||
.B calc
|
||||
version number and exit.
|
||||
|
||||
.TP
|
||||
.B \-\-
|
||||
The double dash indicates to calc that no more option follow.
|
||||
Thus calc will ignore a later argument on the command line
|
||||
even if it starts with a dash.
|
||||
This is useful when entering negative values on the command line as in:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
calc \-p \-\- \-1 - -7
|
||||
.sp 1
|
||||
.fi
|
||||
.in -5n
|
||||
|
||||
.PP
|
||||
|
||||
\&
|
||||
@@ -392,32 +495,50 @@ calc 23 + 47
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
should respond with display of 70, but
|
||||
will print 70.
|
||||
However, command lines will have problems:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
calc 23 * 47
|
||||
.sp 1
|
||||
calc -23 + 47
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
may fail.
|
||||
Such cases can usually be made to work as expected by
|
||||
enclosing the command between single marks as in:
|
||||
The first example above fails because the shell interprets the '*'
|
||||
as a file glob.
|
||||
The second example fails because '\-23' is viewed as a calc option
|
||||
(which it is not) and do calc objects to that it thinks of as an unknown option.
|
||||
These cases can usually be made to work as expected by
|
||||
enclosing the command between quotes:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
calc '23 * 47'
|
||||
.sp 1
|
||||
calc "print sqrt(2), exp(1)"
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
and
|
||||
or in parentheses and quotes to avoid leading \-'s as in:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
calc 'print sqrt(2), exp(1)'
|
||||
calc '(-23 + 47)'
|
||||
.fi
|
||||
.in -5n
|
||||
.sp
|
||||
.sp 1
|
||||
One may also use a double dash to denote that calc options have ended as in:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
calc -- -23 + 47
|
||||
.sp 1
|
||||
calc -q -- -23 + 47
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
If '!' is to be used to indicate the factorial function, for
|
||||
shells like
|
||||
.BI csh (1)
|
||||
@@ -514,8 +635,8 @@ searches in succession:
|
||||
./myfile.cal
|
||||
${LIBDIR}/myfile
|
||||
${LIBDIR}/myfile.cal
|
||||
${CUSTOMLIBDIR}/myfile
|
||||
${CUSTOMLIBDIR}/myfile.cal
|
||||
${CUSTOMCALDIR}/myfile
|
||||
${CUSTOMCALDIR}/myfile.cal
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
@@ -567,32 +688,30 @@ help config
|
||||
.br
|
||||
SHELL SCRIPT MODE
|
||||
.PP
|
||||
If first line of an executable file begins
|
||||
If the first line of an executable file begins
|
||||
.B #!
|
||||
followed by the absolute pathname of the
|
||||
.B calc
|
||||
program and the flag
|
||||
.B \-S
|
||||
.B \-f
|
||||
as in:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
\fI#!${BINDIR}/calc\fP\ \fB\-S\fP\ [other_flags\ \&...]
|
||||
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
the rest of the file will be processed in
|
||||
.BR "shell script mode" .
|
||||
Note that
|
||||
.B \-S
|
||||
(UPPER CASE
|
||||
.BR \-S )
|
||||
must be the first \-flag on the ``#!'' line.
|
||||
.B \-f
|
||||
must at the end of the intiial ``#!'' line.
|
||||
Any other optional
|
||||
.B "other_flags"
|
||||
must come after
|
||||
must come before
|
||||
the
|
||||
.BR \-S .
|
||||
.BR \-f .
|
||||
.sp 1
|
||||
In
|
||||
.B "shell script mode"
|
||||
@@ -608,8 +727,6 @@ the later lines within the script itself.
|
||||
In
|
||||
.BR "shell script mode" ,
|
||||
.B \-s
|
||||
(lower case
|
||||
.BR \-s )
|
||||
is always assumed.
|
||||
In addition,
|
||||
.B \-d
|
||||
@@ -625,7 +742,7 @@ the file
|
||||
.sp 1
|
||||
.in +5n
|
||||
.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
|
||||
|
||||
@@ -839,7 +956,7 @@ ${LIBDIR}/bindings
|
||||
non-GNU-readline command line editor bindings
|
||||
.sp 1
|
||||
.TP 5
|
||||
${INCDIRCALC}/*.h
|
||||
${CALC_INCDIR}/*.h
|
||||
include files for C interface use
|
||||
.sp 1
|
||||
.TP 5
|
||||
@@ -851,7 +968,7 @@ ${LIBDIR}/libcustcalc.a
|
||||
custom binary link library
|
||||
.sp 1
|
||||
.TP 5
|
||||
${CUSTOMLIBDIR}/*.cal
|
||||
${CUSTOMCALDIR}/*.cal
|
||||
custom resource files
|
||||
.sp 1
|
||||
.TP 5
|
||||
@@ -994,25 +1111,58 @@ Copyright (C) 1999 Landon Curt Noll
|
||||
and is covered under version 2.1 GNU Lesser General
|
||||
Public License.
|
||||
.sp
|
||||
.SH "BUG REPORTS / BUG FIXES / ENHANCEMENTS"
|
||||
.SH "CALC MAILING LIST / CALC UPDATES / ENHANCEMENTS"
|
||||
\&
|
||||
.br
|
||||
.sp
|
||||
Send comments, suggestions, bug fixes, enhancements
|
||||
To contribute comments, suggestions, enhancements
|
||||
and interesting
|
||||
.B calc
|
||||
resource files,
|
||||
.B calc
|
||||
shell scripts that you would like you see included
|
||||
in future distributions to:
|
||||
resource files, and
|
||||
shell scripts please join the low volume calc mailing list.
|
||||
.sp
|
||||
To join the low volume calc mailing list, send EMail to:
|
||||
.sp
|
||||
.in +0.5i
|
||||
.nf
|
||||
calc-contrib at asthe dot com
|
||||
calc-tester-request at asthe dot com
|
||||
.fi
|
||||
.in -0.5i
|
||||
.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
|
||||
.in +0.5i
|
||||
.nf
|
||||
@@ -1023,6 +1173,16 @@ calc-bugs at asthe dot com
|
||||
.fi
|
||||
.in -0.5i
|
||||
.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
|
||||
.I BUGS
|
||||
source file or use the
|
||||
@@ -1037,7 +1197,7 @@ help bugs
|
||||
.sp
|
||||
for more information about bug reporting.
|
||||
.sp
|
||||
.SH "CALC WEB SITE / MAILING LIST"
|
||||
.SH "CALC WEB SITE"
|
||||
\&
|
||||
.br
|
||||
Landon Noll maintains the the
|
||||
@@ -1045,33 +1205,7 @@ Landon Noll maintains the the
|
||||
web site is located at:
|
||||
.sp
|
||||
.in +0.5i
|
||||
http://www.isthe.com/chongo/tech/comp/calc/
|
||||
www.isthe.com/chongo/tech/comp/calc/
|
||||
.in -0.5i
|
||||
.sp
|
||||
One may join the
|
||||
.B calc
|
||||
testing group by sending a request to:
|
||||
.sp
|
||||
.in +0.5i
|
||||
.nf
|
||||
calc-tester-request at 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! :\-)
|
||||
|
123
calc.spec.in
Normal file
123
calc.spec.in
Normal file
@@ -0,0 +1,123 @@
|
||||
#****h* calc/calc.spec.in
|
||||
#
|
||||
# calc.spec.in - template specfile for calc
|
||||
#
|
||||
# Copyright (C) 2003-2005 Petteri Kettunen and Landon Curt Noll
|
||||
#
|
||||
# Calc is open software; you can redistribute it and/or modify it under
|
||||
# the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
# 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.15 $
|
||||
# @(#) $Id: calc.spec.in,v 29.15 2006/05/21 06:26:00 chongo Exp $
|
||||
# @(#) $Source: /usr/local/src/cmd/calc/RCS/calc.spec.in,v $
|
||||
#
|
||||
# Under source code control: 2003/02/16 20:21:39
|
||||
# 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 subdirs. In case e.g. %{_includedir}/calc
|
||||
# is defined in `%files devel' section, then rpmbuild complains that
|
||||
# header files are defined twice - rpmbuild bug or bug in specfile conf???
|
||||
|
||||
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 prototype and mathematical research
|
||||
tool. Calc comes with a rich set of builtin mathematical and
|
||||
programmatic functions.
|
||||
|
||||
For the latest calc release, see the calc 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
|
||||
%{_datadir}/%{name}/*.line
|
||||
|
||||
%files devel
|
||||
%defattr(-, root, root)
|
||||
%doc BUGS COPYING COPYING-LGPL LIBRARY
|
||||
%attr(644, root, root) %{_includedir}/calc/*
|
||||
%attr(644, root, root) %{_libdir}/*.a
|
||||
|
||||
%changelog
|
||||
* Sun May 20 2006 Landon Curt Noll http://www.isthe.com/chongo
|
||||
- Release of calc-2.12.0
|
||||
- Added *.line set files to the list of packaged files
|
||||
* Sun Dec 11 2005 Landon Curt Noll http://www.isthe.com/chongo
|
||||
- Release of calc-2.11.11
|
||||
- Fixed description in spec file
|
||||
* Wed Feb 26 2003 Landon Curt Noll http://www.isthe.com/chongo
|
||||
- Release of calc-2.11.7-2
|
||||
- Fixed attributes on include and lib calc-devel files
|
||||
- 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
|
||||
|
||||
#****
|
64
calcerr.tbl
64
calcerr.tbl
@@ -17,8 +17,8 @@
|
||||
# received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# @(#) $Revision: 29.4 $
|
||||
# @(#) $Id: calcerr.tbl,v 29.4 2001/04/10 22:06:46 chongo Exp $
|
||||
# @(#) $Revision: 29.8 $
|
||||
# @(#) $Id: calcerr.tbl,v 29.8 2006/05/19 15:12:57 chongo Exp $
|
||||
# @(#) $Source: /usr/local/src/cmd/calc/RCS/calcerr.tbl,v $
|
||||
#
|
||||
# Under source code control: 1996/05/23 17:38:44
|
||||
@@ -164,7 +164,7 @@ E_RSEARCH3 Bad third argument for rsearch
|
||||
E_RSEARCH4 Bad fourth argument for rsearch
|
||||
E_RSEARCH5 Cannot find fsize or fpos for rsearch
|
||||
E_RSEARCH6 File not readable for rsearch
|
||||
E_FOPEN3 Too many open files
|
||||
E_MANYOPEN Too many open files
|
||||
E_REWIND2 Attempt to rewind a file that is not open
|
||||
E_STRERROR1 Bad argument type for strerror
|
||||
E_STRERROR2 Index out of range for strerror
|
||||
@@ -260,14 +260,14 @@ E_COPY13 No-copy-from source variable
|
||||
E_COPY14 No-copy-to destination variable
|
||||
E_COPY15 No-copy-from source named block
|
||||
E_COPY16 No-copy-to destination named block
|
||||
E_COPY17 No-relocation destination for copy
|
||||
E_COPY17 No-relocate destination for copy
|
||||
E_COPYF1 File not open for copy
|
||||
E_COPYF2 fseek or fsize failure for copy
|
||||
E_COPYF3 fwrite error for copy
|
||||
E_COPYF4 fread error for copy
|
||||
E_PROTECT1 Non-variable first argument for protect
|
||||
E_PROTECT2 Non-integer second argument for protect
|
||||
E_PROTECT3 Out-of-range second argument for protect
|
||||
E_PROTECT2 Bad second argument for protect
|
||||
E_PROTECT3 Bad third argument for protect
|
||||
E_MATFILL3 No-copy-to destination for matfill
|
||||
E_MATFILL4 No-assign-from source for matfill
|
||||
E_MATTRACE1 Non-matrix argument for mattrace
|
||||
@@ -393,3 +393,55 @@ E_BERN Bad argument for bern
|
||||
E_EULER Bad argument for euler
|
||||
E_SLEEP Bad argument for sleep
|
||||
E_TTY calc_tty failure
|
||||
E_ASSIGN1 No-copy-to destination for octet assign
|
||||
E_ASSIGN2 No-copy-from source for octet assign
|
||||
E_ASSIGN3 No-change destination for octet assign
|
||||
E_ASSIGN4 Non-variable destination for assign
|
||||
E_ASSIGN5 No-assign-to destination for assign
|
||||
E_ASSIGN6 No-assign-from source for assign
|
||||
E_ASSIGN7 No-change destination for assign
|
||||
E_ASSIGN8 No-type-change destination for assign
|
||||
E_ASSIGN9 No-error-value destination for assign
|
||||
E_SWAP1 No-copy argument for octet swap
|
||||
E_SWAP2 No-assign-to-or-from argument for swap
|
||||
E_SWAP3 Non-variable argument for swap
|
||||
E_QUOMOD1 Non-variable argument 4 or 4 for quomod
|
||||
E_QUOMOD2 Non-real-number argument 1 or 2 for quomod
|
||||
E_QUOMOD3 No-assign-to argument 3 or 4 for quomod
|
||||
E_PREINC1 No-copy-to or no-change argument for octet preinc
|
||||
E_PREINC2 Non-variable argument for preinc
|
||||
E_PREINC3 No-assign-to or no-change argument for preinc
|
||||
E_PREDEC1 No-copy-to or no-change argument for octet predec
|
||||
E_PREDEC2 Non-variable argument for predec
|
||||
E_PREDEC3 No-assign-to or no-change argument for predec
|
||||
E_POSTINC1 No-copy-to or no-change argument for octet postinc
|
||||
E_POSTINC2 Non-variable argument for postinc
|
||||
E_POSTINC3 No-assign-to or no-change argument for postinc
|
||||
E_POSTDEC1 No-copy-to or no-change argument for octet postdec
|
||||
E_POSTDEC2 Non-variable argument for postdec
|
||||
E_POSTDEC3 No-assign-to or no-change argument for postdec
|
||||
E_INIT1 Error-type structure for initialization
|
||||
E_INIT2 No-copy-to structure for initialization
|
||||
E_INIT3 Too many initializer values
|
||||
E_INIT4 Attempt to initialize freed named block
|
||||
E_INIT5 Bad structure type for initialization
|
||||
E_INIT6 No-assign-to element for initialization
|
||||
E_INIT7 No-change element for initialization
|
||||
E_INIT8 No-type-change element for initialization
|
||||
E_INIT9 No-error-value element for initialization
|
||||
E_INIT10 No-assign-or-copy-from source for initialization
|
||||
E_LIST1 No-relocate for list insert
|
||||
E_LIST2 No-relocate for list delete
|
||||
E_LIST3 No-relocate for list push
|
||||
E_LIST4 No-relocate for list append
|
||||
E_LIST5 No-relocate for list pop
|
||||
E_LIST6 No-relocate for list remove
|
||||
E_MODIFY1 Non-variable first argument for modify
|
||||
E_MODIFY2 Non-string second argument for modify
|
||||
E_MODIFY3 No-change first argument for modify
|
||||
E_MODIFY4 Undefined function for modify
|
||||
E_MODIFY5 Unacceptable type first argument for modify
|
||||
E_FPATHOPEN1 Non-string arguments for fpathopen
|
||||
E_FPATHOPEN2 Unrecognized mode for fpathopen
|
||||
E_LOG1 Bad epsilon argument for log
|
||||
E_LOG2 Non-numeric first argument for log
|
||||
|
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# check - check the regression output for problems
|
||||
#
|
||||
# Copyright (C) 1999 Landon Curt Noll
|
||||
# Copyright (C) 1999-2006 Landon Curt Noll
|
||||
#
|
||||
# Calc is open software; you can redistribute it and/or modify it under
|
||||
# the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -18,8 +18,8 @@
|
||||
# received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# @(#) $Revision: 29.2 $
|
||||
# @(#) $Id: check.awk,v 29.2 2000/06/07 14:02:13 chongo Exp $
|
||||
# @(#) $Revision: 29.3 $
|
||||
# @(#) $Id: check.awk,v 29.3 2006/05/20 19:43:39 chongo Exp $
|
||||
# @(#) $Source: /usr/local/src/cmd/calc/RCS/check.awk,v $
|
||||
#
|
||||
# Under source code control: 1996/05/25 22:07:58
|
||||
@@ -64,7 +64,7 @@ NF == 0 {
|
||||
end_seen = 1;
|
||||
}
|
||||
|
||||
$1 ~ /^[0-9]+:/ {
|
||||
$1 ~ /^[0-9]+:/ || $1 ~ /^[0-9]+-[0-9]*:/ {
|
||||
if (error > 0) {
|
||||
if (havebuf2) {
|
||||
print buf2;
|
||||
|
100
cmath.h
100
cmath.h
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: cmath.h,v 29.4 2001/05/29 00:16:53 chongo Exp $
|
||||
* @(#) $Revision: 29.7 $
|
||||
* @(#) $Id: cmath.h,v 29.7 2005/10/18 10:43:49 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/cmath.h,v $
|
||||
*
|
||||
* Under source code control: 1993/07/30 19:42:45
|
||||
@@ -32,7 +32,7 @@
|
||||
#define __CMATH_H__
|
||||
|
||||
|
||||
#if defined(SRC) /* if we are building from the calc source tree */
|
||||
#if defined(CALC_SRC) /* if we are building from the calc source tree */
|
||||
# include "qmath.h"
|
||||
#else
|
||||
# include <calc/qmath.h>
|
||||
@@ -62,63 +62,65 @@ extern void cprintfr(COMPLEX *c);
|
||||
/*
|
||||
* Basic numeric routines.
|
||||
*/
|
||||
extern COMPLEX *cadd(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *csub(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *cmul(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *cdiv(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *caddq(COMPLEX *c, NUMBER *q);
|
||||
extern COMPLEX *csubq(COMPLEX *c, NUMBER *q);
|
||||
extern COMPLEX *cmulq(COMPLEX *c, NUMBER *q);
|
||||
extern COMPLEX *cdivq(COMPLEX *c, NUMBER *q);
|
||||
extern COMPLEX *cscale(COMPLEX *c, long i);
|
||||
extern COMPLEX *cshift(COMPLEX *c, long i);
|
||||
extern COMPLEX *csquare(COMPLEX *c);
|
||||
extern COMPLEX *cconj(COMPLEX *c);
|
||||
extern COMPLEX *creal(COMPLEX *c);
|
||||
extern COMPLEX *cimag(COMPLEX *c);
|
||||
extern COMPLEX *cneg(COMPLEX *c);
|
||||
extern COMPLEX *cinv(COMPLEX *c);
|
||||
extern COMPLEX *cint(COMPLEX *c);
|
||||
extern COMPLEX *cfrac(COMPLEX *c);
|
||||
extern BOOL ccmp(COMPLEX *c1, COMPLEX *c2);
|
||||
|
||||
extern COMPLEX *c_add(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *c_sub(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *c_mul(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *c_div(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *c_addq(COMPLEX *c, NUMBER *q);
|
||||
extern COMPLEX *c_subq(COMPLEX *c, NUMBER *q);
|
||||
extern COMPLEX *c_mulq(COMPLEX *c, NUMBER *q);
|
||||
extern COMPLEX *c_divq(COMPLEX *c, NUMBER *q);
|
||||
extern COMPLEX *c_scale(COMPLEX *c, long i);
|
||||
extern COMPLEX *c_shift(COMPLEX *c, long i);
|
||||
extern COMPLEX *c_square(COMPLEX *c);
|
||||
extern COMPLEX *c_conj(COMPLEX *c);
|
||||
extern COMPLEX *c_real(COMPLEX *c);
|
||||
extern COMPLEX *c_imag(COMPLEX *c);
|
||||
extern COMPLEX *c_neg(COMPLEX *c);
|
||||
extern COMPLEX *c_inv(COMPLEX *c);
|
||||
extern COMPLEX *c_int(COMPLEX *c);
|
||||
extern COMPLEX *c_frac(COMPLEX *c);
|
||||
extern BOOL c_cmp(COMPLEX *c1, COMPLEX *c2);
|
||||
|
||||
|
||||
/*
|
||||
* More complicated functions.
|
||||
*/
|
||||
extern COMPLEX *cpowi(COMPLEX *c, NUMBER *q);
|
||||
extern NUMBER *cilog(COMPLEX *c, ZVALUE base);
|
||||
extern COMPLEX *c_powi(COMPLEX *c, NUMBER *q);
|
||||
extern NUMBER *c_ilog(COMPLEX *c, ZVALUE base);
|
||||
|
||||
|
||||
/*
|
||||
* Transcendental routines. These all take an epsilon argument to
|
||||
* specify how accurately these are to be calculated.
|
||||
*/
|
||||
extern COMPLEX *cpower(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon);
|
||||
extern COMPLEX *csqrt(COMPLEX *c, NUMBER *epsilon, long R);
|
||||
extern COMPLEX *croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon);
|
||||
extern COMPLEX *cexp(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cln(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *ccos(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *csin(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *ccosh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *csinh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cpolar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon);
|
||||
extern COMPLEX *crel(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *casin(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cacos(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *catan(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cacot(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *casec(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cacsc(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *casinh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cacosh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *catanh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cacoth(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *casech(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cacsch(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cgd(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *cagd(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_power(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon);
|
||||
extern COMPLEX *c_sqrt(COMPLEX *c, NUMBER *epsilon, long R);
|
||||
extern COMPLEX *c_root(COMPLEX *c, NUMBER *q, NUMBER *epsilon);
|
||||
extern COMPLEX *c_exp(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_ln(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_log(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_cos(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_sin(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_cosh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_sinh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_polar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon);
|
||||
extern COMPLEX *c_rel(COMPLEX *c1, COMPLEX *c2);
|
||||
extern COMPLEX *c_asin(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_acos(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_atan(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_acot(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_asec(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_acsc(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_asinh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_acosh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_atanh(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_acoth(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_asech(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_acsch(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_gd(COMPLEX *c, NUMBER *epsilon);
|
||||
extern COMPLEX *c_agd(COMPLEX *c, NUMBER *epsilon);
|
||||
|
||||
|
||||
|
||||
|
356
comfunc.c
356
comfunc.c
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: comfunc.c,v 29.3 2000/07/17 15:35:49 chongo Exp $
|
||||
* @(#) $Revision: 29.6 $
|
||||
* @(#) $Id: comfunc.c,v 29.6 2006/05/20 08:43:55 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/comfunc.c,v $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:48:13
|
||||
@@ -33,6 +33,16 @@
|
||||
#include "config.h"
|
||||
#include "cmath.h"
|
||||
|
||||
/*
|
||||
* cache the natural logarithm of 10
|
||||
*/
|
||||
static COMPLEX *cln_10 = NULL;
|
||||
static NUMBER *cln_10_epsilon = NULL;
|
||||
static NUMBER _q10_ = { { _tenval_, 1, 0 }, { _oneval_, 1, 0 }, 1, NULL };
|
||||
static NUMBER _q0_ = { { _zeroval_, 1, 0 }, { _oneval_, 1, 0 }, 1, NULL };
|
||||
COMPLEX _cten_ = { &_q10_, &_q0_, 1 };
|
||||
|
||||
|
||||
/*
|
||||
* Compute the result of raising a complex number to an integer power.
|
||||
*
|
||||
@@ -41,7 +51,7 @@
|
||||
* q power to raise it to
|
||||
*/
|
||||
COMPLEX *
|
||||
cpowi(COMPLEX *c, NUMBER *q)
|
||||
c_powi(COMPLEX *c, NUMBER *q)
|
||||
{
|
||||
COMPLEX *tmp, *res; /* temporary values */
|
||||
long power; /* power to raise to */
|
||||
@@ -69,29 +79,29 @@ cpowi(COMPLEX *c, NUMBER *q)
|
||||
*/
|
||||
if (power <= 4) {
|
||||
switch ((int) (power * sign)) {
|
||||
case 0:
|
||||
return clink(&_cone_);
|
||||
case 1:
|
||||
return clink(c);
|
||||
case -1:
|
||||
return cinv(c);
|
||||
case 2:
|
||||
return csquare(c);
|
||||
case -2:
|
||||
tmp = csquare(c);
|
||||
res = cinv(tmp);
|
||||
comfree(tmp);
|
||||
return res;
|
||||
case 3:
|
||||
tmp = csquare(c);
|
||||
res = cmul(c, tmp);
|
||||
comfree(tmp);
|
||||
return res;
|
||||
case 4:
|
||||
tmp = csquare(c);
|
||||
res = csquare(tmp);
|
||||
comfree(tmp);
|
||||
return res;
|
||||
case 0:
|
||||
return clink(&_cone_);
|
||||
case 1:
|
||||
return clink(c);
|
||||
case -1:
|
||||
return c_inv(c);
|
||||
case 2:
|
||||
return c_square(c);
|
||||
case -2:
|
||||
tmp = c_square(c);
|
||||
res = c_inv(tmp);
|
||||
comfree(tmp);
|
||||
return res;
|
||||
case 3:
|
||||
tmp = c_square(c);
|
||||
res = c_mul(c, tmp);
|
||||
comfree(tmp);
|
||||
return res;
|
||||
case 4:
|
||||
tmp = c_square(c);
|
||||
res = c_square(tmp);
|
||||
comfree(tmp);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
/*
|
||||
@@ -102,26 +112,26 @@ cpowi(COMPLEX *c, NUMBER *q)
|
||||
while ((bit & power) == 0)
|
||||
bit >>= 1L;
|
||||
bit >>= 1L;
|
||||
res = csquare(c);
|
||||
res = c_square(c);
|
||||
if (bit & power) {
|
||||
tmp = cmul(res, c);
|
||||
tmp = c_mul(res, c);
|
||||
comfree(res);
|
||||
res = tmp;
|
||||
}
|
||||
bit >>= 1L;
|
||||
while (bit) {
|
||||
tmp = csquare(res);
|
||||
tmp = c_square(res);
|
||||
comfree(res);
|
||||
res = tmp;
|
||||
if (bit & power) {
|
||||
tmp = cmul(res, c);
|
||||
tmp = c_mul(res, c);
|
||||
comfree(res);
|
||||
res = tmp;
|
||||
}
|
||||
bit >>= 1L;
|
||||
}
|
||||
if (sign < 0) {
|
||||
tmp = cinv(res);
|
||||
tmp = c_inv(res);
|
||||
comfree(res);
|
||||
res = tmp;
|
||||
}
|
||||
@@ -134,7 +144,7 @@ cpowi(COMPLEX *c, NUMBER *q)
|
||||
* Type of rounding of each component specified by R as for qsqrt().
|
||||
*/
|
||||
COMPLEX *
|
||||
csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
||||
c_sqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
||||
{
|
||||
COMPLEX *r;
|
||||
NUMBER *es, *aes, *bes, *u, *v, qtemp;
|
||||
@@ -363,7 +373,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
|
||||
* Each component of the result is within the specified error.
|
||||
*/
|
||||
COMPLEX *
|
||||
croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
|
||||
c_root(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *r;
|
||||
NUMBER *a2pb2, *root, *tmp1, *tmp2, *epsilon2;
|
||||
@@ -376,7 +386,7 @@ croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
|
||||
if (cisone(c) || qisone(q))
|
||||
return clink(c);
|
||||
if (qistwo(q))
|
||||
return csqrt(c, epsilon, 24L);
|
||||
return c_sqrt(c, epsilon, 24L);
|
||||
if (cisreal(c) && !qisneg(c->real)) {
|
||||
tmp1 = qroot(c->real, q, epsilon);
|
||||
if (tmp1 == NULL)
|
||||
@@ -388,8 +398,8 @@ croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
|
||||
}
|
||||
/*
|
||||
* Calculate the root using the formula:
|
||||
* croot(a + bi, n) =
|
||||
* cpolar(qroot(a^2 + b^2, 2 * n), qatan2(b, a) / n).
|
||||
* c_root(a + bi, n) =
|
||||
* c_polar(qroot(a^2 + b^2, 2 * n), qatan2(b, a) / n).
|
||||
*/
|
||||
n = qilog2(epsilon);
|
||||
epsilon2 = qbitvalue(n - 4);
|
||||
@@ -415,7 +425,7 @@ croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
|
||||
qfree(epsilon2);
|
||||
tmp2 = qqdiv(tmp1, q);
|
||||
qfree(tmp1);
|
||||
r = cpolar(root, tmp2, epsilon);
|
||||
r = c_polar(root, tmp2, epsilon);
|
||||
qfree(root);
|
||||
qfree(tmp2);
|
||||
return r;
|
||||
@@ -428,7 +438,7 @@ croot(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
|
||||
* exp(a + bi) = exp(a) * (cos(b) + i * sin(b)).
|
||||
*/
|
||||
COMPLEX *
|
||||
cexp(COMPLEX *c, NUMBER *epsilon)
|
||||
c_exp(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *r;
|
||||
NUMBER *sin, *cos, *tmp1, *tmp2, *epsilon1;
|
||||
@@ -485,13 +495,13 @@ cexp(COMPLEX *c, NUMBER *epsilon)
|
||||
* ln(a + bi) = ln(a^2 + b^2) / 2 + i * atan2(b, a).
|
||||
*/
|
||||
COMPLEX *
|
||||
cln(COMPLEX *c, NUMBER *epsilon)
|
||||
c_ln(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *r;
|
||||
NUMBER *a2b2, *tmp1, *tmp2, *epsilon1;
|
||||
|
||||
if (ciszero(c)) {
|
||||
math_error("Logarithm of zero");
|
||||
math_error("logarithm of zero");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
if (cisone(c))
|
||||
@@ -519,6 +529,60 @@ cln(COMPLEX *c, NUMBER *epsilon)
|
||||
return r;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate base 10 logarithm by:
|
||||
*
|
||||
* log(c) = ln(c) / ln(10)
|
||||
*/
|
||||
COMPLEX *
|
||||
c_log(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
int need_new_cln_10 = TRUE; /* FALSE => use cached cln_10 value */
|
||||
COMPLEX *ln_c; /* ln(x) */
|
||||
COMPLEX *ret; /* base 10 logarithm of x */
|
||||
|
||||
/*
|
||||
* compute ln(c) first
|
||||
*/
|
||||
ln_c = c_ln(c, epsilon);
|
||||
/* log(1) == 0 */
|
||||
if (ciszero(ln_c)) {
|
||||
return ln_c;
|
||||
}
|
||||
|
||||
/*
|
||||
* save epsilon for ln(10) if needed
|
||||
*/
|
||||
if (cln_10_epsilon == NULL) {
|
||||
/* first time call */
|
||||
cln_10_epsilon = qcopy(epsilon);
|
||||
} else if (qcmp(cln_10_epsilon, epsilon) == FALSE) {
|
||||
/* replaced cacheed value with epsilon arg */
|
||||
qfree(cln_10_epsilon);
|
||||
cln_10_epsilon = qcopy(epsilon);
|
||||
} else if (cln_10 != NULL) {
|
||||
/* the previously computed ln(2) is OK to use */
|
||||
need_new_cln_10 = FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* compute ln(10) if needed
|
||||
*/
|
||||
if (need_new_cln_10 == TRUE) {
|
||||
if (cln_10 != NULL) {
|
||||
comfree(cln_10);
|
||||
}
|
||||
cln_10 = c_ln(&_cten_, cln_10_epsilon);
|
||||
}
|
||||
|
||||
/*
|
||||
* return ln(c) / ln(10)
|
||||
*/
|
||||
ret = c_div(ln_c, cln_10);
|
||||
comfree(ln_c);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Calculate the complex cosine within the specified accuracy.
|
||||
@@ -526,7 +590,7 @@ cln(COMPLEX *c, NUMBER *epsilon)
|
||||
* cos(x) = (exp(1i * x) + exp(-1i * x))/2;
|
||||
*/
|
||||
COMPLEX *
|
||||
ccos(COMPLEX *c, NUMBER *epsilon)
|
||||
c_cos(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *r, *ctmp1, *ctmp2, *ctmp3;
|
||||
NUMBER *epsilon1;
|
||||
@@ -545,7 +609,7 @@ ccos(COMPLEX *c, NUMBER *epsilon)
|
||||
ctmp1->real = neg ? qneg(c->imag) : qlink(c->imag);
|
||||
ctmp1->imag = neg ? qlink(c->real) : qneg(c->real);
|
||||
epsilon1 = qbitvalue(n - 2);
|
||||
ctmp2 = cexp(ctmp1, epsilon1);
|
||||
ctmp2 = c_exp(ctmp1, epsilon1);
|
||||
comfree(ctmp1);
|
||||
qfree(epsilon1);
|
||||
if (ctmp2 == NULL)
|
||||
@@ -554,11 +618,11 @@ ccos(COMPLEX *c, NUMBER *epsilon)
|
||||
comfree(ctmp2);
|
||||
return clink(&_czero_);
|
||||
}
|
||||
ctmp1 = cinv(ctmp2);
|
||||
ctmp3 = cadd(ctmp2, ctmp1);
|
||||
ctmp1 = c_inv(ctmp2);
|
||||
ctmp3 = c_add(ctmp2, ctmp1);
|
||||
comfree(ctmp1);
|
||||
comfree(ctmp2);
|
||||
ctmp1 = cscale(ctmp3, -1);
|
||||
ctmp1 = c_scale(ctmp3, -1);
|
||||
comfree(ctmp3);
|
||||
r = comalloc();
|
||||
qfree(r->real);
|
||||
@@ -576,7 +640,7 @@ ccos(COMPLEX *c, NUMBER *epsilon)
|
||||
* sin(x) = (exp(1i * x) - exp(-i1*x))/(2i).
|
||||
*/
|
||||
COMPLEX *
|
||||
csin(COMPLEX *c, NUMBER *epsilon)
|
||||
c_sin(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *r, *ctmp1, *ctmp2, *ctmp3;
|
||||
NUMBER *qtmp, *epsilon1;
|
||||
@@ -597,7 +661,7 @@ csin(COMPLEX *c, NUMBER *epsilon)
|
||||
ctmp1->real = neg ? qneg(c->imag) : qlink(c->imag);
|
||||
ctmp1->imag = neg ? qlink(c->real) : qneg(c->real);
|
||||
epsilon1 = qbitvalue(n - 2);
|
||||
ctmp2 = cexp(ctmp1, epsilon1);
|
||||
ctmp2 = c_exp(ctmp1, epsilon1);
|
||||
comfree(ctmp1);
|
||||
qfree(epsilon1);
|
||||
if (ctmp2 == NULL)
|
||||
@@ -606,11 +670,11 @@ csin(COMPLEX *c, NUMBER *epsilon)
|
||||
comfree(ctmp2);
|
||||
return clink(&_czero_);
|
||||
}
|
||||
ctmp1 = cinv(ctmp2);
|
||||
ctmp3 = csub(ctmp2, ctmp1);
|
||||
ctmp1 = c_inv(ctmp2);
|
||||
ctmp3 = c_sub(ctmp2, ctmp1);
|
||||
comfree(ctmp1);
|
||||
comfree(ctmp2);
|
||||
ctmp1 = cscale(ctmp3, -1);
|
||||
ctmp1 = c_scale(ctmp3, -1);
|
||||
comfree(ctmp3);
|
||||
r = comalloc();
|
||||
qtmp = neg ? qlink(ctmp1->imag) : qneg(ctmp1->imag);
|
||||
@@ -627,105 +691,105 @@ csin(COMPLEX *c, NUMBER *epsilon)
|
||||
|
||||
|
||||
COMPLEX *
|
||||
ccosh(COMPLEX *c, NUMBER *epsilon)
|
||||
c_cosh(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2, *tmp3;
|
||||
|
||||
tmp1 = cexp(c, epsilon);
|
||||
tmp1 = c_exp(c, epsilon);
|
||||
if (tmp1 == NULL)
|
||||
return NULL;
|
||||
tmp2 = cneg(c);
|
||||
tmp3 = cexp(tmp2, epsilon);
|
||||
tmp2 = c_neg(c);
|
||||
tmp3 = c_exp(tmp2, epsilon);
|
||||
comfree(tmp2);
|
||||
if (tmp3 == NULL)
|
||||
return NULL;
|
||||
tmp2 = cadd(tmp1, tmp3);
|
||||
tmp2 = c_add(tmp1, tmp3);
|
||||
comfree(tmp1);
|
||||
comfree(tmp3);
|
||||
tmp1 = cscale(tmp2, -1);
|
||||
tmp1 = c_scale(tmp2, -1);
|
||||
comfree(tmp2);
|
||||
return tmp1;
|
||||
}
|
||||
|
||||
|
||||
COMPLEX *
|
||||
csinh(COMPLEX *c, NUMBER *epsilon)
|
||||
c_sinh(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2, *tmp3;
|
||||
|
||||
tmp1 = cexp(c, epsilon);
|
||||
tmp1 = c_exp(c, epsilon);
|
||||
if (tmp1 == NULL)
|
||||
return NULL;
|
||||
tmp2 = cneg(c);
|
||||
tmp3 = cexp(tmp2, epsilon);
|
||||
tmp2 = c_neg(c);
|
||||
tmp3 = c_exp(tmp2, epsilon);
|
||||
comfree(tmp2);
|
||||
if (tmp3 == NULL)
|
||||
return NULL;
|
||||
tmp2 = csub(tmp1, tmp3);
|
||||
tmp2 = c_sub(tmp1, tmp3);
|
||||
comfree(tmp1);
|
||||
comfree(tmp3);
|
||||
tmp1 = cscale(tmp2, -1);
|
||||
tmp1 = c_scale(tmp2, -1);
|
||||
comfree(tmp2);
|
||||
return tmp1;
|
||||
}
|
||||
|
||||
|
||||
COMPLEX *
|
||||
casin(COMPLEX *c, NUMBER *epsilon)
|
||||
c_asin(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2;
|
||||
|
||||
tmp1 = cmul(&_conei_, c);
|
||||
tmp2 = casinh(tmp1, epsilon);
|
||||
tmp1 = c_mul(&_conei_, c);
|
||||
tmp2 = c_asinh(tmp1, epsilon);
|
||||
comfree(tmp1);
|
||||
tmp1 = cdiv(tmp2, &_conei_);
|
||||
tmp1 = c_div(tmp2, &_conei_);
|
||||
comfree(tmp2);
|
||||
return tmp1;
|
||||
}
|
||||
|
||||
|
||||
COMPLEX *
|
||||
cacos(COMPLEX *c, NUMBER *epsilon)
|
||||
c_acos(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2;
|
||||
|
||||
tmp1 = csquare(c);
|
||||
tmp2 = csub(&_cone_, tmp1);
|
||||
tmp1 = c_square(c);
|
||||
tmp2 = c_sub(&_cone_, tmp1);
|
||||
comfree(tmp1);
|
||||
tmp1 = csqrt(tmp2, epsilon, 24);
|
||||
tmp1 = c_sqrt(tmp2, epsilon, 24);
|
||||
comfree(tmp2);
|
||||
tmp2 = cmul(&_conei_, tmp1);
|
||||
tmp2 = c_mul(&_conei_, tmp1);
|
||||
comfree(tmp1);
|
||||
tmp1 = cadd(c, tmp2);
|
||||
tmp1 = c_add(c, tmp2);
|
||||
comfree(tmp2);
|
||||
tmp2 = cln(tmp1, epsilon);
|
||||
tmp2 = c_ln(tmp1, epsilon);
|
||||
comfree(tmp1);
|
||||
tmp1 = cdiv(tmp2, &_conei_);
|
||||
tmp1 = c_div(tmp2, &_conei_);
|
||||
comfree(tmp2);
|
||||
return tmp1;
|
||||
}
|
||||
|
||||
|
||||
COMPLEX *
|
||||
casinh(COMPLEX *c, NUMBER *epsilon)
|
||||
c_asinh(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2, *tmp3;
|
||||
BOOL neg;
|
||||
|
||||
neg = qisneg(c->real);
|
||||
tmp1 = neg ? cneg(c) : clink(c);
|
||||
tmp2 = csquare(tmp1);
|
||||
tmp3 = cadd(&_cone_, tmp2);
|
||||
tmp1 = neg ? c_neg(c) : clink(c);
|
||||
tmp2 = c_square(tmp1);
|
||||
tmp3 = c_add(&_cone_, tmp2);
|
||||
comfree(tmp2);
|
||||
tmp2 = csqrt(tmp3, epsilon, 24);
|
||||
tmp2 = c_sqrt(tmp3, epsilon, 24);
|
||||
comfree(tmp3);
|
||||
tmp3 = cadd(tmp2, tmp1);
|
||||
tmp3 = c_add(tmp2, tmp1);
|
||||
comfree(tmp1);
|
||||
comfree(tmp2);
|
||||
tmp1 = cln(tmp3, epsilon);
|
||||
tmp1 = c_ln(tmp3, epsilon);
|
||||
comfree(tmp3);
|
||||
if (neg) {
|
||||
tmp2 = cneg(tmp1);
|
||||
tmp2 = c_neg(tmp1);
|
||||
comfree(tmp1);
|
||||
return tmp2;
|
||||
}
|
||||
@@ -734,153 +798,153 @@ casinh(COMPLEX *c, NUMBER *epsilon)
|
||||
|
||||
|
||||
COMPLEX *
|
||||
cacosh(COMPLEX *c, NUMBER *epsilon)
|
||||
c_acosh(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2;
|
||||
|
||||
tmp1 = csquare(c);
|
||||
tmp2 = csub(tmp1, &_cone_);
|
||||
tmp1 = c_square(c);
|
||||
tmp2 = c_sub(tmp1, &_cone_);
|
||||
comfree(tmp1);
|
||||
tmp1 = csqrt(tmp2, epsilon, 24);
|
||||
tmp1 = c_sqrt(tmp2, epsilon, 24);
|
||||
comfree(tmp2);
|
||||
tmp2 = cadd(c, tmp1);
|
||||
tmp2 = c_add(c, tmp1);
|
||||
comfree(tmp1);
|
||||
tmp1 = cln(tmp2, epsilon);
|
||||
tmp1 = c_ln(tmp2, epsilon);
|
||||
comfree(tmp2);
|
||||
return tmp1;
|
||||
}
|
||||
|
||||
|
||||
COMPLEX *
|
||||
catan(COMPLEX *c, NUMBER *epsilon)
|
||||
c_atan(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2, *tmp3;
|
||||
|
||||
if (qiszero(c->real) && qisunit(c->imag))
|
||||
return NULL;
|
||||
tmp1 = csub(&_conei_, c);
|
||||
tmp2 = cadd(&_conei_, c);
|
||||
tmp3 = cdiv(tmp1, tmp2);
|
||||
tmp1 = c_sub(&_conei_, c);
|
||||
tmp2 = c_add(&_conei_, c);
|
||||
tmp3 = c_div(tmp1, tmp2);
|
||||
comfree(tmp1);
|
||||
comfree(tmp2);
|
||||
tmp1 = cln(tmp3, epsilon);
|
||||
tmp1 = c_ln(tmp3, epsilon);
|
||||
comfree(tmp3);
|
||||
tmp2 = cscale(tmp1, -1);
|
||||
tmp2 = c_scale(tmp1, -1);
|
||||
comfree(tmp1);
|
||||
tmp1 = cdiv(tmp2, &_conei_);
|
||||
tmp1 = c_div(tmp2, &_conei_);
|
||||
comfree(tmp2);
|
||||
return tmp1;
|
||||
}
|
||||
|
||||
|
||||
COMPLEX *
|
||||
cacot(COMPLEX *c, NUMBER *epsilon)
|
||||
c_acot(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2, *tmp3;
|
||||
|
||||
if (qiszero(c->real) && qisunit(c->imag))
|
||||
return NULL;
|
||||
tmp1 = cadd(c, &_conei_);
|
||||
tmp2 = csub(c, &_conei_);
|
||||
tmp3 = cdiv(tmp1, tmp2);
|
||||
tmp1 = c_add(c, &_conei_);
|
||||
tmp2 = c_sub(c, &_conei_);
|
||||
tmp3 = c_div(tmp1, tmp2);
|
||||
comfree(tmp1);
|
||||
comfree(tmp2);
|
||||
tmp1 = cln(tmp3, epsilon);
|
||||
tmp1 = c_ln(tmp3, epsilon);
|
||||
comfree(tmp3);
|
||||
tmp2 = cscale(tmp1, -1);
|
||||
tmp2 = c_scale(tmp1, -1);
|
||||
comfree(tmp1);
|
||||
tmp1 = cdiv(tmp2, &_conei_);
|
||||
tmp1 = c_div(tmp2, &_conei_);
|
||||
comfree(tmp2);
|
||||
return tmp1;
|
||||
}
|
||||
|
||||
COMPLEX *
|
||||
casec(COMPLEX *c, NUMBER *epsilon)
|
||||
c_asec(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2;
|
||||
|
||||
tmp1 = cinv(c);
|
||||
tmp2 = cacos(tmp1, epsilon);
|
||||
tmp1 = c_inv(c);
|
||||
tmp2 = c_acos(tmp1, epsilon);
|
||||
comfree(tmp1);
|
||||
return tmp2;
|
||||
}
|
||||
|
||||
COMPLEX *
|
||||
cacsc(COMPLEX *c, NUMBER *epsilon)
|
||||
c_acsc(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2;
|
||||
|
||||
tmp1 = cinv(c);
|
||||
tmp2 = casin(tmp1, epsilon);
|
||||
tmp1 = c_inv(c);
|
||||
tmp2 = c_asin(tmp1, epsilon);
|
||||
comfree(tmp1);
|
||||
return tmp2;
|
||||
}
|
||||
|
||||
|
||||
COMPLEX *
|
||||
catanh(COMPLEX *c, NUMBER *epsilon)
|
||||
c_atanh(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2, *tmp3;
|
||||
|
||||
if (qiszero(c->imag) && qisunit(c->real))
|
||||
return NULL;
|
||||
tmp1 = cadd(&_cone_, c);
|
||||
tmp2 = csub(&_cone_, c);
|
||||
tmp3 = cdiv(tmp1, tmp2);
|
||||
tmp1 = c_add(&_cone_, c);
|
||||
tmp2 = c_sub(&_cone_, c);
|
||||
tmp3 = c_div(tmp1, tmp2);
|
||||
comfree(tmp1);
|
||||
comfree(tmp2);
|
||||
tmp1 = cln(tmp3, epsilon);
|
||||
tmp1 = c_ln(tmp3, epsilon);
|
||||
comfree(tmp3);
|
||||
tmp2 = cscale(tmp1, -1);
|
||||
tmp2 = c_scale(tmp1, -1);
|
||||
comfree(tmp1);
|
||||
return tmp2;
|
||||
}
|
||||
|
||||
|
||||
COMPLEX *
|
||||
cacoth(COMPLEX *c, NUMBER *epsilon)
|
||||
c_acoth(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2, *tmp3;
|
||||
|
||||
if (qiszero(c->imag) && qisunit(c->real))
|
||||
return NULL;
|
||||
tmp1 = cadd(c, &_cone_);
|
||||
tmp2 = csub(c, &_cone_);
|
||||
tmp3 = cdiv(tmp1, tmp2);
|
||||
tmp1 = c_add(c, &_cone_);
|
||||
tmp2 = c_sub(c, &_cone_);
|
||||
tmp3 = c_div(tmp1, tmp2);
|
||||
comfree(tmp1);
|
||||
comfree(tmp2);
|
||||
tmp1 = cln(tmp3, epsilon);
|
||||
tmp1 = c_ln(tmp3, epsilon);
|
||||
comfree(tmp3);
|
||||
tmp2 = cscale(tmp1, -1);
|
||||
tmp2 = c_scale(tmp1, -1);
|
||||
comfree(tmp1);
|
||||
return tmp2;
|
||||
}
|
||||
|
||||
COMPLEX *
|
||||
casech(COMPLEX *c, NUMBER *epsilon)
|
||||
c_asech(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2;
|
||||
|
||||
tmp1 = cinv(c);
|
||||
tmp2 = cacosh(tmp1, epsilon);
|
||||
tmp1 = c_inv(c);
|
||||
tmp2 = c_acosh(tmp1, epsilon);
|
||||
comfree(tmp1);
|
||||
return tmp2;
|
||||
}
|
||||
|
||||
COMPLEX *
|
||||
cacsch(COMPLEX *c, NUMBER *epsilon)
|
||||
c_acsch(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2;
|
||||
|
||||
tmp1 = cinv(c);
|
||||
tmp2 = casinh(tmp1, epsilon);
|
||||
tmp1 = c_inv(c);
|
||||
tmp2 = c_asinh(tmp1, epsilon);
|
||||
comfree(tmp1);
|
||||
return tmp2;
|
||||
}
|
||||
|
||||
|
||||
COMPLEX *
|
||||
cgd(COMPLEX *c, NUMBER *epsilon)
|
||||
c_gd(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2, *tmp3;
|
||||
NUMBER *q1, *q2;
|
||||
@@ -947,30 +1011,30 @@ cgd(COMPLEX *c, NUMBER *epsilon)
|
||||
return tmp1;
|
||||
}
|
||||
neg = qisneg(c->real);
|
||||
tmp1 = neg ? cneg(c) : clink(c);
|
||||
tmp2 = cexp(tmp1, epsilon);
|
||||
tmp1 = neg ? c_neg(c) : clink(c);
|
||||
tmp2 = c_exp(tmp1, epsilon);
|
||||
comfree(tmp1);
|
||||
if (tmp2 == NULL)
|
||||
return NULL;
|
||||
tmp1 = cmul(&_conei_, tmp2);
|
||||
tmp3 = cadd(&_conei_, tmp2);
|
||||
tmp1 = c_mul(&_conei_, tmp2);
|
||||
tmp3 = c_add(&_conei_, tmp2);
|
||||
comfree(tmp2);
|
||||
tmp2 = cadd(tmp1, &_cone_);
|
||||
tmp2 = c_add(tmp1, &_cone_);
|
||||
comfree(tmp1);
|
||||
if (ciszero(tmp2) || ciszero(tmp3)) {
|
||||
comfree(tmp2);
|
||||
comfree(tmp3);
|
||||
return NULL;
|
||||
}
|
||||
tmp1 = cdiv(tmp2, tmp3);
|
||||
tmp1 = c_div(tmp2, tmp3);
|
||||
comfree(tmp2);
|
||||
comfree(tmp3);
|
||||
tmp2 = cln(tmp1, epsilon);
|
||||
tmp2 = c_ln(tmp1, epsilon);
|
||||
comfree(tmp1);
|
||||
tmp1 = cdiv(tmp2, &_conei_);
|
||||
tmp1 = c_div(tmp2, &_conei_);
|
||||
comfree(tmp2);
|
||||
if (neg) {
|
||||
tmp2 = cneg(tmp1);
|
||||
tmp2 = c_neg(tmp1);
|
||||
comfree(tmp1);
|
||||
return tmp2;
|
||||
}
|
||||
@@ -979,16 +1043,16 @@ cgd(COMPLEX *c, NUMBER *epsilon)
|
||||
|
||||
|
||||
COMPLEX *
|
||||
cagd(COMPLEX *c, NUMBER *epsilon)
|
||||
c_agd(COMPLEX *c, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *tmp1, *tmp2;
|
||||
|
||||
tmp1 = cmul(&_conei_, c);
|
||||
tmp2 = cgd(tmp1, epsilon);
|
||||
tmp1 = c_mul(&_conei_, c);
|
||||
tmp2 = c_gd(tmp1, epsilon);
|
||||
comfree(tmp1);
|
||||
if (tmp2 == NULL)
|
||||
return NULL;
|
||||
tmp1 = cdiv(tmp2, &_conei_);
|
||||
tmp1 = c_div(tmp2, &_conei_);
|
||||
comfree(tmp2);
|
||||
return tmp1;
|
||||
}
|
||||
@@ -1000,7 +1064,7 @@ cagd(COMPLEX *c, NUMBER *epsilon)
|
||||
* q1 * cos(q2) + q1 * sin(q2) * i.
|
||||
*/
|
||||
COMPLEX *
|
||||
cpolar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
|
||||
c_polar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *r;
|
||||
NUMBER *tmp, *cos, *sin;
|
||||
@@ -1042,7 +1106,7 @@ cpolar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
|
||||
* specified error.
|
||||
*/
|
||||
COMPLEX *
|
||||
cpower(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon)
|
||||
c_power(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon)
|
||||
{
|
||||
COMPLEX *ctmp1, *ctmp2;
|
||||
long k1, k2, k, m1, m2, m, n;
|
||||
@@ -1099,11 +1163,11 @@ cpower(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon)
|
||||
if (k < n)
|
||||
return clink(&_czero_);
|
||||
epsilon1 = qbitvalue(n - k - m - 2);
|
||||
ctmp1 = cln(c1, epsilon1);
|
||||
ctmp1 = c_ln(c1, epsilon1);
|
||||
qfree(epsilon1);
|
||||
ctmp2 = cmul(ctmp1, c2);
|
||||
ctmp2 = c_mul(ctmp1, c2);
|
||||
comfree(ctmp1);
|
||||
ctmp1 = cexp(ctmp2, epsilon);
|
||||
ctmp1 = c_exp(ctmp2, epsilon);
|
||||
comfree(ctmp2);
|
||||
return ctmp1;
|
||||
}
|
||||
@@ -1165,7 +1229,7 @@ cprintfr(COMPLEX *c)
|
||||
|
||||
|
||||
NUMBER *
|
||||
cilog(COMPLEX *c, ZVALUE base)
|
||||
c_ilog(COMPLEX *c, ZVALUE base)
|
||||
{
|
||||
NUMBER *qr, *qi;
|
||||
|
||||
|
52
commath.c
52
commath.c
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: commath.c,v 29.2 2000/06/07 14:02:13 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: commath.c,v 29.4 2005/10/18 10:43:49 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/commath.c,v $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:48:10
|
||||
@@ -42,7 +42,7 @@ static COMPLEX _cnegone_ = { &_qnegone_, &_qzero_, 1 };
|
||||
* Add two complex numbers.
|
||||
*/
|
||||
COMPLEX *
|
||||
cadd(COMPLEX *c1, COMPLEX *c2)
|
||||
c_add(COMPLEX *c1, COMPLEX *c2)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -67,7 +67,7 @@ cadd(COMPLEX *c1, COMPLEX *c2)
|
||||
* Subtract two complex numbers.
|
||||
*/
|
||||
COMPLEX *
|
||||
csub(COMPLEX *c1, COMPLEX *c2)
|
||||
c_sub(COMPLEX *c1, COMPLEX *c2)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -98,7 +98,7 @@ csub(COMPLEX *c1, COMPLEX *c2)
|
||||
* Then (a+bi) * (c+di) = (q2 - q3) + (q1 - q2 - q3)i.
|
||||
*/
|
||||
COMPLEX *
|
||||
cmul(COMPLEX *c1, COMPLEX *c2)
|
||||
c_mul(COMPLEX *c1, COMPLEX *c2)
|
||||
{
|
||||
COMPLEX *r;
|
||||
NUMBER *q1, *q2, *q3, *q4;
|
||||
@@ -110,9 +110,9 @@ cmul(COMPLEX *c1, COMPLEX *c2)
|
||||
if (cisone(c2))
|
||||
return clink(c1);
|
||||
if (cisreal(c2))
|
||||
return cmulq(c1, c2->real);
|
||||
return c_mulq(c1, c2->real);
|
||||
if (cisreal(c1))
|
||||
return cmulq(c2, c1->real);
|
||||
return c_mulq(c2, c1->real);
|
||||
/*
|
||||
* Need to do the full calculation.
|
||||
*/
|
||||
@@ -141,7 +141,7 @@ cmul(COMPLEX *c1, COMPLEX *c2)
|
||||
* Square a complex number.
|
||||
*/
|
||||
COMPLEX *
|
||||
csquare(COMPLEX *c)
|
||||
c_square(COMPLEX *c)
|
||||
{
|
||||
COMPLEX *r;
|
||||
NUMBER *q1, *q2;
|
||||
@@ -183,7 +183,7 @@ csquare(COMPLEX *c)
|
||||
* Divide two complex numbers.
|
||||
*/
|
||||
COMPLEX *
|
||||
cdiv(COMPLEX *c1, COMPLEX *c2)
|
||||
c_div(COMPLEX *c1, COMPLEX *c2)
|
||||
{
|
||||
COMPLEX *r;
|
||||
NUMBER *q1, *q2, *q3, *den;
|
||||
@@ -254,7 +254,7 @@ cdiv(COMPLEX *c1, COMPLEX *c2)
|
||||
* Invert a complex number.
|
||||
*/
|
||||
COMPLEX *
|
||||
cinv(COMPLEX *c)
|
||||
c_inv(COMPLEX *c)
|
||||
{
|
||||
COMPLEX *r;
|
||||
NUMBER *q1, *q2, *den;
|
||||
@@ -296,7 +296,7 @@ cinv(COMPLEX *c)
|
||||
* Negate a complex number.
|
||||
*/
|
||||
COMPLEX *
|
||||
cneg(COMPLEX *c)
|
||||
c_neg(COMPLEX *c)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -320,7 +320,7 @@ cneg(COMPLEX *c)
|
||||
* This means take the integer part of both components.
|
||||
*/
|
||||
COMPLEX *
|
||||
cint(COMPLEX *c)
|
||||
c_int(COMPLEX *c)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -340,7 +340,7 @@ cint(COMPLEX *c)
|
||||
* This means take the fractional part of both components.
|
||||
*/
|
||||
COMPLEX *
|
||||
cfrac(COMPLEX *c)
|
||||
c_frac(COMPLEX *c)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -360,7 +360,7 @@ cfrac(COMPLEX *c)
|
||||
* This negates the complex part.
|
||||
*/
|
||||
COMPLEX *
|
||||
cconj(COMPLEX *c)
|
||||
c_conj(COMPLEX *c)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -381,7 +381,7 @@ cconj(COMPLEX *c)
|
||||
* Return the real part of a complex number.
|
||||
*/
|
||||
COMPLEX *
|
||||
creal(COMPLEX *c)
|
||||
c_real(COMPLEX *c)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -400,7 +400,7 @@ creal(COMPLEX *c)
|
||||
* Return the imaginary part of a complex number as a real.
|
||||
*/
|
||||
COMPLEX *
|
||||
cimag(COMPLEX *c)
|
||||
c_imag(COMPLEX *c)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -417,7 +417,7 @@ cimag(COMPLEX *c)
|
||||
* Add a real number to a complex number.
|
||||
*/
|
||||
COMPLEX *
|
||||
caddq(COMPLEX *c, NUMBER *q)
|
||||
c_addq(COMPLEX *c, NUMBER *q)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -436,7 +436,7 @@ caddq(COMPLEX *c, NUMBER *q)
|
||||
* Subtract a real number from a complex number.
|
||||
*/
|
||||
COMPLEX *
|
||||
csubq(COMPLEX *c, NUMBER *q)
|
||||
c_subq(COMPLEX *c, NUMBER *q)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -456,7 +456,7 @@ csubq(COMPLEX *c, NUMBER *q)
|
||||
* number of bits. Negative values shift to the right.
|
||||
*/
|
||||
COMPLEX *
|
||||
cshift(COMPLEX *c, long n)
|
||||
c_shift(COMPLEX *c, long n)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -475,7 +475,7 @@ cshift(COMPLEX *c, long n)
|
||||
* Scale a complex number by a power of two.
|
||||
*/
|
||||
COMPLEX *
|
||||
cscale(COMPLEX *c, long n)
|
||||
c_scale(COMPLEX *c, long n)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -494,7 +494,7 @@ cscale(COMPLEX *c, long n)
|
||||
* Multiply a complex number by a real number.
|
||||
*/
|
||||
COMPLEX *
|
||||
cmulq(COMPLEX *c, NUMBER *q)
|
||||
c_mulq(COMPLEX *c, NUMBER *q)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -503,7 +503,7 @@ cmulq(COMPLEX *c, NUMBER *q)
|
||||
if (qisone(q))
|
||||
return clink(c);
|
||||
if (qisnegone(q))
|
||||
return cneg(c);
|
||||
return c_neg(c);
|
||||
r = comalloc();
|
||||
qfree(r->real);
|
||||
qfree(r->imag);
|
||||
@@ -517,7 +517,7 @@ cmulq(COMPLEX *c, NUMBER *q)
|
||||
* Divide a complex number by a real number.
|
||||
*/
|
||||
COMPLEX *
|
||||
cdivq(COMPLEX *c, NUMBER *q)
|
||||
c_divq(COMPLEX *c, NUMBER *q)
|
||||
{
|
||||
COMPLEX *r;
|
||||
|
||||
@@ -528,7 +528,7 @@ cdivq(COMPLEX *c, NUMBER *q)
|
||||
if (qisone(q))
|
||||
return clink(c);
|
||||
if (qisnegone(q))
|
||||
return cneg(c);
|
||||
return c_neg(c);
|
||||
r = comalloc();
|
||||
qfree(r->real);
|
||||
qfree(r->imag);
|
||||
@@ -564,7 +564,7 @@ qqtoc(NUMBER *q1, NUMBER *q2)
|
||||
* and TRUE if they differ.
|
||||
*/
|
||||
BOOL
|
||||
ccmp(COMPLEX *c1, COMPLEX *c2)
|
||||
c_cmp(COMPLEX *c1, COMPLEX *c2)
|
||||
{
|
||||
BOOL i;
|
||||
|
||||
@@ -581,7 +581,7 @@ ccmp(COMPLEX *c1, COMPLEX *c2)
|
||||
* imaginary parts of the two numbers.
|
||||
*/
|
||||
COMPLEX *
|
||||
crel(COMPLEX *c1, COMPLEX *c2)
|
||||
c_rel(COMPLEX *c1, COMPLEX *c2)
|
||||
{
|
||||
COMPLEX *c;
|
||||
|
||||
|
239
config.c
239
config.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* config - configuration routines
|
||||
*
|
||||
* Copyright (C) 1999 David I. Bell and Landon Curt Noll
|
||||
* Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
|
||||
*
|
||||
* Primary author: David I. Bell
|
||||
*
|
||||
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.7 $
|
||||
* @(#) $Id: config.c,v 29.7 2001/04/25 07:15:22 chongo Exp $
|
||||
* @(#) $Revision: 29.21 $
|
||||
* @(#) $Id: config.c,v 29.21 2006/06/20 10:25:45 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/config.c,v $
|
||||
*
|
||||
* Under source code control: 1991/07/20 00:21:56
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "nametype.h"
|
||||
#include "config.h"
|
||||
#include "string.h"
|
||||
#include "custom.h"
|
||||
|
||||
#include "have_strdup.h"
|
||||
#if !defined(HAVE_STRDUP)
|
||||
@@ -51,6 +52,7 @@
|
||||
NAMETYPE configs[] = {
|
||||
{"all", CONFIG_ALL},
|
||||
{"mode", CONFIG_MODE},
|
||||
{"mode2", CONFIG_MODE2},
|
||||
{"display", CONFIG_DISPLAY},
|
||||
{"epsilon", CONFIG_EPSILON},
|
||||
/*epsilonprec -- tied to epsilon not a configuration type*/
|
||||
@@ -91,7 +93,13 @@ NAMETYPE configs[] = {
|
||||
{"program", CONFIG_PROGRAM},
|
||||
{"basename", CONFIG_BASENAME},
|
||||
{"windows", CONFIG_WINDOWS},
|
||||
{"cygwin", CONFIG_CYGWIN},
|
||||
{"compile_custom", CONFIG_COMPILE_CUSTOM},
|
||||
{"allow_custom", CONFIG_ALLOW_CUSTOM},
|
||||
{"version", CONFIG_VERSION},
|
||||
{"baseb", CONFIG_BASEB},
|
||||
{"redecl_warn", CONFIG_REDECL_WARN},
|
||||
{"dupvar_warn", CONFIG_DUPVAR_WARN},
|
||||
{NULL, 0}
|
||||
};
|
||||
|
||||
@@ -101,6 +109,7 @@ NAMETYPE configs[] = {
|
||||
*/
|
||||
CONFIG oldstd = { /* backward compatible standard configuration */
|
||||
MODE_INITIAL, /* current output mode */
|
||||
MODE2_INITIAL, /* current secondary output mode */
|
||||
20, /* current output digits for float or exp */
|
||||
NULL, /* loaded in at startup - default error for real functions */
|
||||
EPSILONPREC_DEFAULT, /* binary precision of epsilon */
|
||||
@@ -142,13 +151,28 @@ CONFIG oldstd = { /* backward compatible standard configuration */
|
||||
#else
|
||||
FALSE, /* congrats, you are not using windows */
|
||||
#endif
|
||||
NULL /* version */
|
||||
#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 */
|
||||
BASEB, /* base for calculations */
|
||||
TRUE, /* warn when redeclaring */
|
||||
TRUE, /* warn when variable names collide */
|
||||
};
|
||||
CONFIG newstd = { /* new non-backward compatible configuration */
|
||||
MODE_INITIAL, /* current output mode */
|
||||
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 */
|
||||
NEW_EPSILONPREC_DEFAULT, /* binary precision of epsilon */
|
||||
EPSILONPREC_DEFAULT, /* binary precision of epsilon */
|
||||
FALSE, /* tracing flags */
|
||||
MAXPRINT_DEFAULT, /* number of elements to print */
|
||||
MUL_ALG2, /* size of number to use multiply alg 2 */
|
||||
@@ -158,7 +182,7 @@ CONFIG newstd = { /* new non-backward compatible configuration */
|
||||
TRUE, /* ok to print a tilde on approximations */
|
||||
TRUE, /* ok to print tab before numeric values */
|
||||
0, /* quomod() default rounding mode */
|
||||
0, /* quotient // default rounding mode */
|
||||
2, /* quotient // default rounding mode */
|
||||
0, /* mod % default rounding mode */
|
||||
24, /* sqrt() default rounding mode */
|
||||
24, /* appr() default rounding mode */
|
||||
@@ -167,7 +191,7 @@ CONFIG newstd = { /* new non-backward compatible configuration */
|
||||
24, /* output default rounding mode */
|
||||
24, /* round()/bround() default rounding mode */
|
||||
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 */
|
||||
"; ", /* normal prompt */
|
||||
";; ", /* prompt when inside multi-line input */
|
||||
@@ -187,7 +211,21 @@ CONFIG newstd = { /* new non-backward compatible configuration */
|
||||
#else
|
||||
FALSE, /* congrats, you are not using windows */
|
||||
#endif
|
||||
NULL /* version */
|
||||
#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 */
|
||||
BASEB, /* base for calculations */
|
||||
TRUE, /* warn when redeclaring */
|
||||
TRUE, /* warn when variable names collide */
|
||||
};
|
||||
CONFIG *conf = NULL; /* loaded in at startup - current configuration */
|
||||
|
||||
@@ -212,6 +250,7 @@ static NAMETYPE modes[] = {
|
||||
{"oct", MODE_OCTAL},
|
||||
{"binary", MODE_BINARY},
|
||||
{"bin", MODE_BINARY},
|
||||
{"off", MODE2_OFF},
|
||||
{NULL, 0}
|
||||
};
|
||||
|
||||
@@ -402,7 +441,7 @@ setconfig(int type, VALUE *vp)
|
||||
NUMBER *q;
|
||||
CONFIG *newconf; /* new configuration to set */
|
||||
long temp;
|
||||
LEN len;
|
||||
LEN len = 0;
|
||||
char *p;
|
||||
|
||||
switch (type) {
|
||||
@@ -467,6 +506,19 @@ setconfig(int type, VALUE *vp)
|
||||
math_setmode((int) temp);
|
||||
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:
|
||||
if (vp->v_type != V_NUM) {
|
||||
math_error("Non-numeric for epsilon");
|
||||
@@ -484,7 +536,7 @@ setconfig(int type, VALUE *vp)
|
||||
break;
|
||||
|
||||
case CONFIG_MUL2:
|
||||
if (getlen(vp, &len)) {
|
||||
if (getlen(vp, &len) || len < 0 || len == 1) {
|
||||
math_error("Bad value for mul2");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
@@ -494,7 +546,7 @@ setconfig(int type, VALUE *vp)
|
||||
break;
|
||||
|
||||
case CONFIG_SQ2:
|
||||
if (getlen(vp, &len)) {
|
||||
if (getlen(vp, &len) || len < 0 || len == 1) {
|
||||
math_error("Bad value for sq2");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
@@ -504,7 +556,7 @@ setconfig(int type, VALUE *vp)
|
||||
break;
|
||||
|
||||
case CONFIG_POW2:
|
||||
if (getlen(vp, &len)) {
|
||||
if (getlen(vp, &len) || len < 0 || len == 1) {
|
||||
math_error("Bad value for pow2");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
@@ -514,7 +566,7 @@ setconfig(int type, VALUE *vp)
|
||||
break;
|
||||
|
||||
case CONFIG_REDC2:
|
||||
if (getlen(vp, &len)) {
|
||||
if (getlen(vp, &len) || len < 0 || len == 1) {
|
||||
math_error("Bad value for redc2");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
@@ -679,7 +731,7 @@ setconfig(int type, VALUE *vp)
|
||||
math_error("Cannot duplicate new prompt");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
strcpy(p, vp->v_str->s_str);
|
||||
strncpy(p, vp->v_str->s_str, vp->v_str->s_len + 1);
|
||||
free(conf->prompt1);
|
||||
conf->prompt1 = p;
|
||||
break;
|
||||
@@ -694,7 +746,7 @@ setconfig(int type, VALUE *vp)
|
||||
math_error("Cannot duplicate new more prompt");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
strcpy(p, vp->v_str->s_str);
|
||||
strncpy(p, vp->v_str->s_str, vp->v_str->s_len + 1);
|
||||
free(conf->prompt2);
|
||||
conf->prompt2 = p;
|
||||
break;
|
||||
@@ -840,10 +892,54 @@ setconfig(int type, VALUE *vp)
|
||||
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*/
|
||||
|
||||
case CONFIG_VERSION:
|
||||
math_error("The version config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
|
||||
case CONFIG_BASEB:
|
||||
math_error("The baseb config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
|
||||
case CONFIG_REDECL_WARN:
|
||||
if (vp->v_type == V_NUM) {
|
||||
q = vp->v_num;
|
||||
conf->redecl_warn = !qiszero(q);
|
||||
} else if (vp->v_type == V_STR) {
|
||||
temp = lookup_long(truth, vp->v_str->s_str);
|
||||
if (temp < 0) {
|
||||
math_error("Illegal truth value for redecl_warn");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
conf->redecl_warn = (int)temp;
|
||||
}
|
||||
break;
|
||||
|
||||
case CONFIG_DUPVAR_WARN:
|
||||
if (vp->v_type == V_NUM) {
|
||||
q = vp->v_num;
|
||||
conf->dupvar_warn = !qiszero(q);
|
||||
} else if (vp->v_type == V_STR) {
|
||||
temp = lookup_long(truth, vp->v_str->s_str);
|
||||
if (temp < 0) {
|
||||
math_error("Illegal truth value for dupvar_warn");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
conf->dupvar_warn = (int)temp;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
math_error("Setting illegal config parameter");
|
||||
/*NOTREACHED*/
|
||||
@@ -904,6 +1000,7 @@ config_copy(CONFIG *src)
|
||||
} else {
|
||||
dest->base_name = strdup(src->base_name);
|
||||
}
|
||||
/* NOTE: allow_custom points to a global variable, so do not clone it */
|
||||
if (src->version == NULL) {
|
||||
dest->version = strdup(version());
|
||||
} else {
|
||||
@@ -951,6 +1048,7 @@ config_free(CONFIG *cfg)
|
||||
if (cfg->base_name != NULL) {
|
||||
free(cfg->base_name);
|
||||
}
|
||||
/* NOTE: allow_custom points to a global variable, so do not free it */
|
||||
if (cfg->version != NULL) {
|
||||
free(cfg->version);
|
||||
}
|
||||
@@ -1018,6 +1116,16 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
|
||||
vp->v_str = makenewstring(p);
|
||||
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:
|
||||
vp->v_num = qlink(cfg->epsilon);
|
||||
return;
|
||||
@@ -1043,20 +1151,12 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
|
||||
break;
|
||||
|
||||
case CONFIG_TILDE:
|
||||
if (cfg->tilde_ok) {
|
||||
vp->v_num = itoq(1);
|
||||
} else {
|
||||
vp->v_num = itoq(0);
|
||||
}
|
||||
return;
|
||||
i = (cfg->tilde_ok ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_TAB:
|
||||
if (cfg->tab_ok) {
|
||||
vp->v_num = itoq(1);
|
||||
} else {
|
||||
vp->v_num = itoq(0);
|
||||
}
|
||||
return;
|
||||
i = (cfg->tab_ok ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_QUOMOD:
|
||||
i = cfg->quomod;
|
||||
@@ -1095,20 +1195,12 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
|
||||
break;
|
||||
|
||||
case CONFIG_LEADZERO:
|
||||
if (cfg->leadzero) {
|
||||
vp->v_num = itoq(1);
|
||||
} else {
|
||||
vp->v_num = itoq(0);
|
||||
}
|
||||
return;
|
||||
i = (cfg->leadzero ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_FULLZERO:
|
||||
if (cfg->fullzero) {
|
||||
vp->v_num = itoq(1);
|
||||
} else {
|
||||
vp->v_num = itoq(0);
|
||||
}
|
||||
return;
|
||||
i = (cfg->fullzero ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_MAXSCAN:
|
||||
i = cfg->maxscancount;
|
||||
@@ -1129,12 +1221,8 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
|
||||
break;
|
||||
|
||||
case CONFIG_BLKVERBOSE:
|
||||
if (cfg->blkverbose) {
|
||||
vp->v_num = itoq(1);
|
||||
} else {
|
||||
vp->v_num = itoq(0);
|
||||
}
|
||||
return;
|
||||
i = (cfg->blkverbose ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_BLKBASE:
|
||||
vp->v_type = V_STR;
|
||||
@@ -1169,12 +1257,8 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
|
||||
break;
|
||||
|
||||
case CONFIG_VERBOSE_QUIT:
|
||||
if (cfg->verbose_quit) {
|
||||
vp->v_num = itoq(1);
|
||||
} else {
|
||||
vp->v_num = itoq(0);
|
||||
}
|
||||
return;
|
||||
i = (cfg->verbose_quit ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_CTRL_D:
|
||||
vp->v_type = V_STR;
|
||||
@@ -1205,12 +1289,24 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
|
||||
return;
|
||||
|
||||
case CONFIG_WINDOWS:
|
||||
if (cfg->windows) {
|
||||
vp->v_num = itoq(1);
|
||||
} else {
|
||||
vp->v_num = itoq(0);
|
||||
i = (cfg->windows ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_CYGWIN:
|
||||
i = (cfg->cygwin ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_COMPILE_CUSTOM:
|
||||
i = (cfg->compile_custom ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_ALLOW_CUSTOM:
|
||||
/* firewall */
|
||||
if (cfg->allow_custom == NULL) {
|
||||
cfg->allow_custom = &allow_custom;
|
||||
}
|
||||
return;
|
||||
i = (*(cfg->allow_custom) ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_VERSION:
|
||||
vp->v_type = V_STR;
|
||||
@@ -1221,6 +1317,18 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
|
||||
}
|
||||
return;
|
||||
|
||||
case CONFIG_BASEB:
|
||||
i = BASEB;
|
||||
break;
|
||||
|
||||
case CONFIG_REDECL_WARN:
|
||||
i = (cfg->redecl_warn ? 1 : 0);
|
||||
break;
|
||||
|
||||
case CONFIG_DUPVAR_WARN:
|
||||
i = (cfg->dupvar_warn ? 1 : 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
math_error("Getting illegal CONFIG element");
|
||||
/*NOTREACHED*/
|
||||
@@ -1267,6 +1375,7 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
|
||||
return cfg1->traceflags != cfg2->traceflags ||
|
||||
cfg1->outdigits != cfg2->outdigits ||
|
||||
cfg1->outmode != cfg2->outmode ||
|
||||
cfg1->outmode2 != cfg2->outmode2 ||
|
||||
qcmp(cfg1->epsilon, cfg2->epsilon) ||
|
||||
cfg1->epsilonprec != cfg2->epsilonprec ||
|
||||
cfg1->maxprint != cfg2->maxprint ||
|
||||
@@ -1310,9 +1419,21 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
|
||||
(cfg1->base_name != NULL && cfg2->base_name != NULL &&
|
||||
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->windows != cfg2->windows ||
|
||||
(cfg1->version != NULL && cfg2->version != NULL &&
|
||||
strcmp(cfg1->version, cfg2->version) != 0);
|
||||
strcmp(cfg1->version, cfg2->version) != 0) ||
|
||||
|
||||
cfg1->baseb != cfg2->baseb;
|
||||
}
|
||||
|
42
config.h
42
config.h
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.10 $
|
||||
* @(#) $Id: config.h,v 29.10 2001/05/29 00:16:53 chongo Exp $
|
||||
* @(#) $Revision: 29.19 $
|
||||
* @(#) $Id: config.h,v 29.19 2006/06/20 10:25:45 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/config.h,v $
|
||||
*
|
||||
* Under source code control: 1995/11/01 22:20:17
|
||||
@@ -35,7 +35,7 @@
|
||||
#define __CONFIG_H__
|
||||
|
||||
|
||||
#if defined(SRC) /* if we are building from the calc source tree */
|
||||
#if defined(CALC_SRC) /* if we are building from the calc source tree */
|
||||
# include "win32dll.h"
|
||||
# include "nametype.h"
|
||||
# include "qmath.h"
|
||||
@@ -78,18 +78,25 @@
|
||||
#define CONFIG_MORE 25
|
||||
#define CONFIG_BLKMAXPRINT 26
|
||||
#define CONFIG_BLKVERBOSE 27
|
||||
#define CONFIG_BLKBASE 28
|
||||
#define CONFIG_BLKFMT 29
|
||||
#define CONFIG_BLKBASE 28
|
||||
#define CONFIG_BLKFMT 29
|
||||
#define CONFIG_RESOURCE_DEBUG 30
|
||||
#define CONFIG_LIB_DEBUG CONFIG_RESOURCE_DEBUG
|
||||
#define CONFIG_CALC_DEBUG 31
|
||||
#define CONFIG_USER_DEBUG 32
|
||||
#define CONFIG_VERBOSE_QUIT 33
|
||||
#define CONFIG_CTRL_D 34
|
||||
#define CONFIG_PROGRAM 35
|
||||
#define CONFIG_BASENAME 36
|
||||
#define CONFIG_VERSION 37
|
||||
#define CONFIG_WINDOWS 38
|
||||
#define CONFIG_CTRL_D 34
|
||||
#define CONFIG_PROGRAM 35
|
||||
#define CONFIG_BASENAME 36
|
||||
#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
|
||||
#define CONFIG_BASEB 43
|
||||
#define CONFIG_REDECL_WARN 44
|
||||
#define CONFIG_DUPVAR_WARN 45
|
||||
|
||||
|
||||
/*
|
||||
@@ -98,8 +105,6 @@
|
||||
#define DISPLAY_DEFAULT 20 /* default digits for float display */
|
||||
#define EPSILON_DEFAULT "1e-20" /* allowed error for float calculations */
|
||||
#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 MAXSCANCOUNT 20 /* default max scan errors before an abort */
|
||||
|
||||
@@ -118,6 +123,7 @@
|
||||
*/
|
||||
struct config {
|
||||
int outmode; /* current output mode */
|
||||
int outmode2; /* current secondary output mode */
|
||||
LEN outdigits; /* current output digits for float or exp */
|
||||
NUMBER *epsilon; /* default error for real functions */
|
||||
long epsilonprec; /* epsilon binary precision (tied to epsilon) */
|
||||
@@ -155,7 +161,13 @@ struct config {
|
||||
char *program; /* 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 */
|
||||
int baseb; /* base for calculations */
|
||||
BOOL redecl_warn; /* TRUE => warn of redeclating variables */
|
||||
BOOL dupvar_warn; /* TRUE => warn of var name collisions */
|
||||
};
|
||||
typedef struct config CONFIG;
|
||||
|
||||
@@ -194,8 +206,8 @@ typedef struct config CONFIG;
|
||||
* global configuration states and aliases
|
||||
*/
|
||||
extern DLL CONFIG *conf; /* current configuration */
|
||||
extern DLL CONFIG oldstd; /* backward compatible standard configuration */
|
||||
extern DLL CONFIG newstd; /* new non-backward compatible configuration */
|
||||
extern DLL CONFIG oldstd; /* old classic standard configuration */
|
||||
extern DLL CONFIG newstd; /* default compatible configuration */
|
||||
extern DLL char *calc_debug; /* !=NULL => value of config("calc_debug") */
|
||||
extern DLL char *resource_debug; /* !=NULL => config("resource_debug") value */
|
||||
extern DLL char *user_debug; /* !=NULL => value of config("user_debug") */
|
||||
|
12
const.c
12
const.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: const.c,v 29.2 2000/06/07 14:02:13 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: const.c,v 29.4 2004/02/23 14:04:01 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/const.c,v $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:48:14
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
#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 NUMBER **consttable; /* table of constants */
|
||||
|
||||
@@ -92,7 +92,7 @@ addqconstant(NUMBER *q)
|
||||
{
|
||||
register NUMBER **tp; /* pointer to current number */
|
||||
register NUMBER *t; /* number being tested */
|
||||
long index; /* index into constant table */
|
||||
unsigned long index; /* index into constant table */
|
||||
long numlen; /* numerator length */
|
||||
long denlen; /* denominator length */
|
||||
HALF numlow; /* bottom value of numerator */
|
||||
@@ -221,7 +221,7 @@ trimconstants(void)
|
||||
void
|
||||
showconstants(void)
|
||||
{
|
||||
long index;
|
||||
unsigned long index;
|
||||
NUMBER **qp;
|
||||
long count;
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
#!/usr/local/bin/calc -q -s -f
|
||||
#!/usr/local/src/cmd/calc/calc -q -s -f
|
||||
/*
|
||||
* 4dsphere - determine if 6 points lie on the surface of a sphere in R^4
|
||||
*
|
||||
@@ -26,8 +26,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 1.1 $
|
||||
* @(#) $Id: 4dsphere.calc,v 1.1 2001/05/28 23:05:56 chongo Exp $
|
||||
* @(#) $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
|
||||
|
248
cscript/Makefile
248
cscript/Makefile
@@ -17,8 +17,8 @@
|
||||
# received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# @(#) $Revision: 29.14 $
|
||||
# @(#) $Id: Makefile,v 29.14 2001/05/28 23:08:22 chongo Exp $
|
||||
# @(#) $Revision: 29.23 $
|
||||
# @(#) $Id: Makefile,v 29.23 2003/01/14 01:58:18 chongo Exp $
|
||||
# @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/Makefile,v $
|
||||
#
|
||||
# Under source code control: 1999/11/29 11:10:26
|
||||
@@ -36,15 +36,121 @@
|
||||
SHELL= /bin/sh
|
||||
MAKE_FILE = Makefile
|
||||
|
||||
####
|
||||
# Normally, the upper level makefile will set these values. We provide
|
||||
# a default here just in case you want to build from this directory.
|
||||
####
|
||||
|
||||
# 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
|
||||
#BINDIR= /usr/contrib/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
|
||||
#
|
||||
# Q=@ do not echo internal makefile actions (quiet mode)
|
||||
@@ -77,11 +183,11 @@ CMP= cmp
|
||||
#
|
||||
# make detaillist
|
||||
#
|
||||
SCRIPT= 4dsphere fproduct mersenne piforever plus powerterm simple \
|
||||
square
|
||||
SCRIPT= 4dsphere fproduct mersenne piforever plus powerterm \
|
||||
simple square
|
||||
|
||||
SCRIPT_SRC= 4dsphere.calc fproduct.calc mersenne.calc piforever.calc \
|
||||
plus.calc powerterm.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
|
||||
#
|
||||
@@ -123,8 +229,10 @@ all: ${TARGETS} .all
|
||||
##
|
||||
|
||||
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; \
|
||||
fi; \
|
||||
done | LANG=C ${SORT}
|
||||
|
||||
distdir:
|
||||
@@ -136,23 +244,27 @@ calcliblist:
|
||||
#
|
||||
detaillist:
|
||||
${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 \
|
||||
echo "WARNING: $$i.calc not under RCS control" 1>&2; \
|
||||
else \
|
||||
echo $$i; \
|
||||
fi; \
|
||||
fi; \
|
||||
done | LANG=C ${SORT}) | ${FMT} -70 | \
|
||||
${SED} -e '1s/xxxxxxx/SCRIPT=/' -e '2,$$s/^/ /' \
|
||||
-e 's/$$/ \\/' -e '$$s/ \\$$//'
|
||||
${Q}echo
|
||||
${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 \
|
||||
echo "WARNING: $$i.calc not under RCS control" 1>&2; \
|
||||
else \
|
||||
echo $$i.calc; \
|
||||
fi; \
|
||||
fi; \
|
||||
done | LANG=C ${SORT}) | ${FMT} -70 | \
|
||||
${SED} -e '1s/xxxxxxxxxxx/SCRIPT_SRC=/' -e '2,$$s/^/ /' \
|
||||
-e 's/$$/ \\/' -e '$$s/ \\$$//'
|
||||
@@ -181,11 +293,13 @@ depend:
|
||||
${Q}echo "# DO NOT DELETE THIS LINE -- make depend depends on it." > \
|
||||
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 ' rm -f $$@'; \
|
||||
echo ' $${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!$${BINDIR}/calc:" $$?>$$@'; \
|
||||
echo ' $${CHMOD} +x $$@'; \
|
||||
echo ' @rm -f $$@'; \
|
||||
echo ' @$${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!$${BINDIR}/calc:" $$?>$$@'; \
|
||||
echo ' @$${CHMOD} +x $$@'; \
|
||||
fi; \
|
||||
done >> makedep.out
|
||||
${Q}echo sample dependency list formed
|
||||
${Q}echo forming new cscript/Makefile
|
||||
@@ -216,14 +330,13 @@ depend:
|
||||
#
|
||||
##
|
||||
|
||||
echo_SCRIPT: ${MAKE_FILE}
|
||||
@echo ${SCRIPT}
|
||||
|
||||
|
||||
echo_install.list: ${MAKE_FILE}
|
||||
@for i in ${SCRIPT}; do \
|
||||
echo ${SCRIPTDIR}/$$i; \
|
||||
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
|
||||
@@ -237,65 +350,76 @@ clobber:
|
||||
-rm -f ${TARGETS}
|
||||
|
||||
install: all
|
||||
-${Q}if [ ! -d ${BINDIR} ]; then \
|
||||
echo mkdir ${BINDIR}; \
|
||||
mkdir ${BINDIR}; \
|
||||
echo ${CHMOD} 0755 ${BINDIR}; \
|
||||
${CHMOD} 0755 ${BINDIR}; \
|
||||
-${Q}if [ ! -d $T${BINDIR} ]; then \
|
||||
echo mkdir $T${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 \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${SCRIPTDIR} ]; then \
|
||||
echo mkdir ${SCRIPTDIR}; \
|
||||
mkdir ${SCRIPTDIR}; \
|
||||
echo ${CHMOD} 0755 ${SCRIPTDIR}; \
|
||||
${CHMOD} 0755 ${SCRIPTDIR}; \
|
||||
-${Q}if [ ! -d $T${SCRIPTDIR} ]; then \
|
||||
echo mkdir $T${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 \
|
||||
true; \
|
||||
fi
|
||||
${Q}for i in ${SCRIPT}; do \
|
||||
if ${CMP} -s $$i ${SCRIPTDIR}/$$i; then \
|
||||
${Q}for i in ${SCRIPT} /dev/null; do \
|
||||
if [ "$$i" = "/dev/null" ]; then \
|
||||
continue; \
|
||||
fi; \
|
||||
if ${CMP} -s $$i $T${SCRIPTDIR}/$$i; then \
|
||||
true; \
|
||||
else \
|
||||
rm -f ${SCRIPTDIR}/$$i.new; \
|
||||
cp -f $$i ${SCRIPTDIR}/$$i.new; \
|
||||
${CHMOD} 0555 ${SCRIPTDIR}/$$i; \
|
||||
mv -f ${SCRIPTDIR}/$$i.new ${SCRIPTDIR}/$$i; \
|
||||
echo "installed ${SCRIPTDIR}/$$i"; \
|
||||
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
|
||||
|
||||
# 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 $@
|
||||
@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 $@
|
||||
@rm -f $@
|
||||
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
@${CHMOD} +x $@
|
||||
mersenne: mersenne.calc
|
||||
rm -f $@
|
||||
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
${CHMOD} +x $@
|
||||
@rm -f $@
|
||||
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
@${CHMOD} +x $@
|
||||
piforever: piforever.calc
|
||||
rm -f $@
|
||||
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
${CHMOD} +x $@
|
||||
@rm -f $@
|
||||
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
@${CHMOD} +x $@
|
||||
plus: plus.calc
|
||||
rm -f $@
|
||||
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
${CHMOD} +x $@
|
||||
@rm -f $@
|
||||
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
@${CHMOD} +x $@
|
||||
powerterm: powerterm.calc
|
||||
rm -f $@
|
||||
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
${CHMOD} +x $@
|
||||
@rm -f $@
|
||||
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
@${CHMOD} +x $@
|
||||
simple: simple.calc
|
||||
rm -f $@
|
||||
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
${CHMOD} +x $@
|
||||
@rm -f $@
|
||||
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
@${CHMOD} +x $@
|
||||
square: square.calc
|
||||
rm -f $@
|
||||
${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
${CHMOD} +x $@
|
||||
@rm -f $@
|
||||
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@
|
||||
@${CHMOD} +x $@
|
||||
|
@@ -21,14 +21,14 @@ For more info, see:
|
||||
|
||||
4dsphere
|
||||
|
||||
determine if 6 points lie on the surface of a sphere in R^4
|
||||
Determine if 6 points lie on the surface of a 4-dimensional sphere in R^4.
|
||||
|
||||
usage: 4dsphere x0 y0 z0 w0 x1 y1 z1 w1 ... x5 y5 z5 w5
|
||||
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
|
||||
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 ...
|
||||
@@ -77,8 +77,8 @@ simple
|
||||
## 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.7 $
|
||||
## @(#) $Id: README,v 29.7 2001/05/28 23:08:22 chongo Exp $
|
||||
## @(#) $Revision: 29.10 $
|
||||
## @(#) $Id: README,v 29.10 2001/06/10 19:34:40 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/cscript/RCS/README,v $
|
||||
##
|
||||
## Under source code control: 1999/12/17 10:23:40
|
||||
|
@@ -1,4 +1,4 @@
|
||||
#!/usr/local/bin/calc -q -s -f
|
||||
#!/usr/local/src/cmd/calc/calc -q -s -f
|
||||
/*
|
||||
* fproduct - write the big Endian product of terms to a file
|
||||
*
|
||||
@@ -24,8 +24,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.1 $
|
||||
* @(#) $Id: fproduct.calc,v 29.1 2001/04/08 08:25:15 chongo Exp $
|
||||
* @(#) $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
|
||||
|
@@ -1,4 +1,4 @@
|
||||
#!/usr/local/bin/calc -q -s -f
|
||||
#!/usr/local/src/cmd/calc/calc -q -s -f
|
||||
/*
|
||||
* powerterm - print the argument as a sum of powers of integers
|
||||
*
|
||||
@@ -24,8 +24,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.5 $
|
||||
* @(#) $Id: powerterm.calc,v 29.5 2001/04/25 08:41:36 chongo Exp $
|
||||
* @(#) $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
|
||||
|
10
custom.c
10
custom.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* custom - interface for custom software and hardware interfaces
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999-2006 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: custom.c,v 29.3 2001/03/17 21:31:47 chongo Exp $
|
||||
* @(#) $Revision: 29.6 $
|
||||
* @(#) $Id: custom.c,v 29.6 2006/05/19 15:26:10 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/custom.c,v $
|
||||
*
|
||||
* Under source code control: 1997/03/03 04:53:08
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
#endif /* CUSTOM */
|
||||
|
||||
int allow_custom = FALSE; /* TRUE => custom builtins allowed */
|
||||
BOOL allow_custom = FALSE; /* TRUE => custom builtins allowed */
|
||||
|
||||
|
||||
/*
|
||||
@@ -189,7 +189,7 @@ customhelp(char *name)
|
||||
/*
|
||||
* form the custom help name
|
||||
*/
|
||||
customname = (char *)malloc(sizeof("custhelp")+strlen(name)+1);
|
||||
customname = (char *)malloc(sizeof("custhelp")+1+strlen(name)+1);
|
||||
if (customname == NULL) {
|
||||
math_error("bad malloc of customname");
|
||||
/*NOTREACHED*/
|
||||
|
6
custom.h
6
custom.h
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: custom.h,v 29.2 2000/06/07 14:02:13 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: custom.h,v 29.3 2004/02/25 23:54:40 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/custom.h,v $
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
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 customhelp(char *); /* direct custom help */
|
||||
extern CONST struct custom cust[]; /* custom interface table */
|
||||
|
@@ -36,13 +36,14 @@ Step 1: Do some background work
|
||||
anything in Steps 2 and beyond!
|
||||
|
||||
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:
|
||||
|
||||
custom.c
|
||||
custom/custom.h
|
||||
custom.h
|
||||
custom/custtbl.c
|
||||
custom/c_*.[ch]
|
||||
custom/*.cal
|
||||
help/custom (or run: calc help custom)
|
||||
|
||||
You would be well advised to look at a more recent calc source
|
||||
@@ -83,14 +84,15 @@ Step 3: Document your custom function
|
||||
|
||||
Take a look at one of the example custom help files:
|
||||
|
||||
devnull
|
||||
argv
|
||||
help
|
||||
sysinfo
|
||||
custom/devnull
|
||||
custom/argv
|
||||
custom/help
|
||||
custom/sysinfo
|
||||
|
||||
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:
|
||||
|
||||
cd custom
|
||||
cp sysinfo curds
|
||||
|
||||
and edit it accordingly.
|
||||
@@ -107,15 +109,16 @@ Step 4: Write your test code
|
||||
test code will be an import part of your submission. Your test
|
||||
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:
|
||||
|
||||
argv.cal
|
||||
halflen.cal
|
||||
custom/argv.cal
|
||||
custom/halflen.cal
|
||||
|
||||
Copy one of these to your own file:
|
||||
|
||||
cd custom
|
||||
cp halflen.cal curds.cal
|
||||
|
||||
and exit it accordingly. In particular you will want to:
|
||||
@@ -152,6 +155,7 @@ Step 5: Write your custom function
|
||||
We recommend that you use one of the c_*.c files as a template.
|
||||
Copy an appropriate file to your file:
|
||||
|
||||
cd custom
|
||||
cp c_argv.c u_curds.c
|
||||
|
||||
Before you edit it, you should note that there are several important
|
||||
@@ -179,9 +183,6 @@ Step 5: Write your custom function
|
||||
VALUE
|
||||
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
|
||||
and have the following meaning:
|
||||
|
||||
@@ -222,6 +223,15 @@ Step 5: Write your custom function
|
||||
vals[1] points to b
|
||||
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.
|
||||
|
||||
The typical way to form a VALUE to return is by declaring
|
||||
@@ -239,6 +249,8 @@ Step 5: Write your custom function
|
||||
#include "../value.h"
|
||||
#include "custom.h"
|
||||
|
||||
#include "../have_unused.h"
|
||||
|
||||
Typically these will be included just below any system
|
||||
includes and just below the #if defined(CUSTOM) line.
|
||||
|
||||
@@ -362,7 +374,7 @@ Step 6: Register the function in the custom interface table
|
||||
|
||||
To allow the custom() builtin to transfer control to your function,
|
||||
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
|
||||
@@ -482,10 +494,10 @@ Step 6: Register the function in the custom interface table
|
||||
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
|
||||
CUSTOM_CALC_FILES Makefile variable:
|
||||
CUSTOM_CALC_FILES Makefile variable found in custom/Makefile:
|
||||
|
||||
CUSTOM_CALC_FILES= argv.cal halflen.cal curds.cal
|
||||
|
||||
@@ -619,7 +631,7 @@ Step 12: Contribute
|
||||
and consider submitting your custom function for possible
|
||||
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
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -635,8 +647,8 @@ Step 12: Contribute
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: HOW_TO_ADD,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
## @(#) $Revision: 29.5 $
|
||||
## @(#) $Id: HOW_TO_ADD,v 29.5 2005/10/18 11:18:34 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/HOW_TO_ADD,v $
|
||||
##
|
||||
## Under source code control: 1997/03/10 03:03:21
|
||||
|
401
custom/Makefile
401
custom/Makefile
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# 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
|
||||
# the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -18,8 +18,8 @@
|
||||
# received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# @(#) $Revision: 29.13 $
|
||||
# @(#) $Id: Makefile,v 29.13 2001/05/28 23:54:53 chongo Exp $
|
||||
# @(#) $Revision: 29.24 $
|
||||
# @(#) $Id: Makefile,v 29.24 2004/07/29 08:38:18 chongo Exp $
|
||||
# @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/Makefile,v $
|
||||
#
|
||||
# Under source code control: 1997/03/09 02:28:54
|
||||
@@ -40,13 +40,13 @@
|
||||
#
|
||||
# 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
|
||||
#
|
||||
# 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
|
||||
#
|
||||
@@ -62,7 +62,7 @@ CUSTOM_H_SRC=
|
||||
#
|
||||
# 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.
|
||||
# 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.
|
||||
#
|
||||
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 -=-=-=-=-=-=-#
|
||||
@@ -88,33 +88,120 @@ CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o
|
||||
#Q=
|
||||
Q=@
|
||||
|
||||
####
|
||||
# Normally, the upper level makefile will set these values. We provide
|
||||
# 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:
|
||||
#
|
||||
# ${SHAREDIR} where most common shared files are kept
|
||||
# ${INCDIR} where most .h files are kept
|
||||
# INCDIR= /dev/env/DJDIR/include
|
||||
#
|
||||
# ${CSHAREDIR} where most common shared calc files are kept
|
||||
# ${HELPDIR} where the help directory is installed.
|
||||
# ${INCDIRCALC} where the calc include files are installed
|
||||
# ${CUSTOMLIBDIR} where custom *.cal files & libcustcalc.a are installed.
|
||||
# ${CUSTOMHELPDIR} where custom help files are installed.
|
||||
# ${CUSTOMINCPDIR} where custom .h files are installed.
|
||||
# If in doubt, set:
|
||||
#
|
||||
#SHAREDIR= /usr/local/lib
|
||||
SHAREDIR= /usr/share
|
||||
# INCDIR= /usr/include
|
||||
#
|
||||
|
||||
#INCDIR= /usr/local/include
|
||||
#INCDIR= /dev/env/DJDIR/include
|
||||
INCDIR= /usr/include
|
||||
|
||||
# where to install calc realted things
|
||||
#
|
||||
CSHAREDIR= ${SHAREDIR}/calc
|
||||
HELPDIR= ${CSHAREDIR}/help
|
||||
INCDIRCALC= ${INCDIR}/calc
|
||||
CUSTOMLIBDIR= ${CSHAREDIR}/custom
|
||||
CUSTOMHELPDIR= ${CSHAREDIR}/custhelp
|
||||
CUSTOMINCDIR= ${INCDIRCALC}/custom
|
||||
# ${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
|
||||
# a default here just in case you want to build from this directory.
|
||||
@@ -263,7 +350,7 @@ REQUIRED_SRC= custtbl.c
|
||||
#
|
||||
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}
|
||||
|
||||
@@ -365,8 +452,10 @@ c_sysinfo.o: c_sysinfo.c ${MAKE_FILE}
|
||||
##
|
||||
|
||||
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; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
distdir:
|
||||
@@ -402,11 +491,13 @@ depend:
|
||||
-${Q}rm -rf skel
|
||||
${Q}mkdir skel
|
||||
${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' \
|
||||
"$$i" > "skel/custom/$$i"; \
|
||||
fi; \
|
||||
done
|
||||
-${Q}for i in /dev/null ${H_SRC}; do \
|
||||
-${Q}for i in ${H_SRC} /dev/null; do \
|
||||
if [ "$$i" = "/dev/null" ]; then \
|
||||
continue; \
|
||||
fi; \
|
||||
@@ -421,7 +512,10 @@ depend:
|
||||
${Q}for i in `cd ..; ${MAKE} h_list 2>&1 | \
|
||||
${SED} -e '/Entering directory/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'`"; \
|
||||
echo "#if !defined($$tag)" > "skel/$$i"; \
|
||||
echo "#define $$tag" >> "skel/$$i"; \
|
||||
@@ -435,8 +529,10 @@ depend:
|
||||
${Q}echo "# DO NOT DELETE THIS LINE -- make depend depends on it." > \
|
||||
skel/custom/makedep.out
|
||||
${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/'; \
|
||||
fi; \
|
||||
done >> skel/custom/makedep.out
|
||||
${Q}echo custom dependency list formed
|
||||
${Q}echo forming new custom/Makefile
|
||||
@@ -468,27 +564,26 @@ depend:
|
||||
#
|
||||
##
|
||||
|
||||
echo_INSTALL_H_SRC: ${MAKE_FILE}
|
||||
@echo ${INSTALL_H_SRC}
|
||||
|
||||
echo_CUSTOM_CALC_FILES: ${MAKE_FILE}
|
||||
@echo ${CUSTOM_CALC_FILES}
|
||||
|
||||
echo_CUSTOM_HELP: ${MAKE_FILE}
|
||||
@echo ${CUSTOM_HELP}
|
||||
|
||||
echo_install.list: ${MAKE_FILE}
|
||||
@for i in ${INSTALL_H_SRC}; do \
|
||||
echo ${CUSTOMINCDIR}/$$i; \
|
||||
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
|
||||
@for i in ${CUSTOM_HELP}; do \
|
||||
echo ${CUSTOMHELPDIR}/$$i; \
|
||||
${Q}for i in ${CUSTOM_HELP} /dev/null; do \
|
||||
if [ X"$$i" != X"/dev/null" ]; then \
|
||||
echo __file__ ${CUSTOMHELPDIR}/$$i; \
|
||||
fi; \
|
||||
done
|
||||
@for i in ${CUSTOM_CALC_FILES}; do \
|
||||
echo ${CUSTOMLIBDIR}/$$i; \
|
||||
${Q}for i in ${CUSTOM_CALC_FILES} /dev/null; do \
|
||||
if [ X"$$i" != X"/dev/null" ]; then \
|
||||
echo __file__ ${CUSTOMCALDIR}/$$i; \
|
||||
fi; \
|
||||
done
|
||||
@for i in ${CALC_LIBCUSTOM}; do \
|
||||
echo ${CUSTOMLIBDIR}/$$i; \
|
||||
${Q}for i in ${CALC_LIBCUSTOM} /dev/null; do \
|
||||
if [ X"$$i" != X"/dev/null" ]; then \
|
||||
echo __file__ ${CUSTOMCALDIR}/$$i; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
##
|
||||
@@ -505,118 +600,144 @@ clobber:
|
||||
rm -f .all Makefile.tmp Makefile.bak
|
||||
|
||||
install: all
|
||||
-${Q}if [ ! -d ${SHAREDIR} ]; then \
|
||||
echo mkdir ${SHAREDIR}; \
|
||||
mkdir ${SHAREDIR}; \
|
||||
echo ${CHMOD} 0755 ${SHAREDIR}; \
|
||||
${CHMOD} 0755 ${SHAREDIR}; \
|
||||
-${Q}if [ ! -d $T${INCDIR} ]; then \
|
||||
echo mkdir $T${INCDIR}; \
|
||||
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 \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${INCDIR} ]; then \
|
||||
echo mkdir ${INCDIR}; \
|
||||
mkdir ${INCDIR}; \
|
||||
echo ${CHMOD} 0755 ${INCDIR}; \
|
||||
${CHMOD} 0755 ${INCDIR}; \
|
||||
-${Q}if [ ! -d $T${CALC_SHAREDIR} ]; then \
|
||||
echo mkdir $T${CALC_SHAREDIR}; \
|
||||
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 \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${CSHAREDIR} ]; then \
|
||||
echo mkdir ${CSHAREDIR}; \
|
||||
mkdir ${CSHAREDIR}; \
|
||||
echo ${CHMOD} 0755 ${CSHAREDIR}; \
|
||||
${CHMOD} 0755 ${CSHAREDIR}; \
|
||||
-${Q}if [ ! -d $T${CALC_INCDIR} ]; then \
|
||||
echo mkdir $T${CALC_INCDIR}; \
|
||||
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 \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${INCDIRCALC} ]; then \
|
||||
echo mkdir ${INCDIRCALC}; \
|
||||
mkdir ${INCDIRCALC}; \
|
||||
echo ${CHMOD} 0755 ${INCDIRCALC}; \
|
||||
${CHMOD} 0755 ${INCDIRCALC}; \
|
||||
-${Q}if [ ! -d $T${HELPDIR} ]; then \
|
||||
echo mkdir $T${HELPDIR}; \
|
||||
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 \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${HELPDIR} ]; then \
|
||||
echo mkdir ${HELPDIR}; \
|
||||
mkdir ${HELPDIR}; \
|
||||
echo ${CHMOD} 0755 ${HELPDIR}; \
|
||||
${CHMOD} 0755 ${HELPDIR}; \
|
||||
-${Q}if [ ! -d $T${CUSTOMCALDIR} ]; then \
|
||||
echo mkdir $T${CUSTOMCALDIR}; \
|
||||
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 \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${CUSTOMLIBDIR} ]; then \
|
||||
echo mkdir ${CUSTOMLIBDIR}; \
|
||||
mkdir ${CUSTOMLIBDIR}; \
|
||||
echo ${CHMOD} 0755 ${CUSTOMLIBDIR}; \
|
||||
${CHMOD} 0755 ${CUSTOMLIBDIR}; \
|
||||
-${Q}if [ ! -d $T${CUSTOMHELPDIR} ]; then \
|
||||
echo mkdir $T${CUSTOMHELPDIR}; \
|
||||
mkdir $T${CUSTOMHELPDIR}; \
|
||||
if [ ! -d "$T${CUSTOMHELPDIR}" ]; then \
|
||||
echo mkdir -p "$T${CUSTOMHELPDIR}"; \
|
||||
mkdir -p "$T${CUSTOMHELPDIR}"; \
|
||||
fi; \
|
||||
echo ${CHMOD} 0755 $T${CUSTOMHELPDIR}; \
|
||||
${CHMOD} 0755 $T${CUSTOMHELPDIR}; \
|
||||
else \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${CUSTOMHELPDIR} ]; then \
|
||||
echo mkdir ${CUSTOMHELPDIR}; \
|
||||
mkdir ${CUSTOMHELPDIR}; \
|
||||
echo ${CHMOD} 0755 ${CUSTOMHELPDIR}; \
|
||||
${CHMOD} 0755 ${CUSTOMHELPDIR}; \
|
||||
-${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}if [ ! -d ${CUSTOMINCDIR} ]; then \
|
||||
echo mkdir ${CUSTOMINCDIR}; \
|
||||
mkdir ${CUSTOMINCDIR}; \
|
||||
echo ${CHMOD} 0755 ${CUSTOMINCDIR}; \
|
||||
${CHMOD} 0755 ${CUSTOMINCDIR}; \
|
||||
else \
|
||||
true; \
|
||||
fi
|
||||
-${Q}for i in ${INSTALL_H_SRC}; do \
|
||||
rm -f tmp; \
|
||||
${SED} -e 's/^\(#[ ]*include[ ][ ]*\)"/\1"calc\//' $$i > tmp; \
|
||||
if ${CMP} -s tmp ${CUSTOMINCDIR}/$$i; then \
|
||||
-${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 ${CUSTOMINCDIR}/$$i; \
|
||||
cp -f tmp ${INCDIRCALC}/$$i.new; \
|
||||
cp -f $$i ${CUSTOMINCDIR}/$$i.new; \
|
||||
${CHMOD} 0444 ${CUSTOMINCDIR}/$$i.new; \
|
||||
mv -f ${CUSTOMINCDIR}/$$i.new ${CUSTOMINCDIR}/$$i; \
|
||||
echo "installed ${CUSTOMINCDIR}/$$i"; \
|
||||
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
|
||||
-${Q}rm -f tmp
|
||||
-${Q}for i in ${CUSTOM_CALC_FILES}; do \
|
||||
if ${CMP} -s $$i ${CUSTOMLIBDIR}/$$i; then \
|
||||
-${Q}for i in ${CUSTOM_CALC_FILES} /dev/null; do \
|
||||
if [ "$$i" = "/dev/null" ]; then \
|
||||
continue; \
|
||||
fi; \
|
||||
if ${CMP} -s $$i $T${CUSTOMCALDIR}/$$i; then \
|
||||
true; \
|
||||
else \
|
||||
rm -f ${CUSTOMLIBDIR}/$$i; \
|
||||
cp -f $$i ${CUSTOMLIBDIR}/$$i; \
|
||||
${CHMOD} 0444 ${CUSTOMLIBDIR}/$$i.new; \
|
||||
mv -f ${CUSTOMLIBDIR}/$$i.new ${CUSTOMLIBDIR}/$$i; \
|
||||
echo "installed ${CUSTOMLIBDIR}/$$i"; \
|
||||
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
|
||||
-${Q}for i in ${CUSTOM_HELP}; do \
|
||||
if ${CMP} -s $$i ${CUSTOMHELPDIR}/$$i; then \
|
||||
-${Q}for i in ${CUSTOM_HELP} /dev/null; do \
|
||||
if [ "$$i" = "/dev/null" ]; then \
|
||||
continue; \
|
||||
fi; \
|
||||
if ${CMP} -s $$i $T${CUSTOMHELPDIR}/$$i; then \
|
||||
true; \
|
||||
else \
|
||||
rm -f ${CUSTOMHELPDIR}/$$i; \
|
||||
cp -f $$i ${CUSTOMHELPDIR}/$$i.new; \
|
||||
${CHMOD} 0444 ${CUSTOMHELPDIR}/$$i.new; \
|
||||
mv -f ${CUSTOMHELPDIR}/$$i.new ${CUSTOMHELPDIR}/$$i; \
|
||||
echo "installed ${CUSTOMHELPDIR}/$$i"; \
|
||||
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
|
||||
-${Q}if [ ! -z ${ALLOW_CUSTOM} ]; then \
|
||||
if ${CMP} -s libcustcalc.a ${CUSTOMLIBDIR}/libcustcalc.a; then \
|
||||
if ${CMP} -s libcustcalc.a $T${CUSTOMCALDIR}/libcustcalc.a; then \
|
||||
true; \
|
||||
else \
|
||||
rm -f ${CUSTOMLIBDIR}/libcustcalc.a.new; \
|
||||
cp -f libcustcalc.a ${CUSTOMLIBDIR}/libcustcalc.a.new; \
|
||||
${CHMOD} 0644 ${CUSTOMLIBDIR}/libcustcalc.a; \
|
||||
mv -f ${CUSTOMLIBDIR}/libcustcalc.a.new \
|
||||
${CUSTOMLIBDIR}/libcustcalc.a; \
|
||||
${RANLIB} ${CUSTOMLIBDIR}/libcustcalc.a; \
|
||||
echo "installed ${CUSTOMLIBDIR}/libcustcalc.a"; \
|
||||
rm -f $T${CUSTOMCALDIR}/libcustcalc.a.new; \
|
||||
cp -f libcustcalc.a $T${CUSTOMCALDIR}/libcustcalc.a.new; \
|
||||
${CHMOD} 0644 $T${CUSTOMCALDIR}/libcustcalc.a.new; \
|
||||
mv -f $T${CUSTOMCALDIR}/libcustcalc.a.new \
|
||||
$T${CUSTOMCALDIR}/libcustcalc.a; \
|
||||
${RANLIB} $T${CUSTOMCALDIR}/libcustcalc.a; \
|
||||
echo "installed $T${CUSTOMCALDIR}/libcustcalc.a"; \
|
||||
fi; \
|
||||
fi
|
||||
|
||||
@@ -628,7 +749,6 @@ install: all
|
||||
|
||||
# DO NOT DELETE THIS LINE
|
||||
|
||||
|
||||
c_argv.o: ../alloc.h
|
||||
c_argv.o: ../block.h
|
||||
c_argv.o: ../byteswap.h
|
||||
@@ -645,6 +765,7 @@ c_argv.o: ../have_memmv.h
|
||||
c_argv.o: ../have_newstr.h
|
||||
c_argv.o: ../have_stdlib.h
|
||||
c_argv.o: ../have_string.h
|
||||
c_argv.o: ../have_unused.h
|
||||
c_argv.o: ../longbits.h
|
||||
c_argv.o: ../md5.h
|
||||
c_argv.o: ../nametype.h
|
||||
@@ -671,6 +792,7 @@ c_devnull.o: ../have_memmv.h
|
||||
c_devnull.o: ../have_newstr.h
|
||||
c_devnull.o: ../have_stdlib.h
|
||||
c_devnull.o: ../have_string.h
|
||||
c_devnull.o: ../have_unused.h
|
||||
c_devnull.o: ../longbits.h
|
||||
c_devnull.o: ../md5.h
|
||||
c_devnull.o: ../nametype.h
|
||||
@@ -697,6 +819,7 @@ c_help.o: ../have_memmv.h
|
||||
c_help.o: ../have_newstr.h
|
||||
c_help.o: ../have_stdlib.h
|
||||
c_help.o: ../have_string.h
|
||||
c_help.o: ../have_unused.h
|
||||
c_help.o: ../longbits.h
|
||||
c_help.o: ../md5.h
|
||||
c_help.o: ../nametype.h
|
||||
@@ -708,6 +831,33 @@ c_help.o: ../value.h
|
||||
c_help.o: ../win32dll.h
|
||||
c_help.o: ../zmath.h
|
||||
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: ../block.h
|
||||
c_pzasusb8.o: ../byteswap.h
|
||||
@@ -723,6 +873,7 @@ c_pzasusb8.o: ../have_memmv.h
|
||||
c_pzasusb8.o: ../have_newstr.h
|
||||
c_pzasusb8.o: ../have_stdlib.h
|
||||
c_pzasusb8.o: ../have_string.h
|
||||
c_pzasusb8.o: ../have_unused.h
|
||||
c_pzasusb8.o: ../longbits.h
|
||||
c_pzasusb8.o: ../md5.h
|
||||
c_pzasusb8.o: ../nametype.h
|
||||
@@ -752,9 +903,9 @@ c_sysinfo.o: ../have_memmv.h
|
||||
c_sysinfo.o: ../have_newstr.h
|
||||
c_sysinfo.o: ../have_stdlib.h
|
||||
c_sysinfo.o: ../have_string.h
|
||||
c_sysinfo.o: ../have_unused.h
|
||||
c_sysinfo.o: ../hist.h
|
||||
c_sysinfo.o: ../longbits.h
|
||||
c_sysinfo.o: ../longlong.h
|
||||
c_sysinfo.o: ../md5.h
|
||||
c_sysinfo.o: ../nametype.h
|
||||
c_sysinfo.o: ../prime.h
|
||||
|
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: argv.cal,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $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 $
|
||||
*
|
||||
* 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
|
||||
* 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 junk; /* throw away value */
|
||||
@@ -54,7 +59,3 @@ define argv()
|
||||
}
|
||||
return i-1;
|
||||
}
|
||||
|
||||
if (config("resource_debug") >= 0) {
|
||||
print "argv(var, ...) defined";
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* c_argv - a custom function display info about its args
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999-2006 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: c_argv.c,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
* @(#) $Revision: 29.7 $
|
||||
* @(#) $Id: c_argv.c,v 29.7 2006/05/22 19:04:45 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_argv.c,v $
|
||||
*
|
||||
* Under source code control: 1997/03/09 20:27:37
|
||||
@@ -40,6 +40,8 @@
|
||||
#include "../config.h"
|
||||
#include "../calc.h"
|
||||
|
||||
#include "../have_unused.h"
|
||||
|
||||
/*
|
||||
* c_argv - a custom function display info about its args
|
||||
*
|
||||
@@ -51,7 +53,7 @@
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
VALUE
|
||||
c_argv(char *name, int count, VALUE **vals)
|
||||
c_argv(char UNUSED *name, int count, VALUE **vals)
|
||||
{
|
||||
VALUE result; /* what we will return */
|
||||
ZVALUE zfilelen; /* length of a file as a ZVALUE */
|
||||
@@ -150,10 +152,10 @@ c_argv(char *name, int count, VALUE **vals)
|
||||
/* getsize error */
|
||||
printf("\tsize=unknown");
|
||||
}
|
||||
printf("\tsizeof=%ld\n", lsizeof(vals[i]));
|
||||
printf("\tsizeof=%ld\n", (long int)lsizeof(vals[i]));
|
||||
} else {
|
||||
printf("\tsize=%ld\tsizeof=%ld\n",
|
||||
elm_count(vals[i]), lsizeof(vals[i]));
|
||||
elm_count(vals[i]), (long int)lsizeof(vals[i]));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: c_devnull.c,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $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 $
|
||||
*
|
||||
* Under source code control: 1997/03/09 17:49:12
|
||||
@@ -36,6 +36,8 @@
|
||||
#include "../value.h"
|
||||
#include "../custom.h"
|
||||
|
||||
#include "../have_unused.h"
|
||||
|
||||
|
||||
/*
|
||||
* c_devnull - a custom function that does nothing
|
||||
@@ -45,7 +47,7 @@
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
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 */
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: c_help.c,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $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 $
|
||||
*
|
||||
* Under source code control: 1997/03/09 05:25:41
|
||||
@@ -36,6 +36,8 @@
|
||||
#include "../value.h"
|
||||
#include "../custom.h"
|
||||
|
||||
#include "../have_unused.h"
|
||||
|
||||
|
||||
/*
|
||||
* c_help - custom help function
|
||||
@@ -56,7 +58,7 @@
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
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 */
|
||||
|
||||
|
272
custom/c_pmodm127.c
Normal file
272
custom/c_pmodm127.c
Normal 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 */
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: c_pzasusb8.c,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $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 $
|
||||
*
|
||||
* Under source code control: 1999/10/06 03:12:25
|
||||
@@ -37,6 +37,8 @@
|
||||
#include "../custom.h"
|
||||
#include "../zmath.h"
|
||||
|
||||
#include "../have_unused.h"
|
||||
|
||||
/*
|
||||
* c_pzasusb8 - print numereator as a string of USB8s
|
||||
*
|
||||
@@ -49,7 +51,7 @@
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
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 */
|
||||
ZVALUE z; /* numerator of the value */
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.5 $
|
||||
* @(#) $Id: c_sysinfo.c,v 29.5 2001/04/14 23:04:17 chongo Exp $
|
||||
* @(#) $Revision: 29.11 $
|
||||
* @(#) $Id: c_sysinfo.c,v 29.11 2006/05/22 19:04:45 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/c_sysinfo.c,v $
|
||||
*
|
||||
* Under source code control: 1997/03/09 23:14:40
|
||||
@@ -42,7 +42,6 @@
|
||||
#include "../calc.h"
|
||||
#include "../longbits.h"
|
||||
#define CHECK_L_FORMAT
|
||||
#include "../longlong.h"
|
||||
#include "../block.h"
|
||||
#include "../calcerr.h"
|
||||
#include "../conf.h"
|
||||
@@ -53,6 +52,8 @@
|
||||
#include "../zrand.h"
|
||||
#include "../zrandom.h"
|
||||
|
||||
#include "../have_unused.h"
|
||||
|
||||
|
||||
/*
|
||||
* sys_info - names and values of selected #defines
|
||||
@@ -102,7 +103,6 @@ static struct infoname sys_info[] = {
|
||||
{"INIT_K", "initial 2nd walking a55 table index", NULL, (FULL)INIT_K},
|
||||
{"INODE_BITS", "inode number size in bits", NULL, (FULL)INODE_BITS},
|
||||
{"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},
|
||||
{"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT},
|
||||
{"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_VAL", "larest 32 bit value", NULL, (FULL)MAX_SM_VAL},
|
||||
{"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_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},
|
||||
@@ -181,7 +179,7 @@ static void dump_mening_value(void); /* custom("sysinfo", 2) */
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
VALUE
|
||||
c_sysinfo(char *name, int count, VALUE **vals)
|
||||
c_sysinfo(char UNUSED *name, int count, VALUE **vals)
|
||||
{
|
||||
VALUE result; /* what we will return */
|
||||
struct infoname *p; /* current infoname */
|
||||
@@ -193,6 +191,7 @@ c_sysinfo(char *name, int count, VALUE **vals)
|
||||
* we will return NULL if a value was not found
|
||||
*/
|
||||
result.v_type = V_NULL;
|
||||
result.v_subtype = V_NOSUBTYPE;
|
||||
|
||||
/*
|
||||
* case 0: if no args, then dump the table with no values
|
||||
@@ -317,30 +316,16 @@ dump_name_value(void)
|
||||
/* dump the entire table */
|
||||
for (p = sys_info; p->name != NULL; ++p) {
|
||||
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",
|
||||
(conf->tab_ok ? "\t" : ""), p->name,
|
||||
(unsigned long)p->nmbr,
|
||||
(unsigned long)p->nmbr);
|
||||
#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",
|
||||
(conf->tab_ok ? "\t" : ""), p->name,
|
||||
(unsigned long long)p->nmbr,
|
||||
(unsigned long long)p->nmbr);
|
||||
# endif /* L64_FORMAT */
|
||||
#endif
|
||||
} else {
|
||||
printf("%s%-23s\t\"%s\"\n",
|
||||
@@ -362,25 +347,16 @@ dump_mening_value(void)
|
||||
/* dump the entire table */
|
||||
for (p = sys_info; p->name != NULL; ++p) {
|
||||
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",
|
||||
(conf->tab_ok ? "\t" : ""), p->meaning,
|
||||
(unsigned long)p->nmbr,
|
||||
(unsigned long)p->nmbr);
|
||||
#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",
|
||||
(conf->tab_ok ? "\t" : ""), p->meaning,
|
||||
(unsigned long long)p->nmbr,
|
||||
(unsigned long long)p->nmbr);
|
||||
# endif /* L64_FORMAT */
|
||||
#endif
|
||||
} else {
|
||||
printf("%s%-36.36s\t\"%s\"\n",
|
||||
|
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: custtbl.c,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: custtbl.c,v 29.4 2005/02/05 06:16:19 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/custtbl.c,v $
|
||||
*
|
||||
* Under source code control: 1997/03/09 02:28:54
|
||||
@@ -56,6 +56,7 @@ extern VALUE c_devnull(char*, int, VALUE**);
|
||||
extern VALUE c_help(char*, int, VALUE**);
|
||||
extern VALUE c_sysinfo(char*, int, VALUE**);
|
||||
extern VALUE c_pzasusb8(char*, int, VALUE**);
|
||||
extern VALUE c_pmodm127(char*, int, VALUE**);
|
||||
|
||||
|
||||
#endif /* CUSTOM */
|
||||
@@ -105,9 +106,12 @@ CONST struct custom cust[] = {
|
||||
{ "sysinfo", "return a calc #define value",
|
||||
0, 1, c_sysinfo },
|
||||
|
||||
{ "pzasusb8", "print ZCALUE as USB8",
|
||||
{ "pzasusb8", "print ZVALUE as USB8",
|
||||
0, 1, c_pzasusb8 },
|
||||
|
||||
{ "pmodm127", "calculate q mod 2^(2^127-1)",
|
||||
1, 1, c_pmodm127 },
|
||||
|
||||
|
||||
#endif /* CUSTOM */
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: halflen.cal,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $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 $
|
||||
*
|
||||
* 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
|
||||
* 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)
|
||||
{
|
||||
local baseb = custom("sysinfo","BASEB"); /* bit len of a HALF */
|
||||
local baseb; /* bit len of a HALF */
|
||||
|
||||
/*
|
||||
* firewall
|
||||
@@ -47,6 +52,11 @@ define halflen(num)
|
||||
return newerror("halflen only works on numeric values");
|
||||
}
|
||||
|
||||
/*
|
||||
* determine baseb
|
||||
*/
|
||||
baseb = custom("sysinfo","BASEB");
|
||||
|
||||
/*
|
||||
* determine the HALF length of a numeric value
|
||||
*/
|
||||
@@ -63,7 +73,3 @@ define halflen(num)
|
||||
return newerror("halflen only works on numeric values");
|
||||
}
|
||||
}
|
||||
|
||||
if (config("resource_debug") >= 0) {
|
||||
print "halflen(num) defined";
|
||||
}
|
||||
|
78
custom/pmodm127
Normal file
78
custom/pmodm127
Normal 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
137
custom/pmodm127.cal
Normal 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";
|
||||
}
|
@@ -19,7 +19,7 @@ DESCRIPTION
|
||||
custom("sysinfo", "BASEB")
|
||||
custom("sysinfo", "CALC_BYTE_ORDER")
|
||||
|
||||
foe details.
|
||||
for details.
|
||||
|
||||
This custom function is intented for testing of the general
|
||||
custom interface.
|
||||
@@ -65,8 +65,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: pzasusb8,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: pzasusb8,v 29.3 2005/10/18 11:18:34 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/custom/RCS/pzasusb8,v $
|
||||
##
|
||||
## Under source code control: 1999/10/06 04:05:43
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.2 $
|
||||
* @(#) $Id: pzasusb8.cal,v 29.2 2000/06/07 14:03:03 chongo Exp $
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $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 $
|
||||
*
|
||||
* 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 "sequence of 2-hex-digits representing unsigned characters.";
|
||||
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 "LITTLE_ENDIAN: ", custom("sysinfo", "LITTLE_ENDIAN");
|
||||
print "LONG_BITS: ", custom("sysinfo", "LONG_BITS");
|
||||
print "LONGLONG_BITS: ", custom("sysinfo", "LONGLONG_BITS");
|
||||
print "Calc sizes:";
|
||||
show sizes;
|
||||
|
9
endian.c
9
endian.c
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: endian.c,v 29.3 2001/03/18 02:59:42 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: endian.c,v 29.4 2003/01/14 01:50:01 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/endian.c,v $
|
||||
*
|
||||
* Under source code control: 1993/11/15 04:32:58
|
||||
@@ -36,6 +36,11 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "have_stdlib.h"
|
||||
#if defined(HAVE_STDLIB_H)
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#include "have_unistd.h"
|
||||
#if defined(HAVE_UNISTD_H)
|
||||
#include <unistd.h>
|
||||
|
691
file.c
691
file.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* file - file I/O routines callable by users
|
||||
*
|
||||
* Copyright (C) 1999 David I. Bell and Landon Curt Noll
|
||||
* Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
|
||||
*
|
||||
* Primary author: David I. Bell
|
||||
*
|
||||
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.7 $
|
||||
* @(#) $Id: file.c,v 29.7 2001/04/10 22:06:46 chongo Exp $
|
||||
* @(#) $Revision: 29.15 $
|
||||
* @(#) $Id: file.c,v 29.15 2006/05/22 19:04:45 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/file.c,v $
|
||||
*
|
||||
* Under source code control: 1991/07/20 00:21:56
|
||||
@@ -68,11 +68,11 @@ extern FILE *f_open(char *name, char *mode);
|
||||
*/
|
||||
static FILEIO files[MAXFILES] = {
|
||||
{FILEID_STDIN, NULL, (dev_t)0, (ino_t)0,
|
||||
"(stdin)", TRUE, FALSE, 'r', "r"},
|
||||
"(stdin)", TRUE, FALSE, FALSE, FALSE, 'r', "r"},
|
||||
{FILEID_STDOUT, NULL, (dev_t)0, (ino_t)0,
|
||||
"(stdout)", FALSE, TRUE, 'w', "w"},
|
||||
"(stdout)", FALSE, TRUE, FALSE, FALSE, 'w', "w"},
|
||||
{FILEID_STDERR, NULL, (dev_t)0, (ino_t)0,
|
||||
"(stderr)", FALSE, TRUE, 'w', "w"}
|
||||
"(stderr)", FALSE, TRUE, FALSE, FALSE, 'w', "w"}
|
||||
};
|
||||
|
||||
|
||||
@@ -188,14 +188,141 @@ file_init(void)
|
||||
|
||||
|
||||
/*
|
||||
* Open the specified file name for reading or writing; mode is assumed
|
||||
* to be one of "r", "w", "a", "r+", "w+", "a+".
|
||||
* Returns a file id which can be used to do I/O to the file, or else
|
||||
* FILEID_NONE if the open failed.
|
||||
* init_fileio - initialize a FILEIO structure
|
||||
*
|
||||
* This function initializes a calc FILEIO structure. It will optionally
|
||||
* malloc the filename string if given an non-NULL associated filename.
|
||||
* It will canonicalize the file open mode string.
|
||||
*
|
||||
* given:
|
||||
* fiop pointer to FILEIO structure to initialize
|
||||
* name associated filename (NULL => caller will setup filename)
|
||||
* mode open mode (one of {r,w,a}{,b}{,+})
|
||||
* sbufp pointer to stat of open file
|
||||
* id calc file ID
|
||||
* fp open file stream
|
||||
*/
|
||||
static void
|
||||
init_fileio(FILEIO *fiop, char *name, char *mode,
|
||||
struct stat *sbufp, FILEID id, FILE *fp)
|
||||
{
|
||||
char modestr[sizeof(fiop->mode)]; /* mode [rwa]b?\+? */
|
||||
size_t namelen; /* length of name */
|
||||
|
||||
/* allocate filename if requested */
|
||||
if (name != NULL) {
|
||||
namelen = strlen(name);
|
||||
fiop->name = (char *)malloc(namelen + 1);
|
||||
if (fiop->name == NULL) {
|
||||
math_error("No memory for filename");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
}
|
||||
|
||||
/* initialize FILEIO structure */
|
||||
if (name != NULL) {
|
||||
strncpy(fiop->name, name, namelen+1);
|
||||
}
|
||||
fiop->id = id;
|
||||
fiop->fp = fp;
|
||||
fiop->dev = sbufp->st_dev;
|
||||
fiop->inode = sbufp->st_ino;
|
||||
fiop->reading = FALSE;
|
||||
fiop->writing = FALSE;
|
||||
fiop->appending = FALSE;
|
||||
fiop->binary = FALSE;
|
||||
fiop->action = 0;
|
||||
fiop->mode[0] = '\0';
|
||||
|
||||
/*
|
||||
* determine file open mode
|
||||
*
|
||||
* While a leading 'r' is for reading and a leading 'w' is
|
||||
* for writing, the presense of a '+' in the string means
|
||||
* both reading and writing. A leading 'a' means append
|
||||
* which is writing.
|
||||
*/
|
||||
/* canonicalize read modes */
|
||||
if (mode[0] == 'r') {
|
||||
|
||||
/* note read mode */
|
||||
strcpy(modestr, "r");
|
||||
fiop->reading = TRUE;
|
||||
|
||||
/* note binary mode even though mode is not used / ignored */
|
||||
if (strchr(mode, 'b') != NULL) {
|
||||
strcat(modestr, "b");
|
||||
}
|
||||
|
||||
/* note if reading and writing */
|
||||
if (strchr(mode, '+') != NULL) {
|
||||
fiop->writing = TRUE;
|
||||
strcat(modestr, "+");
|
||||
}
|
||||
|
||||
/* canonicalize write modes */
|
||||
} else if (mode[0] == 'w') {
|
||||
|
||||
/* note write mode */
|
||||
strcpy(modestr, "w");
|
||||
fiop->writing = TRUE;
|
||||
|
||||
/* note binary mode even though mode is not used / ignored */
|
||||
if (strchr(mode, 'b') != NULL) {
|
||||
strcat(modestr, "b");
|
||||
}
|
||||
|
||||
/* note if reading and writing */
|
||||
if (strchr(mode, '+') != NULL) {
|
||||
fiop->reading = TRUE;
|
||||
strcat(modestr, "+");
|
||||
}
|
||||
|
||||
/* canonicalize append modes */
|
||||
} else if (mode[0] == 'a') {
|
||||
|
||||
/* note append mode */
|
||||
strcpy(modestr, "a");
|
||||
fiop->writing = TRUE;
|
||||
fiop->appending = TRUE;
|
||||
|
||||
/* note binary mode even though mode is not used / ignored */
|
||||
if (strchr(mode, 'b') != NULL) {
|
||||
strcat(modestr, "b");
|
||||
}
|
||||
|
||||
/* note if reading and writing */
|
||||
if (strchr(mode, '+') != NULL) {
|
||||
fiop->reading = TRUE;
|
||||
strcat(modestr, "+");
|
||||
}
|
||||
|
||||
/* canonicalize no I/O modes */
|
||||
} else {
|
||||
modestr[0] = '\0';
|
||||
}
|
||||
modestr[sizeof(modestr)-1] = '\0'; /* firewall */
|
||||
|
||||
/* record canonical open mode string */
|
||||
strncpy(fiop->mode, modestr, sizeof(fiop->mode));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* openid - open the specified file name for reading or writing
|
||||
*
|
||||
* given:
|
||||
* name file name
|
||||
* mode open mode
|
||||
* mode open mode (one of {r,w,a}{,b}{,+})
|
||||
*
|
||||
* returns:
|
||||
* >=3 FILEID which can be used to do I/O to the file
|
||||
* <0 if the open failed
|
||||
*
|
||||
* NOTE: This function will not return 0, 1 or 2 since they are
|
||||
* reserved for stdin, stdout, stderr. In fact, it must not
|
||||
* return 0, 1, or 2 because it will confuse those who call
|
||||
* the opensearchfiile() function
|
||||
*/
|
||||
FILEID
|
||||
openid(char *name, char *mode)
|
||||
@@ -206,9 +333,9 @@ openid(char *name, char *mode)
|
||||
struct stat sbuf; /* file status */
|
||||
int i;
|
||||
|
||||
/* find the next open slot in the files array */
|
||||
if (idnum >= MAXFILES)
|
||||
return -E_FOPEN3;
|
||||
|
||||
return -E_MANYOPEN;
|
||||
fiop = &files[3];
|
||||
for (i = 3; i < MAXFILES; fiop++,i++) {
|
||||
if (fiop->name == NULL)
|
||||
@@ -217,8 +344,8 @@ openid(char *name, char *mode)
|
||||
if (i == MAXFILES)
|
||||
math_error("This should not happen in openid()!!!");
|
||||
|
||||
/* open the file */
|
||||
fp = f_open(name, mode);
|
||||
|
||||
if (fp == NULL) {
|
||||
return FILEID_NONE;
|
||||
}
|
||||
@@ -227,50 +354,88 @@ openid(char *name, char *mode)
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
fiop->name = (char *)malloc(strlen(name) + 1);
|
||||
if (fiop->name == NULL) {
|
||||
math_error("No memory for filename");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
/* get a new FILEID */
|
||||
id = ++lastid;
|
||||
ioindex[idnum++] = i;
|
||||
|
||||
strcpy(fiop->name, name);
|
||||
fiop->id = id;
|
||||
fiop->fp = fp;
|
||||
fiop->dev = sbuf.st_dev;
|
||||
fiop->inode = sbuf.st_ino;
|
||||
fiop->reading = TRUE;
|
||||
fiop->writing = TRUE;
|
||||
fiop->action = 0;
|
||||
/* initialize FILEIO structure */
|
||||
init_fileio(fiop, name, mode, &sbuf, id, fp);
|
||||
|
||||
/*
|
||||
* determine file open mode
|
||||
*
|
||||
* While a leading 'r' is for reading and a leading 'w' is
|
||||
* for writing, the presense of a '+' in the string means
|
||||
* both reading and writing. A leading 'a' means append
|
||||
* which is writing.
|
||||
*/
|
||||
if (mode[0] == 'r') {
|
||||
fiop->reading = TRUE;
|
||||
if (strchr(mode, '+') == NULL) {
|
||||
fiop->writing = FALSE;
|
||||
} else {
|
||||
fiop->writing = TRUE;
|
||||
}
|
||||
} else if (mode[0] == 'w' || mode[0] == 'a') {
|
||||
fiop->writing = TRUE;
|
||||
if (strchr(mode, '+') == NULL) {
|
||||
fiop->reading = FALSE;
|
||||
} else {
|
||||
fiop->reading = TRUE;
|
||||
}
|
||||
} else {
|
||||
fiop->reading = FALSE;
|
||||
fiop->writing = FALSE;
|
||||
/* return calc open file ID */
|
||||
return id;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* openpathid - open the specified abse filename, or relative filename along a search path
|
||||
*
|
||||
* given:
|
||||
* name file name
|
||||
* mode open mode (one of {r,w,a}{,b}{,+})
|
||||
* pathlist list of colon separated paths (or NULL)
|
||||
*
|
||||
* returns:
|
||||
* >=3 FILEID which can be used to do I/O to the file
|
||||
* <0 if the open failed
|
||||
*
|
||||
* NOTE: This function will not return 0, 1 or 2 since they are
|
||||
* reserved for stdin, stdout, stderr. In fact, it must not
|
||||
* return 0, 1, or 2 because it will confuse those who call
|
||||
* the opensearchfiile() function
|
||||
*/
|
||||
FILEID
|
||||
openpathid(char *name, char *mode, char *pathlist)
|
||||
{
|
||||
FILEIO *fiop; /* file structure */
|
||||
FILEID id; /* new file id */
|
||||
FILE *fp;
|
||||
struct stat sbuf; /* file status */
|
||||
char *openpath; /* malloc copy of path that was opened */
|
||||
int i;
|
||||
|
||||
/* find the next open slot in the files array */
|
||||
if (idnum >= MAXFILES)
|
||||
return -E_MANYOPEN;
|
||||
fiop = &files[3];
|
||||
for (i = 3; i < MAXFILES; fiop++,i++) {
|
||||
if (fiop->name == NULL)
|
||||
break;
|
||||
}
|
||||
strcpy(fiop->mode, mode);
|
||||
if (i == MAXFILES)
|
||||
math_error("This should not happen in openpathid()!!!");
|
||||
|
||||
/* open a file - searching along a path */
|
||||
openpath = NULL;
|
||||
fp = f_pathopen(name, mode, pathlist, &openpath);
|
||||
if (fp == NULL) {
|
||||
if (openpath != NULL) {
|
||||
/* should not happen, but just in case */
|
||||
free(openpath);
|
||||
}
|
||||
return FILEID_NONE;
|
||||
}
|
||||
if (fstat(fileno(fp), &sbuf) < 0) {
|
||||
if (openpath != NULL) {
|
||||
free(openpath);
|
||||
}
|
||||
math_error("bad fstat");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
if (openpath == NULL) {
|
||||
fclose(fp);
|
||||
math_error("bad openpath");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
/* get a new FILEID */
|
||||
id = ++lastid;
|
||||
ioindex[idnum++] = i;
|
||||
|
||||
/* initialize FILEIO structure */
|
||||
init_fileio(fiop, NULL, mode, &sbuf, id, fp);
|
||||
fiop->name = openpath; /* already malloced by f_pathopen */
|
||||
|
||||
/* return calc open file ID */
|
||||
return id;
|
||||
}
|
||||
|
||||
@@ -279,16 +444,20 @@ openid(char *name, char *mode)
|
||||
* reopenid - reopen a FILEID
|
||||
*
|
||||
* given:
|
||||
* id FILEID to reopen
|
||||
* mode new mode to open as
|
||||
* name name of new file
|
||||
* id FILEID to reopen
|
||||
* mode new mode to open as
|
||||
* mode new mode to open as (one of "r", "w", "a", "r+", "w+", "a+")
|
||||
* name name of new file
|
||||
*
|
||||
* returns:
|
||||
* FILEID which can be used to do I/O to the file
|
||||
* <0 if the open failed
|
||||
*/
|
||||
FILEID
|
||||
reopenid(FILEID id, char *mode, char *name)
|
||||
{
|
||||
FILEIO *fiop; /* file structure */
|
||||
FILE *fp;
|
||||
char *newname;
|
||||
struct stat sbuf;
|
||||
int i;
|
||||
|
||||
@@ -299,8 +468,8 @@ reopenid(FILEID id, char *mode, char *name)
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
/* reopen the file */
|
||||
fiop = NULL;
|
||||
|
||||
for (i = 3; i < idnum; i++) {
|
||||
fiop = &files[ioindex[i]];
|
||||
if (fiop->id == id)
|
||||
@@ -344,57 +513,23 @@ reopenid(FILEID id, char *mode, char *name)
|
||||
return FILEID_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
if (fstat(fileno(fp), &sbuf) < 0) {
|
||||
math_error("bad fstat");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
if (name) {
|
||||
newname = (char *)malloc(strlen(name) + 1);
|
||||
if (newname == NULL) {
|
||||
math_error("No memory for filename");
|
||||
/*NOTREACHED*/
|
||||
/* initialize FILEIO structure */
|
||||
if (name == NULL) {
|
||||
if (fiop->name == NULL) {
|
||||
math_error("old and new reopen filenames are NULL");
|
||||
}
|
||||
if (fiop->name)
|
||||
free(fiop->name);
|
||||
strcpy(newname, name);
|
||||
fiop->name = newname;
|
||||
} else if (fiop->name != NULL) {
|
||||
free(fiop->name);
|
||||
fiop->name = NULL;
|
||||
}
|
||||
fiop->fp = fp;
|
||||
fiop->dev = sbuf.st_dev;
|
||||
fiop->inode = sbuf.st_ino;
|
||||
fiop->reading = TRUE;
|
||||
fiop->writing = TRUE;
|
||||
fiop->action = 0;
|
||||
init_fileio(fiop, name, mode, &sbuf, id, fp);
|
||||
|
||||
/*
|
||||
* determine file open mode
|
||||
*
|
||||
* While a leading 'r' is for reading and a leading 'w' is
|
||||
* for writing, the presense of a '+' in the string means
|
||||
* both reading and writing. A leading 'a' means append
|
||||
* which is writing.
|
||||
*/
|
||||
if (mode[0] == 'r') {
|
||||
fiop->reading = TRUE;
|
||||
if (strchr(mode, '+') == NULL) {
|
||||
fiop->writing = FALSE;
|
||||
} else {
|
||||
fiop->writing = TRUE;
|
||||
}
|
||||
} else if (mode[0] == 'w' || mode[0] == 'a') {
|
||||
fiop->writing = TRUE;
|
||||
if (strchr(mode, '+') == NULL) {
|
||||
fiop->reading = FALSE;
|
||||
} else {
|
||||
fiop->reading = TRUE;
|
||||
}
|
||||
} else {
|
||||
fiop->reading = FALSE;
|
||||
fiop->writing = FALSE;
|
||||
}
|
||||
strcpy(fiop->mode, mode);
|
||||
/* return calc open file ID */
|
||||
return id;
|
||||
}
|
||||
|
||||
@@ -810,7 +945,7 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
|
||||
VALUE *vp;
|
||||
char *str;
|
||||
int ch;
|
||||
unsigned long len;
|
||||
size_t len;
|
||||
int oldmode, newmode;
|
||||
long olddigits, newdigits;
|
||||
long width, precision;
|
||||
@@ -877,36 +1012,36 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
|
||||
newdigits = precision;
|
||||
|
||||
switch (ch) {
|
||||
case 's':
|
||||
printstring = TRUE;
|
||||
case 'c':
|
||||
printchar = TRUE;
|
||||
case 'd':
|
||||
break;
|
||||
case 'f':
|
||||
newmode = MODE_REAL;
|
||||
break;
|
||||
case 'e':
|
||||
newmode = MODE_EXP;
|
||||
break;
|
||||
case 'r':
|
||||
newmode = MODE_FRAC;
|
||||
break;
|
||||
case 'o':
|
||||
newmode = MODE_OCTAL;
|
||||
break;
|
||||
case 'x':
|
||||
newmode = MODE_HEX;
|
||||
break;
|
||||
case 'b':
|
||||
newmode = MODE_BINARY;
|
||||
break;
|
||||
case 0:
|
||||
math_setfp(stdout);
|
||||
return 0;
|
||||
default:
|
||||
math_chr(ch);
|
||||
continue;
|
||||
case 's':
|
||||
printstring = TRUE;
|
||||
case 'c':
|
||||
printchar = TRUE;
|
||||
case 'd':
|
||||
break;
|
||||
case 'f':
|
||||
newmode = MODE_REAL;
|
||||
break;
|
||||
case 'e':
|
||||
newmode = MODE_EXP;
|
||||
break;
|
||||
case 'r':
|
||||
newmode = MODE_FRAC;
|
||||
break;
|
||||
case 'o':
|
||||
newmode = MODE_OCTAL;
|
||||
break;
|
||||
case 'x':
|
||||
newmode = MODE_HEX;
|
||||
break;
|
||||
case 'b':
|
||||
newmode = MODE_BINARY;
|
||||
break;
|
||||
case 0:
|
||||
math_setfp(stdout);
|
||||
return 0;
|
||||
default:
|
||||
math_chr(ch);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (--count < 0) {
|
||||
@@ -927,41 +1062,41 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
|
||||
if ((width == 0) ||
|
||||
(vp->v_type == V_MAT) || (vp->v_type == V_LIST)) {
|
||||
switch(vp->v_type) {
|
||||
case V_OCTET:
|
||||
if (printstring)
|
||||
math_str((char *)vp->v_octet);
|
||||
else if (printchar)
|
||||
math_chr(*vp->v_octet);
|
||||
else
|
||||
printvalue(vp, PRINT_NORMAL);
|
||||
break;
|
||||
case V_BLOCK:
|
||||
if (printstring)
|
||||
math_str((char *)
|
||||
vp->v_block->data);
|
||||
else if (printchar)
|
||||
math_chr(*vp->v_block->data);
|
||||
else
|
||||
printvalue(vp, PRINT_NORMAL);
|
||||
break;
|
||||
case V_NBLOCK:
|
||||
if (printstring) {
|
||||
if (vp->v_nblock->blk->data !=
|
||||
NULL)
|
||||
math_str((char *)
|
||||
vp->v_nblock
|
||||
->blk->data);
|
||||
} else if (printchar) {
|
||||
if (vp->v_nblock->blk->data !=
|
||||
NULL)
|
||||
math_chr(*vp->v_nblock->
|
||||
blk->data);
|
||||
} else {
|
||||
printvalue(vp, PRINT_NORMAL);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
case V_OCTET:
|
||||
if (printstring)
|
||||
math_str((char *)vp->v_octet);
|
||||
else if (printchar)
|
||||
math_chr(*vp->v_octet);
|
||||
else
|
||||
printvalue(vp, PRINT_NORMAL);
|
||||
break;
|
||||
case V_BLOCK:
|
||||
if (printstring)
|
||||
math_str((char *)
|
||||
vp->v_block->data);
|
||||
else if (printchar)
|
||||
math_chr(*vp->v_block->data);
|
||||
else
|
||||
printvalue(vp, PRINT_NORMAL);
|
||||
break;
|
||||
case V_NBLOCK:
|
||||
if (printstring) {
|
||||
if (vp->v_nblock->blk->data !=
|
||||
NULL)
|
||||
math_str((char *)
|
||||
vp->v_nblock
|
||||
->blk->data);
|
||||
} else if (printchar) {
|
||||
if (vp->v_nblock->blk->data !=
|
||||
NULL)
|
||||
math_chr(*vp->v_nblock->
|
||||
blk->data);
|
||||
} else {
|
||||
printvalue(vp, PRINT_NORMAL);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printvalue(vp, PRINT_NORMAL);
|
||||
}
|
||||
|
||||
math_setmode(oldmode);
|
||||
@@ -1014,13 +1149,13 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
|
||||
if (strchr(str, '\n'))
|
||||
width = 0;
|
||||
len = strlen(str);
|
||||
while (!didneg && (width > len)) {
|
||||
while (!didneg && ((size_t)width > len)) {
|
||||
width--;
|
||||
math_chr(' ');
|
||||
}
|
||||
math_str(str);
|
||||
free(str);
|
||||
while (didneg && (width > len)) {
|
||||
while (didneg && ((size_t)width > len)) {
|
||||
width--;
|
||||
math_chr(' ');
|
||||
}
|
||||
@@ -1414,52 +1549,52 @@ fseekid(FILEID id, ZVALUE offset, int whence)
|
||||
|
||||
/* seek depending on whence */
|
||||
switch (whence) {
|
||||
case 0:
|
||||
/* construct seek position, off = offset */
|
||||
if (zisneg(offset))
|
||||
return -3;
|
||||
off = z2filepos(offset);
|
||||
case 0:
|
||||
/* construct seek position, off = offset */
|
||||
if (zisneg(offset))
|
||||
return -3;
|
||||
off = z2filepos(offset);
|
||||
|
||||
/* seek there */
|
||||
ret = f_seek_set(fiop->fp, &off);
|
||||
break;
|
||||
/* seek there */
|
||||
ret = f_seek_set(fiop->fp, &off);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
/* construct seek position, off = cur+offset */
|
||||
f_tell(fiop->fp, &off);
|
||||
cur = filepos2z(off);
|
||||
zadd(cur, offset, &tmp);
|
||||
zfree(cur);
|
||||
if (zisneg(tmp)) {
|
||||
zfree(tmp);
|
||||
return -3;
|
||||
}
|
||||
off = z2filepos(tmp);
|
||||
case 1:
|
||||
/* construct seek position, off = cur+offset */
|
||||
f_tell(fiop->fp, &off);
|
||||
cur = filepos2z(off);
|
||||
zadd(cur, offset, &tmp);
|
||||
zfree(cur);
|
||||
if (zisneg(tmp)) {
|
||||
zfree(tmp);
|
||||
return -3;
|
||||
}
|
||||
off = z2filepos(tmp);
|
||||
zfree(tmp);
|
||||
|
||||
/* seek there */
|
||||
ret = f_seek_set(fiop->fp, &off);
|
||||
break;
|
||||
/* seek there */
|
||||
ret = f_seek_set(fiop->fp, &off);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
/* construct seek position, off = len+offset */
|
||||
if (get_open_siz(fiop->fp, &cur) < 0)
|
||||
return -4;
|
||||
zadd(cur, offset, &tmp);
|
||||
zfree(cur);
|
||||
if (zisneg(tmp)) {
|
||||
zfree(tmp);
|
||||
return -3;
|
||||
}
|
||||
off = z2filepos(tmp);
|
||||
case 2:
|
||||
/* construct seek position, off = len+offset */
|
||||
if (get_open_siz(fiop->fp, &cur) < 0)
|
||||
return -4;
|
||||
zadd(cur, offset, &tmp);
|
||||
zfree(cur);
|
||||
if (zisneg(tmp)) {
|
||||
zfree(tmp);
|
||||
return -3;
|
||||
}
|
||||
off = z2filepos(tmp);
|
||||
zfree(tmp);
|
||||
|
||||
/* seek there */
|
||||
ret = f_seek_set(fiop->fp, &off);
|
||||
break;
|
||||
/* seek there */
|
||||
ret = f_seek_set(fiop->fp, &off);
|
||||
break;
|
||||
|
||||
default:
|
||||
return -5;
|
||||
default:
|
||||
return -5;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -1828,7 +1963,7 @@ showfiles(void)
|
||||
FILE *fp;
|
||||
struct stat sbuf;
|
||||
ino_t inodes[MAXFILES];
|
||||
long sizes[MAXFILES];
|
||||
off_t sizes[MAXFILES];
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < idnum; i++) {
|
||||
@@ -1840,7 +1975,7 @@ showfiles(void)
|
||||
sizes[i] = -1;
|
||||
} else {
|
||||
inodes[i] = sbuf.st_ino;
|
||||
sizes[i] = (long) sbuf.st_size;
|
||||
sizes[i] = sbuf.st_size;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < idnum; i++) {
|
||||
@@ -1853,7 +1988,7 @@ showfiles(void)
|
||||
math_chr('\n');
|
||||
continue;
|
||||
}
|
||||
printf(" size = %ld\n", sizes[i]);
|
||||
printf(" size = %lld\n", (long long int)sizes[i]);
|
||||
for (j = i + 1; j < idnum; j++) {
|
||||
if (listed[j] || sizes[j] == -1)
|
||||
continue;
|
||||
@@ -2040,7 +2175,7 @@ fscanfile(FILE *fp, char *fmt, int count, VALUE **vals)
|
||||
BOOL skip; /* True if string to be skipped rather than read */
|
||||
int width;
|
||||
VALUE *var; /* lvalue to be assigned to */
|
||||
short subtype; /* for var->v_subtype */
|
||||
unsigned short subtype; /* for var->v_subtype */
|
||||
FILEPOS cur; /* current location */
|
||||
|
||||
if (feof(fp))
|
||||
@@ -2083,75 +2218,75 @@ fscanfile(FILE *fp, char *fmt, int count, VALUE **vals)
|
||||
f = *fmt++;
|
||||
}
|
||||
switch (f) {
|
||||
case 'c':
|
||||
if (width == 0)
|
||||
width = 1;
|
||||
getscanfield(fp,skip,width,0,NULL,&str);
|
||||
break;
|
||||
case 's':
|
||||
getscanwhite(fp,1,0,6,NULL);
|
||||
if (feof(fp))
|
||||
return assnum;
|
||||
getscanwhite(fp,skip,width,-6,&str);
|
||||
break;
|
||||
case '[':
|
||||
f = *fmt;
|
||||
comp = (f == '^');
|
||||
if (comp)
|
||||
f = *++fmt;
|
||||
scanptr = fmt;
|
||||
if (f == '\0')
|
||||
return assnum;
|
||||
fmt = strchr((f == ']' ? fmt + 1 : fmt), ']');
|
||||
if (fmt == NULL)
|
||||
return assnum;
|
||||
scannum = fmt - scanptr;
|
||||
if (comp)
|
||||
scannum = -scannum;
|
||||
fmt++;
|
||||
getscanfield(fp,skip,
|
||||
width,scannum,scanptr,&str);
|
||||
break;
|
||||
case 'f':
|
||||
case 'e':
|
||||
case 'r':
|
||||
case 'i':
|
||||
getscanwhite(fp,1,0,6, NULL);
|
||||
if (feof(fp))
|
||||
return assnum;
|
||||
if (skip) {
|
||||
fskipnum(fp);
|
||||
continue;
|
||||
}
|
||||
assnum++;
|
||||
var = *vals++;
|
||||
if (var->v_type != V_ADDR)
|
||||
math_error("This should not happen!!");
|
||||
var = var->v_addr;
|
||||
subtype = var->v_subtype;
|
||||
freevalue(var);
|
||||
count--;
|
||||
freadsum(fp, var);
|
||||
var->v_subtype = subtype;
|
||||
continue;
|
||||
case 'n':
|
||||
assnum++;
|
||||
var = *vals++;
|
||||
count--;
|
||||
if (var->v_type != V_ADDR)
|
||||
math_error("This should not happen!!");
|
||||
var = var->v_addr;
|
||||
subtype = var->v_subtype;
|
||||
freevalue(var);
|
||||
var->v_type = V_NUM;
|
||||
var->v_num = qalloc();
|
||||
f_tell(fp, &cur);
|
||||
var->v_num->num = filepos2z(cur);
|
||||
var->v_subtype = subtype;
|
||||
continue;
|
||||
default:
|
||||
fprintf(stderr, "Unsupported scan specifier");
|
||||
case 'c':
|
||||
if (width == 0)
|
||||
width = 1;
|
||||
getscanfield(fp,skip,width,0,NULL,&str);
|
||||
break;
|
||||
case 's':
|
||||
getscanwhite(fp,1,0,6,NULL);
|
||||
if (feof(fp))
|
||||
return assnum;
|
||||
getscanwhite(fp,skip,width,-6,&str);
|
||||
break;
|
||||
case '[':
|
||||
f = *fmt;
|
||||
comp = (f == '^');
|
||||
if (comp)
|
||||
f = *++fmt;
|
||||
scanptr = fmt;
|
||||
if (f == '\0')
|
||||
return assnum;
|
||||
fmt = strchr((f == ']' ? fmt + 1 : fmt), ']');
|
||||
if (fmt == NULL)
|
||||
return assnum;
|
||||
scannum = fmt - scanptr;
|
||||
if (comp)
|
||||
scannum = -scannum;
|
||||
fmt++;
|
||||
getscanfield(fp,skip,
|
||||
width,scannum,scanptr,&str);
|
||||
break;
|
||||
case 'f':
|
||||
case 'e':
|
||||
case 'r':
|
||||
case 'i':
|
||||
getscanwhite(fp,1,0,6, NULL);
|
||||
if (feof(fp))
|
||||
return assnum;
|
||||
if (skip) {
|
||||
fskipnum(fp);
|
||||
continue;
|
||||
}
|
||||
assnum++;
|
||||
var = *vals++;
|
||||
if (var->v_type != V_ADDR)
|
||||
math_error("This should not happen!!");
|
||||
var = var->v_addr;
|
||||
subtype = var->v_subtype;
|
||||
freevalue(var);
|
||||
count--;
|
||||
freadsum(fp, var);
|
||||
var->v_subtype = subtype;
|
||||
continue;
|
||||
case 'n':
|
||||
assnum++;
|
||||
var = *vals++;
|
||||
count--;
|
||||
if (var->v_type != V_ADDR)
|
||||
math_error("This should not happen!!");
|
||||
var = var->v_addr;
|
||||
subtype = var->v_subtype;
|
||||
freevalue(var);
|
||||
var->v_type = V_NUM;
|
||||
var->v_num = qalloc();
|
||||
f_tell(fp, &cur);
|
||||
var->v_num->num = filepos2z(cur);
|
||||
var->v_subtype = subtype;
|
||||
continue;
|
||||
default:
|
||||
fprintf(stderr, "Unsupported scan specifier");
|
||||
return assnum;
|
||||
}
|
||||
if (!skip) {
|
||||
assnum++;
|
||||
|
23
file.h
23
file.h
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* file - file I/O routines callable by users
|
||||
*
|
||||
* Copyright (C) 1999 David I. Bell and Landon Curt Noll
|
||||
* Copyright (C) 1999-2006 David I. Bell and Landon Curt Noll
|
||||
*
|
||||
* Primary author: David I. Bell
|
||||
*
|
||||
@@ -19,8 +19,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: file.h,v 29.4 2001/05/29 00:16:53 chongo Exp $
|
||||
* @(#) $Revision: 29.8 $
|
||||
* @(#) $Id: file.h,v 29.8 2006/05/19 15:26:10 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/file.h,v $
|
||||
*
|
||||
* Under source code control: 1996/05/24 05:55:58
|
||||
@@ -35,7 +35,7 @@
|
||||
#define __FILE_H__
|
||||
|
||||
|
||||
#if defined(SRC) /* if we are building from the calc source tree */
|
||||
#if defined(CALC_SRC) /* if we are building from the calc source tree */
|
||||
# include "have_fpos.h"
|
||||
#else
|
||||
# include <calc/have_fpos.h>
|
||||
@@ -53,8 +53,10 @@ typedef struct {
|
||||
char *name; /* file name */
|
||||
BOOL reading; /* TRUE if opened for reading */
|
||||
BOOL writing; /* TRUE if opened for writing */
|
||||
BOOL appending; /* TRUE if also opened for appending */
|
||||
BOOL binary; /* TRUE if binary mode - mode ignored/unused */
|
||||
char action; /* most recent use for 'r', 'w' or 0 */
|
||||
char mode[sizeof("rb+")];/* open mode */
|
||||
char mode[sizeof("rb+")+1];/* open mode */
|
||||
} FILEIO;
|
||||
|
||||
|
||||
@@ -89,11 +91,12 @@ typedef struct {
|
||||
/*
|
||||
* external functions
|
||||
*/
|
||||
extern FILEIO * findid(FILEID id, int writable);
|
||||
extern int fgetposid(FILEID id, FILEPOS *ptr);
|
||||
extern int fsetposid(FILEID id, FILEPOS *ptr);
|
||||
extern int get_open_siz(FILE *fp, ZVALUE *res);
|
||||
extern char* findfname(FILEID);
|
||||
extern DLL FILEIO * findid(FILEID id, int writable);
|
||||
extern DLL int fgetposid(FILEID id, FILEPOS *ptr);
|
||||
extern DLL int fsetposid(FILEID id, FILEPOS *ptr);
|
||||
extern DLL int get_open_siz(FILE *fp, ZVALUE *res);
|
||||
extern DLL char* findfname(FILEID);
|
||||
extern DLL FILE *f_pathopen(char *name, char *mode, char *pathlist, char **openpath);
|
||||
|
||||
|
||||
#endif /* !__FILE_H__ */
|
||||
|
6
func.h
6
func.h
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: func.h,v 29.3 2001/05/29 00:16:53 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: func.h,v 29.4 2001/06/08 21:00:58 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/func.h,v $
|
||||
*
|
||||
* Under source code control: 1990/02/15 01:48:33
|
||||
@@ -32,7 +32,7 @@
|
||||
#define __FUNC_H__
|
||||
|
||||
|
||||
#if defined(SRC) /* if we are building from the calc source tree */
|
||||
#if defined(CALC_SRC) /* if we are building from the calc source tree */
|
||||
# include "calc.h"
|
||||
# include "label.h"
|
||||
#else
|
||||
|
21
hash.c
21
hash.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* hash - one-way hash routines
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999-2006 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: hash.c,v 29.4 2001/04/14 22:47:21 chongo Exp $
|
||||
* @(#) $Revision: 29.10 $
|
||||
* @(#) $Id: hash.c,v 29.10 2006/06/20 10:25:45 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/hash.c,v $
|
||||
*
|
||||
* Under source code control: 1995/11/23 05:13:11
|
||||
@@ -596,7 +596,7 @@ hash_complex(int type, void *c, HASH *state)
|
||||
HASH *
|
||||
hash_str(int type, char *str, HASH *state)
|
||||
{
|
||||
USB32 len; /* string length */
|
||||
size_t len; /* string length */
|
||||
|
||||
/*
|
||||
* initialize if state is NULL
|
||||
@@ -941,6 +941,7 @@ hash_value(int type, void *v, HASH *state)
|
||||
|
||||
/* hash the CONFIG 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_number(type, value->v_config->epsilon, state);
|
||||
state = hash_long(type,
|
||||
@@ -984,7 +985,19 @@ hash_value(int type, void *v, HASH *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->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_int(type, value->v_config->baseb, state);
|
||||
state = hash_bool(type, value->v_config->redecl_warn, state);
|
||||
state = hash_bool(type, value->v_config->dupvar_warn, state);
|
||||
break;
|
||||
|
||||
case V_HASH:
|
||||
|
6
hash.h
6
hash.h
@@ -17,8 +17,8 @@
|
||||
* received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* @(#) $Revision: 29.3 $
|
||||
* @(#) $Id: hash.h,v 29.3 2001/05/29 00:16:53 chongo Exp $
|
||||
* @(#) $Revision: 29.4 $
|
||||
* @(#) $Id: hash.h,v 29.4 2001/06/08 21:00:58 chongo Exp $
|
||||
* @(#) $Source: /usr/local/src/cmd/calc/RCS/hash.h,v $
|
||||
*
|
||||
* Under source code control: 1995/11/14 23:57:45
|
||||
@@ -33,7 +33,7 @@
|
||||
#define __HASH_H__
|
||||
|
||||
|
||||
#if defined(SRC) /* if we are building from the calc source tree */
|
||||
#if defined(CALC_SRC) /* if we are building from the calc source tree */
|
||||
# include "shs.h"
|
||||
# include "shs1.h"
|
||||
# include "md5.h"
|
||||
|
89
have_unused.c
Normal file
89
have_unused.c
Normal 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;
|
||||
}
|
325
help/Makefile
325
help/Makefile
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# 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
|
||||
# the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -18,8 +18,8 @@
|
||||
# received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# @(#) $Revision: 29.13 $
|
||||
# @(#) $Id: Makefile,v 29.13 2001/05/29 00:41:11 chongo Exp $
|
||||
# @(#) $Revision: 29.28 $
|
||||
# @(#) $Id: Makefile,v 29.28 2006/05/07 12:59:51 chongo Exp $
|
||||
# @(#) $Source: /usr/local/src/cmd/calc/help/RCS/Makefile,v $
|
||||
#
|
||||
# Under source code control: 1991/07/23 06:47:57
|
||||
@@ -36,16 +36,120 @@
|
||||
SHELL= /bin/sh
|
||||
MAKE_FILE = Makefile
|
||||
|
||||
# ${SHAREDIR} where most common shared files are kept
|
||||
#
|
||||
# ${CSHAREDIR} where most common shared calc files are kept
|
||||
# ${HELPDIR} where the help directory is installed.
|
||||
#
|
||||
#SHAREDIR= /usr/local/lib
|
||||
SHAREDIR= /usr/share
|
||||
####
|
||||
# Normally, the upper level makefile will set these values. We provide
|
||||
# a default here just in case you want to build from this directory.
|
||||
####
|
||||
|
||||
CSHAREDIR= ${SHAREDIR}/calc
|
||||
HELPDIR= ${CSHAREDIR}/help
|
||||
# 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
|
||||
#
|
||||
@@ -66,6 +170,19 @@ SORT= sort
|
||||
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
|
||||
#
|
||||
STD_HELP_FILES_1= intro overview help
|
||||
@@ -141,32 +258,41 @@ BLT_HELP_FILES= ${BLT_HELP_FILES_3} ${BLT_HELP_FILES_5} \
|
||||
|
||||
# This list is prodiced by the detaillist rule when no WARNINGS are detected.
|
||||
#
|
||||
# Please use:
|
||||
#
|
||||
# make detaillist
|
||||
#
|
||||
# to keep this list in nice sorted order and to check that these
|
||||
# non-special help files are under RCS control.
|
||||
#
|
||||
DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \
|
||||
appr arg argv arrow asec asech asin asinh assign atan atan2 atanh avg \
|
||||
base bernoulli bit blk blkcpy blkfree blocks bround btrunc calc_tty \
|
||||
calclevel catalan ceil cfappr cfsim char cmdbuf cmp comb conj cos \
|
||||
cosh cot coth count cp csc csch ctime delete den dereference det \
|
||||
digit digits dp epsilon errcount errmax errno error euler eval \
|
||||
exp fact factor fclose fcnt feof ferror fflush fgetc fgetfield \
|
||||
fgetline fgets fgetstr fib files floor fopen forall fprintf fputc \
|
||||
fputs fputstr frac free freebernoulli freeeuler freeglobals freeredc \
|
||||
freestatics frem freopen fscan fscanf fseek fsize ftell gcd gcdrem \
|
||||
gd getenv hash head highbit hmean hnrmod hypot ilog ilog10 ilog2 \
|
||||
im indices inputlevel insert int inverse iroot isassoc isatty isblk \
|
||||
isconfig isdefined iserror iseven isfile ishash isident isint islist \
|
||||
ismat ismult isnull isnum isobj isobjtype isodd isprime isptr isqrt \
|
||||
isrand israndom isreal isrel issimple issq isstr istype jacobi join \
|
||||
lcm lcmfact lfactor ln lowbit ltol makelist matdim matfill matmax \
|
||||
matmin matsum mattrace mattrans max md5 memsize meq min minv mmin \
|
||||
mne mod modify name near newerror nextcand nextprime norm null \
|
||||
num oldvalue ord param perm pfact pi pix places pmod polar poly \
|
||||
pop popcnt power prevcand prevprime printf prompt protect ptest \
|
||||
push putenv quo quomod rand randbit random randombit randperm rcin \
|
||||
rcmul rcout rcpow rcsq re remove reverse rewind rm root round rsearch \
|
||||
runtime saveval scale scan scanf search sec sech seed segment select \
|
||||
sgn sha sha1 sin sinh size sizeof sleep sort sqrt srand srandom \
|
||||
ssq str strcat strerror strlen strpos strprintf strscan strscanf \
|
||||
substr sum swap system tail tan tanh test time trunc version xor
|
||||
appr arg argv arrow asec asech asin asinh assign atan atan2 atanh \
|
||||
avg base base2 bernoulli bit blk blkcpy blkfree blocks bround btrunc \
|
||||
calc_tty calclevel catalan ceil cfappr cfsim char cmdbuf cmp comb \
|
||||
conj cos cosh cot coth count cp csc csch ctime delete den dereference \
|
||||
det digit digits display dp epsilon errcount errmax errno error \
|
||||
euler eval exp fact factor fclose fcnt feof ferror fflush fgetc \
|
||||
fgetfield fgetline fgets fgetstr fib files floor fopen forall \
|
||||
fpathopen fprintf fputc fputs fputstr frac free freebernoulli \
|
||||
freeeuler freeglobals freeredc freestatics frem freopen fscan \
|
||||
fscanf fseek fsize ftell gcd gcdrem gd getenv hash head highbit \
|
||||
hmean hnrmod hypot ilog ilog10 ilog2 im indices inputlevel insert \
|
||||
int inverse iroot isassoc isatty isblk isconfig isdefined iserror \
|
||||
iseven isfile ishash isident isint islist ismat ismult isnull isnum \
|
||||
isobj isobjtype isodd isprime isptr isqrt isrand israndom isreal \
|
||||
isrel issimple issq isstr istype jacobi join lcm lcmfact lfactor \
|
||||
ln log lowbit ltol makelist matdim matfill matmax matmin matsum \
|
||||
mattrace mattrans max md5 memsize meq min minv mmin mne mod modify \
|
||||
name near newerror nextcand nextprime norm null num oldvalue ord \
|
||||
param perm pfact pi pix places pmod polar poly pop popcnt power \
|
||||
prevcand prevprime printf prompt protect ptest push putenv quo \
|
||||
quomod rand randbit random randombit randperm rcin rcmul rcout \
|
||||
rcpow rcsq re remove reverse rewind rm root round rsearch runtime \
|
||||
saveval scale scan scanf search sec sech seed segment select sgn \
|
||||
sha sha1 sin sinh size sizeof sleep sort sqrt srand srandom ssq \
|
||||
str strcat strcmp strcpy strerror strlen strncmp strncpy strpos \
|
||||
strprintf strscan strscanf substr sum swap system tail tan tanh \
|
||||
test time trunc version xor
|
||||
|
||||
# This list is of files that are clones of DETAIL_HELP files. They are
|
||||
# built from DETAIL_HELP files.
|
||||
@@ -240,7 +366,8 @@ changes: ../CHANGES
|
||||
|
||||
libcalc: ../LIBRARY
|
||||
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 $@
|
||||
-@if [ -z "${Q}" ]; then \
|
||||
echo ''; \
|
||||
@@ -391,11 +518,13 @@ full: ${FULL_HELP_FILES} ${MAKE_FILE}
|
||||
# Singular files are the same files as their plural form.
|
||||
#
|
||||
${SINGULAR_FILES}: ${PLURAL_FILES}
|
||||
${Q}for i in ${SINGULAR_FILES}; do \
|
||||
echo "rm -f $${i}"; \
|
||||
rm -f $${i}; \
|
||||
echo "cp $${i}s $${i}"; \
|
||||
cp $${i}s $${i}; \
|
||||
${Q}for i in ${SINGULAR_FILES} /dev/null; do \
|
||||
if [ X"$$i" != X"/dev/null" ]; then \
|
||||
echo "rm -f $${i}"; \
|
||||
rm -f $${i}; \
|
||||
echo "cp $${i}s $${i}"; \
|
||||
cp $${i}s $${i}; \
|
||||
fi; \
|
||||
done
|
||||
-@if [ -z "${Q}" ]; then \
|
||||
echo ''; \
|
||||
@@ -427,12 +556,13 @@ builtin: builtin.top builtin.end ../func.c funclist.sed
|
||||
${Q}echo "forming builtin help file"
|
||||
-${Q}rm -f funclist.c
|
||||
${Q}${SED} -n -f funclist.sed ../func.c > funclist.c
|
||||
-${Q}rm -f funclist.o funclist
|
||||
${Q}${LCC} ${ICFLAGS} -DFUNCLIST -I/usr/include -I.. funclist.c -c
|
||||
${Q}${LCC} ${ILDFLAGS} funclist.o -o funclist
|
||||
-${Q}rm -f funclist.o funclist${EXT}
|
||||
${Q}${LCC} ${ICFLAGS} -DFUNCLIST -I/usr/include \
|
||||
-I.. funclist.c -c 2>/dev/null
|
||||
${Q}${LCC} ${ILDFLAGS} funclist.o -o funclist${EXT}
|
||||
-${Q}rm -f builtin
|
||||
${Q}cat builtin.top > builtin
|
||||
${Q}./funclist | \
|
||||
${Q}./funclist${EXT} | \
|
||||
${SED} -e 's/^/ /' -e 's/[ ][ ]*$$//' >> builtin
|
||||
${Q}cat builtin.end >> builtin
|
||||
${Q}echo "builtin help file formed"
|
||||
@@ -455,8 +585,10 @@ builtin: builtin.top builtin.end ../func.c funclist.sed
|
||||
##
|
||||
|
||||
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; \
|
||||
fi; \
|
||||
done | LANG=C ${SORT}
|
||||
|
||||
distdir:
|
||||
@@ -481,12 +613,14 @@ bsdi: all
|
||||
#
|
||||
detaillist:
|
||||
${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 \
|
||||
echo "WARNING: $$i not under RCS control" 1>&2; \
|
||||
else \
|
||||
echo $$i; \
|
||||
fi; \
|
||||
fi; \
|
||||
done | LANG=C ${SORT}) | ${FMT} -70 | \
|
||||
${SED} -e '1s/xxxxx/DETAIL_HELP=/' -e '2,$$s/^/ /' \
|
||||
-e 's/$$/ \\/' -e '$$s/ \\$$//'
|
||||
@@ -497,24 +631,14 @@ detaillist:
|
||||
#
|
||||
##
|
||||
|
||||
echo_STD_HELP_FILES: ${MAKE_FILE}
|
||||
@echo ${STD_HELP_FILES}
|
||||
|
||||
echo_BLT_HELP_FILES: ${MAKE_FILE}
|
||||
@echo ${BLT_HELP_FILES}
|
||||
|
||||
echo_DETAIL_HELP: ${MAKE_FILE}
|
||||
@echo ${DETAIL_HELP}
|
||||
|
||||
echo_SINGULAR_FILES: ${MAKE_FILE}
|
||||
@echo ${SINGULAR_FILES}
|
||||
|
||||
echo_install.list: ${MAKE_FILE}
|
||||
@for i in ${STD_HELP_FILES} full ${BLT_HELP_FILES} \
|
||||
builtin ${DETAIL_HELP} ${SINGULAR_FILES}; do \
|
||||
echo ${HELPDIR}/$$i; \
|
||||
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
|
||||
@echo ${HELPDIR}/obj
|
||||
${Q}echo __file__ ${HELPDIR}/obj
|
||||
|
||||
##
|
||||
#
|
||||
@@ -523,58 +647,61 @@ echo_install.list: ${MAKE_FILE}
|
||||
##
|
||||
|
||||
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
|
||||
|
||||
clobber:
|
||||
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 ${SINGULAR_FILES} ${DETAIL_CLONE}
|
||||
|
||||
install: all
|
||||
-${Q}if [ ! -d ${SHAREDIR} ]; then \
|
||||
echo mkdir ${SHAREDIR}; \
|
||||
mkdir ${SHAREDIR}; \
|
||||
echo ${CHMOD} 0755 ${SHAREDIR}; \
|
||||
${CHMOD} 0755 ${SHAREDIR}; \
|
||||
-${Q}if [ ! -d $T${CALC_SHAREDIR} ]; then \
|
||||
echo mkdir $T${CALC_SHAREDIR}; \
|
||||
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 \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${CSHAREDIR} ]; then \
|
||||
echo mkdir ${CSHAREDIR}; \
|
||||
mkdir ${CSHAREDIR}; \
|
||||
echo ${CHMOD} 0755 ${CSHAREDIR}; \
|
||||
${CHMOD} 0755 ${CSHAREDIR}; \
|
||||
else \
|
||||
true; \
|
||||
fi
|
||||
-${Q}if [ ! -d ${HELPDIR} ]; then \
|
||||
echo mkdir ${HELPDIR}; \
|
||||
mkdir ${HELPDIR}; \
|
||||
echo ${CHMOD} 0755 ${HELPDIR}; \
|
||||
${CHMOD} 0755 ${HELPDIR}; \
|
||||
-${Q}if [ ! -d $T${HELPDIR} ]; then \
|
||||
echo mkdir $T${HELPDIR}; \
|
||||
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 \
|
||||
true; \
|
||||
fi
|
||||
-${Q}for i in ${STD_HELP_FILES} ${BLT_HELP_FILES} builtin \
|
||||
full ${DETAIL_HELP} ${SINGULAR_FILES}; do \
|
||||
if ${CMP} -s $$i ${HELPDIR}/$$i; then \
|
||||
full ${DETAIL_HELP} ${SINGULAR_FILES} /dev/null; do \
|
||||
if [ "$$i" = "/dev/null" ]; then \
|
||||
continue; \
|
||||
fi; \
|
||||
if ${CMP} -s $$i $T${HELPDIR}/$$i; then \
|
||||
true; \
|
||||
else \
|
||||
rm -f ${HELPDIR}/$$i.new; \
|
||||
cp -f $$i ${HELPDIR}/$$i.new; \
|
||||
${CHMOD} 0444 ${HELPDIR}/$$i.new; \
|
||||
mv -f ${HELPDIR}/$$i.new ${HELPDIR}/$$i; \
|
||||
echo "installed ${HELPDIR}/$$i"; \
|
||||
rm -f $T${HELPDIR}/$$i.new; \
|
||||
cp -f $$i $T${HELPDIR}/$$i.new; \
|
||||
${CHMOD} 0444 $T${HELPDIR}/$$i.new; \
|
||||
mv -f $T${HELPDIR}/$$i.new $T${HELPDIR}/$$i; \
|
||||
echo "installed $T${HELPDIR}/$$i"; \
|
||||
fi; \
|
||||
done
|
||||
-${Q}if ${CMP} -s obj.file ${HELPDIR}/obj; then \
|
||||
-${Q}if ${CMP} -s obj.file $T${HELPDIR}/obj; then \
|
||||
true; \
|
||||
else \
|
||||
rm -f ${HELPDIR}/obj.new; \
|
||||
cp -f obj.file ${HELPDIR}/obj.new; \
|
||||
${CHMOD} 0444 ${HELPDIR}/obj.new; \
|
||||
mv -f ${HELPDIR}/obj.new ${HELPDIR}/obj; \
|
||||
echo "installed ${HELPDIR}/obj"; \
|
||||
rm -f $T${HELPDIR}/obj.new; \
|
||||
cp -f obj.file $T${HELPDIR}/obj.new; \
|
||||
${CHMOD} 0444 $T${HELPDIR}/obj.new; \
|
||||
mv -f $T${HELPDIR}/obj.new $T${HELPDIR}/obj; \
|
||||
echo "installed $T${HELPDIR}/obj"; \
|
||||
fi
|
||||
|
8
help/abs
8
help/abs
@@ -29,10 +29,10 @@ DESCRIPTION
|
||||
the result will be the absolute value correct to n decimal places.
|
||||
|
||||
EXAMPLE
|
||||
> print abs(3.4), abs(-3.4)
|
||||
; print abs(3.4), abs(-3.4)
|
||||
3.4 3.4
|
||||
|
||||
> print abs(3+4i, 1e-5), abs(4+5i, 1e-5), abs(4+5i, 1e-10)
|
||||
; print abs(3+4i, 1e-5), abs(4+5i, 1e-5), abs(4+5i, 1e-10)
|
||||
5 6.40312 6.4031242374
|
||||
|
||||
LIMITS
|
||||
@@ -60,8 +60,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: abs,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: abs,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/abs,v $
|
||||
##
|
||||
## Under source code control: 1994/03/19 01:40:22
|
||||
|
24
help/access
24
help/access
@@ -23,19 +23,19 @@ EXAMPLE
|
||||
The system error-numbers and messages may differ for different
|
||||
implementations
|
||||
|
||||
> !rm -f junk
|
||||
> access("junk")
|
||||
; !rm -f junk
|
||||
; access("junk")
|
||||
System error 2
|
||||
> strerror(.)
|
||||
; strerror(.)
|
||||
"No such file or directory"
|
||||
> f = fopen("junk", "w")
|
||||
> access("junk")
|
||||
> fputs(f, "Alpha")
|
||||
> fclose(f)
|
||||
> !chmod u-w junk
|
||||
> access("junk", "w")
|
||||
; f = fopen("junk", "w")
|
||||
; access("junk")
|
||||
; fputs(f, "Alpha")
|
||||
; fclose(f)
|
||||
; !chmod u-w junk
|
||||
; access("junk", "w")
|
||||
System error 13
|
||||
> strerror(.)
|
||||
; strerror(.)
|
||||
"Permission denied"
|
||||
|
||||
LIMITS
|
||||
@@ -64,8 +64,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: access,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: access,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/access,v $
|
||||
##
|
||||
## Under source code control: 1996/04/30 03:36:20
|
||||
|
@@ -17,7 +17,7 @@ DESCRIPTION
|
||||
v = acos(x) is the number in [0, pi] for which cos(v) = x.
|
||||
|
||||
EXAMPLE
|
||||
> print acos(.5, 1e-5), acos(.5, 1e-10), acos(.5, 1e-15), acos(.5, 1e-20)
|
||||
; print acos(.5, 1e-5), acos(.5, 1e-10), acos(.5, 1e-15), acos(.5, 1e-20)
|
||||
1.0472 1.0471975512 1.047197551196598 1.04719755119659774615
|
||||
|
||||
LIMITS
|
||||
@@ -45,8 +45,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: acos,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: acos,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acos,v $
|
||||
##
|
||||
## Under source code control: 1994/03/19 01:40:23
|
||||
|
@@ -20,7 +20,7 @@ DESCRIPTION
|
||||
acosh(x) = ln(x + sqrt(x^2 - 1))
|
||||
|
||||
EXAMPLE
|
||||
> print acosh(2, 1e-5), acosh(2, 1e-10), acosh(2, 1e-15), acosh(2, 1e-20)
|
||||
; print acosh(2, 1e-5), acosh(2, 1e-10), acosh(2, 1e-15), acosh(2, 1e-20)
|
||||
1.31696 1.3169578969 1.316957896924817 1.31695789692481670862
|
||||
|
||||
LIMITS
|
||||
@@ -48,8 +48,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: acosh,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: acosh,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acosh,v $
|
||||
##
|
||||
## Under source code control: 1994/03/19 01:40:24
|
||||
|
@@ -17,7 +17,7 @@ DESCRIPTION
|
||||
v = acot(x) is the number in (0, pi) for which cot(v) = x.
|
||||
|
||||
EXAMPLE
|
||||
> print acot(2, 1e-5), acot(2, 1e-10), acot(2, 1e-15), acot(2, 1e-20)
|
||||
; print acot(2, 1e-5), acot(2, 1e-10), acot(2, 1e-15), acot(2, 1e-20)
|
||||
.46365 .463647609 .463647609000806 .46364760900080611621
|
||||
|
||||
LIMITS
|
||||
@@ -45,8 +45,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: acot,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: acot,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acot,v $
|
||||
##
|
||||
## Under source code control: 1995/11/13 03:49:00
|
||||
|
@@ -19,7 +19,7 @@ DESCRIPTION
|
||||
acoth(x) = ln((x + 1)/(x - 1))/2
|
||||
|
||||
EXAMPLE
|
||||
> print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20)
|
||||
; print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20)
|
||||
.54931 .5493061443 .549306144334055 .5493061443340548457
|
||||
|
||||
LIMITS
|
||||
@@ -47,8 +47,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: acoth,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: acoth,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acoth,v $
|
||||
##
|
||||
## Under source code control: 1995/11/13 03:49:01
|
||||
|
@@ -17,7 +17,7 @@ DESCRIPTION
|
||||
v = acsc(x) is the number in [-pi/2, pi/2] for which csc(v) = x.
|
||||
|
||||
EXAMPLE
|
||||
> print acsc(2, 1e-5), acsc(2, 1e-10), acsc(2, 1e-15), acsc(2, 1e-20)
|
||||
; print acsc(2, 1e-5), acsc(2, 1e-10), acsc(2, 1e-15), acsc(2, 1e-20)
|
||||
.5236 .5235987756 .523598775598299 .52359877559829887308
|
||||
|
||||
LIMITS
|
||||
@@ -45,8 +45,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: acsc,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: acsc,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acsc,v $
|
||||
##
|
||||
## Under source code control: 1995/11/13 03:49:00
|
||||
|
@@ -20,7 +20,7 @@ DESCRIPTION
|
||||
|
||||
|
||||
EXAMPLE
|
||||
> print acsch(2, 1e-5), acsch(2, 1e-10), acsch(2, 1e-15), acsch(2, 1e-20)
|
||||
; print acsch(2, 1e-5), acsch(2, 1e-10), acsch(2, 1e-15), acsch(2, 1e-20)
|
||||
.48121 .4812118251 .481211825059603 .4812118250596034475
|
||||
|
||||
LIMITS
|
||||
@@ -48,8 +48,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: acsch,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: acsch,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/acsch,v $
|
||||
##
|
||||
## Under source code control: 1995/11/13 03:49:01
|
||||
|
54
help/address
54
help/address
@@ -23,7 +23,7 @@ DESCRIPTION
|
||||
0 <= i < sizeof(B). &B[i] then returns the address at which this
|
||||
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
|
||||
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 change of sizeof(B).
|
||||
|
||||
@@ -38,7 +38,7 @@ DESCRIPTION
|
||||
&X with that component or element depends only on the continued existence
|
||||
of the matrix or object. For example, after
|
||||
|
||||
> mat A[3]
|
||||
; mat A[3]
|
||||
|
||||
the addresses &A[0], &A[1], &A[2] locate the three elements
|
||||
of the matrix specified by A until another value is assigned to A, etc.
|
||||
@@ -60,28 +60,28 @@ DESCRIPTION
|
||||
results refer to octets in the same block or existing components of the
|
||||
same matrix or object. For example, immediately after
|
||||
|
||||
> mat A[10]
|
||||
> p = &A[5]
|
||||
; mat A[10]
|
||||
; p = &A[5]
|
||||
|
||||
it is permitted to use expressions like p + 4, p - 5, p++ .
|
||||
|
||||
Strings defined literally have fixed addresses, e.g., after
|
||||
|
||||
> p = &"abc"
|
||||
> A = "abc"
|
||||
; p = &"abc"
|
||||
; A = "abc"
|
||||
|
||||
The address &*A of the value of A will be equal to p.
|
||||
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
|
||||
string as above, definitions of string values using strcat() or substr()
|
||||
will copy the relevant strings to newly allocated addresses which will
|
||||
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
|
||||
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.
|
||||
|
||||
When compilation of a function encounters for the first time a particular
|
||||
@@ -91,9 +91,9 @@ DESCRIPTION
|
||||
so long as the number remains associated with at least one function or
|
||||
lvalue. For example, after
|
||||
|
||||
> x = 27;
|
||||
> y = 3 * 9;
|
||||
> define f(a) = 27 + a;
|
||||
; x = 27;
|
||||
; y = 3 * 9;
|
||||
; define f(a) = 27 + a;
|
||||
|
||||
the three occurrences of 27 have the same address which may be displayed
|
||||
by any of &27, &*x, &*y and &f(0). If x and y are assigned
|
||||
@@ -109,15 +109,15 @@ DESCRIPTION
|
||||
non-zero value for a will be assigned to different addresses as can be
|
||||
seen from printing &*A, &*B, &*C after
|
||||
|
||||
> A = f(2); B = f(2); C = f(2);
|
||||
; A = f(2); B = f(2); C = f(2);
|
||||
|
||||
(the case of f(0) is exceptional since 27 + 0 simply copies the 27
|
||||
rather than creating a new number value). Here it is clearly more
|
||||
efficient to use
|
||||
|
||||
> A = B = C = f(2);
|
||||
; A = B = C = f(2);
|
||||
|
||||
which, not only performs the addition 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.
|
||||
|
||||
Whether a value V is a pointer and if so, its type, is indicated by the
|
||||
@@ -134,21 +134,21 @@ DESCRIPTION
|
||||
EXAMPLE
|
||||
Addresses for particular systems may differ from those displayed here.
|
||||
|
||||
> mat A[3]
|
||||
> B = blk()
|
||||
; mat A[3]
|
||||
; B = blk()
|
||||
|
||||
> print &A, &A[0], &A[1]
|
||||
; print &A, &A[0], &A[1]
|
||||
v-ptr: 1400470d0 v-ptr: 140044b70 v-ptr: 140044b80
|
||||
|
||||
> print &B, &B[0], &B[1]
|
||||
; print &B, &B[0], &B[1]
|
||||
v-ptr: 140047130 o-ptr: 140044d00 o-ptr: 140044d01
|
||||
|
||||
> a = A[0] = 27
|
||||
> print &*a, &*A[0]. &27
|
||||
; a = A[0] = 27
|
||||
; print &*a, &*A[0]. &27
|
||||
n_ptr: 14003a850 n_ptr: 14003a850 n_ptr: 14003a850
|
||||
|
||||
> a = A[0] = "abc"
|
||||
> print &*a, &*A[0], &"abc"
|
||||
; a = A[0] = "abc"
|
||||
; print &*a, &*A[0], &"abc"
|
||||
s_ptr: 14004cae0 s_ptr: 14004cae0 s_ptr: 14004cae0
|
||||
|
||||
LIMITS
|
||||
@@ -160,7 +160,7 @@ LINK LIBRARY
|
||||
SEE ALSO
|
||||
dereference, isptr
|
||||
|
||||
## Copyright (C) 1999 Landon Curt Noll
|
||||
## Copyright (C) 1999-2006 Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -176,8 +176,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: address,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.5 $
|
||||
## @(#) $Id: address,v 29.5 2006/06/10 12:28:10 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/address,v $
|
||||
##
|
||||
## Under source code control: 1997/09/06 20:03:34
|
||||
|
14
help/agd
14
help/agd
@@ -35,23 +35,23 @@ DESCRIPTION
|
||||
|
||||
|
||||
EXAMPLE
|
||||
> print agd(1, 1e-5), agd(1, 1e-10), agd(1, 1e-15)
|
||||
; print agd(1, 1e-5), agd(1, 1e-10), agd(1, 1e-15)
|
||||
1.22619 1.2261911709 1.226191170883517
|
||||
|
||||
> print agd(2, 1e-5), agd(2, 1e-10)
|
||||
; print agd(2, 1e-5), agd(2, 1e-10)
|
||||
1.52345-3.14159i 1.5234524436-3.1415926536i
|
||||
|
||||
> print agd(5, 1e-5), agd(5, 1e-10), agd(5, 1e-15)
|
||||
; print agd(5, 1e-5), agd(5, 1e-10), agd(5, 1e-15)
|
||||
-1.93237 -1.9323667197 -1.932366719745925
|
||||
|
||||
> print agd(1+2i, 1e-5), agd(1+2i, 1e-10)
|
||||
; print agd(1+2i, 1e-5), agd(1+2i, 1e-10)
|
||||
.22751+1.42291i .2275106584+1.4229114625i
|
||||
|
||||
LIMITS
|
||||
none
|
||||
|
||||
LINK LIBRARY
|
||||
COMPLEX *cagd(COMPLEX *x, NUMBER *eps)
|
||||
COMPLEX *c_agd(COMPLEX *x, NUMBER *eps)
|
||||
|
||||
SEE ALSO
|
||||
gd, exp, ln, sin, sinh, etc.
|
||||
@@ -72,8 +72,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: agd,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.4 $
|
||||
## @(#) $Id: agd,v 29.4 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/agd,v $
|
||||
##
|
||||
## Under source code control: 1997/09/06 20:03:34
|
||||
|
18
help/append
18
help/append
@@ -19,9 +19,9 @@ DESCRIPTION
|
||||
append(x, y_0, y_1, ...) is equivalent to insert(x, n, y_0, y_1, ...).
|
||||
|
||||
EXAMPLE
|
||||
> x = list(2,3,4)
|
||||
> append(x, 5, 6)
|
||||
> print x
|
||||
; x = list(2,3,4)
|
||||
; append(x, 5, 6)
|
||||
; print x
|
||||
|
||||
list (5 elements, 5 nonzero):
|
||||
[[0]] = 2
|
||||
@@ -30,8 +30,8 @@ EXAMPLE
|
||||
[[3]] = 5
|
||||
[[4]] = 6
|
||||
|
||||
> append(x, pop(x), pop(x))
|
||||
> print x
|
||||
; append(x, pop(x), pop(x))
|
||||
; print x
|
||||
|
||||
list (5 elements, 5 nonzero):
|
||||
[[0]] = 4
|
||||
@@ -40,8 +40,8 @@ EXAMPLE
|
||||
[[3]] = 2
|
||||
[[4]] = 3
|
||||
|
||||
> append(x, (remove(x), 7))
|
||||
> print x
|
||||
; append(x, (remove(x), 7))
|
||||
; print x
|
||||
|
||||
list (5 elements, 5 nonzero):
|
||||
[[0]] = 4
|
||||
@@ -75,8 +75,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: append,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: append,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/append,v $
|
||||
##
|
||||
## Under source code control: 1994/03/19 03:13:17
|
||||
|
34
help/appr
34
help/appr
@@ -97,47 +97,47 @@ PROPERTIES
|
||||
If y is nonzero, appr(x,y,8)/y = an odd integer n only if x = n * y.
|
||||
|
||||
EXAMPLES
|
||||
> print appr(-5.44,0.1,0), appr(5.44,0.1,0), appr(5.7,1,0), appr(-5.7,1,0)
|
||||
; print appr(-5.44,0.1,0), appr(5.44,0.1,0), appr(5.7,1,0), appr(-5.7,1,0)
|
||||
-5.5 5.4 5 -6
|
||||
|
||||
> print appr(-5.44,-.1,0), appr(5.44,-.1,0), appr(5.7,-1,0), appr(-5.7,-1,0)
|
||||
; print appr(-5.44,-.1,0), appr(5.44,-.1,0), appr(5.7,-1,0), appr(-5.7,-1,0)
|
||||
-5.4 5.5 6 -5
|
||||
|
||||
> print appr(-5.44,0.1,3), appr(5.44,0.1,3), appr(5.7,1,3), appr(-5.7,1,3)
|
||||
; print appr(-5.44,0.1,3), appr(5.44,0.1,3), appr(5.7,1,3), appr(-5.7,1,3)
|
||||
-5.5 5.5 6 -6
|
||||
|
||||
> print appr(-5.44,0.1,4), appr(5.44,0.1,4), appr(5.7,1,4), appr(-5.7,1,4)
|
||||
; print appr(-5.44,0.1,4), appr(5.44,0.1,4), appr(5.7,1,4), appr(-5.7,1,4)
|
||||
-5.5 5.4 5 -6
|
||||
|
||||
> print appr(-5.44,0.1,6), appr(5.44,0.1,6), appr(5.7,1,6), appr(-5.7,1,6)
|
||||
; print appr(-5.44,0.1,6), appr(5.44,0.1,6), appr(5.7,1,6), appr(-5.7,1,6)
|
||||
-5.4 5.4 6 -5
|
||||
|
||||
> print appr(-5.44,-.1,6), appr(5.44,-.1,6), appr(5.7,-1,6), appr(-5.7,-1,6)
|
||||
; print appr(-5.44,-.1,6), appr(5.44,-.1,6), appr(5.7,-1,6), appr(-5.7,-1,6)
|
||||
-5.5 5.5 6 -6
|
||||
|
||||
> print appr(-5.44,0.1,9), appr(5.44,0.1,9), appr(5.7,1,9), appr(-5.7,1,9)
|
||||
; print appr(-5.44,0.1,9), appr(5.44,0.1,9), appr(5.7,1,9), appr(-5.7,1,9)
|
||||
-5.5 5.5 5 -5
|
||||
|
||||
> print appr(-.44,0.1,11), appr(.44,0.1,11), appr(5.7,1,11), appr(-5.7,1,11)
|
||||
; print appr(-.44,0.1,11), appr(.44,0.1,11), appr(5.7,1,11), appr(-5.7,1,11)
|
||||
-.4 .5 5 -6
|
||||
|
||||
> print appr(-.44,-.1,11),appr(.44,-.1,11),appr(5.7,-1,11),appr(-5.7,-1,11)
|
||||
; print appr(-.44,-.1,11),appr(.44,-.1,11),appr(5.7,-1,11),appr(-5.7,-1,11)
|
||||
-.5 .4 6 -5
|
||||
|
||||
> print appr(-.44,0.1,12), appr(.44,0.1,12), appr(5.7,1,12), appr(-5.7,1,12)
|
||||
; print appr(-.44,0.1,12), appr(.44,0.1,12), appr(5.7,1,12), appr(-5.7,1,12)
|
||||
-.4 .5 5 -6
|
||||
|
||||
> print appr(-.44,-.1,12),appr(.44,-.1,12),appr(5.7,-1,12),appr(-5.7,-1,12)
|
||||
; print appr(-.44,-.1,12),appr(.44,-.1,12),appr(5.7,-1,12),appr(-5.7,-1,12)
|
||||
-.5 .4 6 -5
|
||||
|
||||
> print appr(-.44,0.1,15), appr(.44,0.1,15), appr(5.7,1,15), appr(-5.7,1,15)
|
||||
; print appr(-.44,0.1,15), appr(.44,0.1,15), appr(5.7,1,15), appr(-5.7,1,15)
|
||||
-.4 .5 5 -6
|
||||
|
||||
> print appr(-.44,-.1,15),appr(.44,-.1,15),appr(5.7,-1,15),appr(-5.7,-1,15)
|
||||
; print appr(-.44,-.1,15),appr(.44,-.1,15),appr(5.7,-1,15),appr(-5.7,-1,15)
|
||||
-.4 .5 5 -6
|
||||
|
||||
> x = sqrt(7-3i, 1e-20)
|
||||
> print appr(x,1e-5,0), appr(x,1e-5,1), appr(x,1e-5,2), appr(x,1e-6,3)
|
||||
; x = sqrt(7-3i, 1e-20)
|
||||
; print appr(x,1e-5,0), appr(x,1e-5,1), appr(x,1e-5,2), appr(x,1e-6,3)
|
||||
2.70331-.55488i 2.70332-.55487i 2.70331-.55487i 2.70332-.55488i
|
||||
|
||||
LIMITS
|
||||
@@ -167,8 +167,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: appr,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: appr,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/appr,v $
|
||||
##
|
||||
## Under source code control: 1994/09/25 17:18:21
|
||||
|
10
help/arg
10
help/arg
@@ -16,11 +16,11 @@ DESCRIPTION
|
||||
but usually less than 0.5 * abs(eps).
|
||||
|
||||
EXAMPLE
|
||||
> print arg(2), arg(2+3i, 1e-5), arg(2+3i, 1e-10), arg(2+3i, 1e-20)
|
||||
; print arg(2), arg(2+3i, 1e-5), arg(2+3i, 1e-10), arg(2+3i, 1e-20)
|
||||
0 .98279 .9827937232 .98279372324732906799
|
||||
|
||||
> pi = pi(1e-10); deg = pi/180; eps = deg/10000
|
||||
> print arg(2+3i, eps)/deg, arg(-1 +1i, eps)/deg, arg(-1 - 1i,eps)/deg
|
||||
; pi = pi(1e-10); deg = pi/180; eps = deg/10000
|
||||
; print arg(2+3i, eps)/deg, arg(-1 +1i, eps)/deg, arg(-1 - 1i,eps)/deg
|
||||
56.3099 135 -135
|
||||
|
||||
LIMITS
|
||||
@@ -48,8 +48,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: arg,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: arg,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arg,v $
|
||||
##
|
||||
## Under source code control: 1994/09/25 20:22:31
|
||||
|
@@ -38,8 +38,8 @@ DESCRIPTION
|
||||
|
||||
EXAMPLE
|
||||
$ calc -s a bb ccc
|
||||
> argc = argv();
|
||||
> for (i = 0; i < argc; i++) print "argv[": i : '] = "': argv(i) : '"';
|
||||
; argc = argv();
|
||||
; for (i = 0; i < argc; i++) print "argv[": i : '] = "': argv(i) : '"';
|
||||
argv[0] = "a"
|
||||
argv[1] = "bb"
|
||||
argv[2] = "ccc"
|
||||
@@ -69,8 +69,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: argv,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: argv,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/argv,v $
|
||||
##
|
||||
## Under source code control: 1999/11/23 19:45:05
|
||||
|
26
help/arrow
26
help/arrow
@@ -13,7 +13,7 @@ TYPES
|
||||
DESCRIPTION
|
||||
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.
|
||||
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.
|
||||
|
||||
The expression *p.X will cause a runtime error since this is
|
||||
@@ -23,21 +23,21 @@ DESCRIPTION
|
||||
Spaces or tabs on either side of -> are optional.
|
||||
|
||||
EXAMPLES
|
||||
> obj pair {one, two}
|
||||
> obj pair A, B
|
||||
> p = &A
|
||||
> p->one = 1; p->two = 2
|
||||
> A
|
||||
; obj pair {one, two}
|
||||
; obj pair A, B
|
||||
; p = &A
|
||||
; p->one = 1; p->two = 2
|
||||
; A
|
||||
obj pair {1, 2}
|
||||
|
||||
> A->two = &B
|
||||
> p->two->one = 3; p->two->two = 4
|
||||
; A->two = &B
|
||||
; p->two->one = 3; p->two->two = 4
|
||||
|
||||
> *p->ptwo
|
||||
; *p->ptwo
|
||||
obj pair {3, 4}
|
||||
|
||||
> B = {5,6}
|
||||
> *p->two
|
||||
; B = {5,6}
|
||||
; *p->two
|
||||
obj pair {5, 6}
|
||||
|
||||
|
||||
@@ -66,8 +66,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: arrow,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.4 $
|
||||
## @(#) $Id: arrow,v 29.4 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/arrow,v $
|
||||
##
|
||||
## Under source code control: 1997/09/06 20:03:34
|
||||
|
@@ -17,7 +17,7 @@ DESCRIPTION
|
||||
v = asec(x) is the number in [0, pi] for which sec(v) = x.
|
||||
|
||||
EXAMPLE
|
||||
> print asec(2, 1e-5), asec(2, 1e-10), asec(2, 1e-15), asec(2, 1e-20)
|
||||
; print asec(2, 1e-5), asec(2, 1e-10), asec(2, 1e-15), asec(2, 1e-20)
|
||||
1.0472 1.0471975512 1.047197551196598 1.04719755119659774615
|
||||
|
||||
LIMITS
|
||||
@@ -45,8 +45,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: asec,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: asec,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asec,v $
|
||||
##
|
||||
## Under source code control: 1995/11/13 03:49:00
|
||||
|
@@ -19,7 +19,7 @@ DESCRIPTION
|
||||
asech(x) = ln((1 + sqrt(1 - x^2))/x)
|
||||
|
||||
EXAMPLE
|
||||
> print asech(.5,1e-5), asech(.5,1e-10), asech(.5,1e-15), asech(.5,1e-20)
|
||||
; print asech(.5,1e-5), asech(.5,1e-10), asech(.5,1e-15), asech(.5,1e-20)
|
||||
1.31696 1.3169578969 1.316957896924817 1.31695789692481670862
|
||||
|
||||
LIMITS
|
||||
@@ -47,8 +47,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: asech,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.3 $
|
||||
## @(#) $Id: asech,v 29.3 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asech,v $
|
||||
##
|
||||
## Under source code control: 1995/11/13 03:49:00
|
||||
|
@@ -14,10 +14,10 @@ DESCRIPTION
|
||||
Returns the asin of x to a multiple of eps with error less in
|
||||
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
|
||||
> print asin(.5, 1e-5), asin(.5, 1e-10), asin(.5, 1e-15), asin(.5, 1e-20)
|
||||
; print asin(.5, 1e-5), asin(.5, 1e-10), asin(.5, 1e-15), asin(.5, 1e-20)
|
||||
.5236 .5235987756 .523598775598299 .52359877559829887308
|
||||
|
||||
LIMITS
|
||||
@@ -45,8 +45,8 @@ SEE ALSO
|
||||
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
||||
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
##
|
||||
## @(#) $Revision: 29.2 $
|
||||
## @(#) $Id: asin,v 29.2 2000/06/07 14:02:33 chongo Exp $
|
||||
## @(#) $Revision: 29.4 $
|
||||
## @(#) $Id: asin,v 29.4 2006/05/07 07:25:46 chongo Exp $
|
||||
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/asin,v $
|
||||
##
|
||||
## Under source code control: 1994/03/19 01:40:24
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user