Compare commits

...

10 Commits

Author SHA1 Message Date
Landon Curt Noll
28d1e35362 Release calc version 2.12.5.2 2017-05-21 15:39:00 -07:00
Landon Curt Noll
1ae2f953d3 Release calc version 2.12.5.0 2017-05-21 15:39:00 -07:00
Landon Curt Noll
ed4b56d1ec Release calc version 2.12.4.14 2017-05-21 15:38:59 -07:00
Landon Curt Noll
cc2f6f7b85 Release calc version 2.12.4.13 2017-05-21 15:38:59 -07:00
Landon Curt Noll
57a22a6f39 Release calc version 2.12.4.12 2017-05-21 15:38:58 -07:00
Landon Curt Noll
85bfa30897 Release calc version 2.12.4.11 2017-05-21 15:38:58 -07:00
Landon Curt Noll
17e3535595 Release calc version 2.12.4.10 2017-05-21 15:38:58 -07:00
Landon Curt Noll
7f125396c1 Release calc version 2.12.4.9 2017-05-21 15:38:57 -07:00
Landon Curt Noll
7cf611bca8 Release calc version 2.12.4.0 2017-05-21 15:38:57 -07:00
Landon Curt Noll
c9fce6a5bb Release calc version 2.12.4.1 2017-05-21 15:38:56 -07:00
173 changed files with 14486 additions and 2814 deletions

67
BUGS
View File

@@ -32,16 +32,25 @@ 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 then it may be time to send in a bug report. You can send bug
and bug fixes reports to: and bug fixes reports to:
calc-bugs at asthe dot com calc-bug-report at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] NOTE: Remove spaces and replace 'at' with @, 'dot' with .
[[ NOTE: The EMail address uses 'asthe', the web site URL uses 'isthe' ]]
Your subject must contain the words: This replaces the old calc-bugs at asthe dot com address.
calc bug report To be sure we see your EMail reporting a calc bug, please use the
following phase in your EMail Subject line:
You may have additional words in your subject line. calc bug report
That phrase in your subject line will help ensure your request
will get past our anti-spam filters. You may have additional
words in your subject line.
However, you may find it more helpful to simply subscribe
to the calc-tester mailing list (see below) and then to
send your report to that mailing list as a wider set calc
testers may be able to help you.
When you send your report, please include the following information: When you send your report, please include the following information:
@@ -68,23 +77,18 @@ of a context diff patch).
Known bugs: Known bugs:
The output of the alg_config.cal resource file is bogus.
We would welcome a replacement for this code.
We are sure some more bugs exist. When you find them, please let We are sure some more bugs exist. When you find them, please let
us know! See the above for details on how to report and were to us know! See the above for details on how to report and were to
EMail your bug reports and hopefully patches to fix them. EMail your bug reports and hopefully patches to fix them.
=-= =-=
Problems that have known work-a-rounds:
* There is a bug in gcc v4.1.0 that causes calc to fail the regression
test. The work-a-round is to compile with gcc v4.1.1 or later. This
problems was observed on Fedora 5.
=-=
mis-features in calc: mis-features in calc:
Some problems are not bugs but rarther mis-features / things that could Some problems are not bugs but rather mis-features / things that could
work better. The following is a list of mis-features that should be work better. The following is a list of mis-features that should be
addressed and improved someday. addressed and improved someday.
@@ -129,7 +133,34 @@ mis-features in calc:
will not. will not.
## Copyright (C) 1999-2007 Landon Curt Noll =-=
To subscribe to the calc-tester mailing list, visit the following URL:
http://www.isthe.com/chongo/tech/comp/calc/calc-tester.html
This is a low volume moderated mailing list.
This mailing list replaces calc-tester at asthe dot com list.
If you need a human to help you with your mailing list subscription,
please send EMail to our special:
calc-tester-maillist-help at asthe dot com
NOTE: Remove spaces and replace 'at' with @, 'dot' with .
address. To be sure we see your EMail asking for help with your
mailing list subscription, please use the following phase in your
EMail Subject line:
calc tester mailing list help
That phrase in your subject line will help ensure your
request will get past our anti-spam filters. You may have
additional words in your subject line.
## Copyright (C) 1999-2014 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -145,8 +176,8 @@ mis-features in calc:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.5 $
## @(#) $Id: BUGS,v 30.1 2007/03/16 11:09:46 chongo Exp $ ## @(#) $Id: BUGS,v 30.5 2014/10/12 12:23:43 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/RCS/BUGS,v $ ## @(#) $Source: /usr/local/src/bin/calc/RCS/BUGS,v $
## ##
## Under source code control: 1994/03/18 14:06:13 ## Under source code control: 1994/03/18 14:06:13

330
CHANGES
View File

@@ -1,4 +1,260 @@
The following are the changes from calc version 2.12.4.6 to date: The following are the changes from calc version 2.12.5.1 to date:
Removed rules and makefile variables assocated with shortened
calc version numbers of less than 4 levels.
Under OS X (darwin), if /usr/include is missing, warnings
are issued to help the user use xcode-select --install
so that one may properly compile C code.
Lowered REDC levels:
#define MAXREDC 256 /* number of entries in REDC cache */
#define SQ_ALG2 28 /* size for alternative squaring */
config("sq2") == 28 /* was 3388 */
#define MUL_ALG2 28 /* size for alternative multiply */
config("mul2") == 28 /* was 1780 */
#define POW_ALG2 20 /* size for using REDC for powers */
config("pow2") == 20 /* was 176 */
#define REDC_ALG2 25 /* size for using alternative REDC */
config("redc2") == 25 /* was 220 */
The alg_config.cal script appears to be not correctly finding the
best REDC values. While it has been improved, alg_config.cal still
seems to be suspect on how it attempts to find the best values.
Fixed an intro help file mistake found by Roger Hardiman
<roger at rjh dot org dot uk>.
The following are the changes from calc version 2.12.5.0 to 2.12.5.1:
Calc has a new calc-tester mailing list. This list is for those
who are using/testing calc. We also use this list to announce
new versions of calc. To subscribe to the calc-tester mailing
list, visit the following URL:
http://www.isthe.com/chongo/tech/comp/calc/calc-tester.html
This is a low volume moderated mailing list.
This mailing list replaces calc-tester at asthe dot com list.
If you need a human to help you with your mailing list subscription,
please send EMail to our special:
calc-tester-maillist-help at asthe dot com
address. To be sure we see your EMail asking for help with your
mailing list subscription, please use the following phase in your
EMail Subject line:
calc tester mailing list help
That phrase in your subject line will help ensure your
request will get past our anti-spam filters. You may have
additional words in your subject line.
There is a new calc bug report EMail address:
calc-bug-report at asthe dot com
This replaces the old calc-bugs at asthe dot com address.
To be sure we see your EMail reporting a calc bug, please use the
following phase in your EMail Subject line:
calc bug report
That phrase in your subject line will help ensure your
request will get past our anti-spam filters. You may have
additional words in your subject line.
However, you may find it more helpful to simply subscribe
to the calc-tester mailing list (see above) and then to
send your report to that mailing list as a wider set calc
testers may be able to help you.
The following makefile rules that were related to printing the
upper values of the calc version, rules that were made obsolete
in calc version 2.12.4.14, have been removed:
calc_vers calc_ver calc_ve
vers ver ve
Noted that the hash() builtin function, internally known as
quickhash (used for internal objects such as the associative
arrays as well as other internal processes) uses the deprcated
32-bit FNV-0 hash. The use of this deprecated hash is sufficient
for calc internal purposes. Use of FNV-1a is recommended for
a general non-cryptographic quick hash.
The following are the changes from calc version 2.12.4.14 to 2.12.5.0:
For Apple OS X / Darwin target:
MACOSX_DEPLOYMENT_TARGET is no longer defined
using clang compiler
By default, -install-name is used when forming shared libs.
To force -install-name to not be used, set SET_INSTALL_NAME=no.
The have_stdvs.c test uses <stdlib.h> and fixed va_start() test call
that didn't use last arg.
Fixed math_fmt (printf) in value.c where a LEN (SB32) be printed as %d.
Fixed a significant bug where that resulted in an incorrect
complex number comparison. Thanks goes to David Binderman
<dcb314 at hotmail dot com> for identifying the subtle typo!
Make minor fixes to the make depend rule.
Fixed places were calc defined a reserved identifier that
begin with either __ or _[A-Z]. For example, __FILE_H__ has
been replaced with INCLUDE_FILE_H.
Fixed the addall3 example in the script help file. Thanks for this
fix goes to Igor Furlan <igor dot furlan at gmail dot com>.
We made important fixes to the calc command line history:
Fixed a bug in the command line history where calc would somtimes
crash. There was code that used memcpy() instead of memmove()
that could corrupt the command line history when entering a
into into history that was similar to a previous entry. Thanks
goes to Einar Lielmanis <einars at spicausis dot lv> for first
identifying this mistake.
The calc command line history code, in general was not robust.
We made use a patch from Mathias Buhr <napcode at users dot sf
dot net>, that while it uses a bit more memory: is much more
flexible, readable and robust. This patch replaced the improer
use of memcpy() (see above) with better code. Thanks!
The alg_config.cal calc resource file has been reworked to produce
better diagnostics while attempting to determine the ideal values
for mul2, sq2, and pow2. However, it has been shown that this
code is not correct. Suggestions for a replacement are welcome!
calc -u 'read alg_config; config("user_debug", 2),; best_mul2();'
calc -u 'read alg_config; config("user_debug", 2),; best_sq2();'
calc -u 'read alg_config; config("user_debug", 2),; best_pow2();'
Fixed a number of pedantic compiler warnings.
Removed -W and -Wno-comment from the the CCWARN makefile variable.
Removed no_implicit.arg makefile rule. Removed HAVE_NO_IMPLICIT
makefile variable. Removed no_implicit.c source file.
Added WNO_IMPLICT makefile variable to hold the compiler flag
-Wno-implicit for use on selective compile lines.
Added WNO_ERROR_LONG_LONG makefile variable to hold the compiler flag
-Wno-error=long-long for use on selective compile lines.
Added WNO_LONG_LONG makefile variable to hold the compiler flag
-Wno-long-long for use on selective compile lines.
The makefile variable ${MKDIR_ARG} has been replaced with just -p.
Minor fixes were made to the calc.spec.in file.
The target rpm architecture changed from i686 to x86_64. For those
who do not run machine with x86_64, we continue to release a src
rpm. For those without the ability to process an rpm, we will always
to release src tarball.
When building the libcalc and libcustcalc shared libraries,
ONLY the .so and .so.${VERSION} files are created. The .so is
a symlink to the .so.${VERSION} file. Here ${VERSION} is the
full "w.x.y.z" calc version.
The following are the changes from calc version 2.12.4.11 to 2.12.4.13:
Fixed many typos in comments of the Makefile thanks to the review
work of Michael Somos.
Fixed typo in "help sysinfo".
The Makefile rule, debug, is now more verbose and prints more information
about the calc compiled constants.
Added a more of calc resource files by
Christoph Zurnieden <czurnieden at gmx dot de> including:
infinities.cal - handle infinities symbolically, a little helper file
intnum.cal - implementation of tanh sinh and Gauss-Legendre quadrature
smallfactors.cal - find the factors of a number < 2^32
strings.cal - implementation of isascii() and isblank()
Reformatted some calc resource files. Cleanup in comment the headers
of some calc resource files.
Minor formatting changes to a few help files.
No need to be special picky about the test8900.cal calc resource file.
Added a number of ctype-like builtins:
isalnum - whether character is alpha-numeric
isalpha - whether character is alphabetic
iscntrl - whether character is a control character
isdigit - whether character is a digit character
isgraph - whether character is a graphical character
islower - whether character is lower case
isprint - whether character is a printable
ispunct - whether character is a punctuation
isspace - whether character is a space character
isupper - whether character is upper case
isxdigit - whether character a hexadecimal digit
strcasecmp - compare two strings, case independent
strncasecmp - compare two strings up to n characters, case independent
strtolower - transform an ASCII string to lower case
strtoupper - transform an ASCII string to upper case
For details on these new builtins, see their help messages.
Thanks goes to Inge Zurnieden <inge dot zurnieden at gmx dot de> for
these new builtins.
Calc source code is now picky v2.3 clean using:
picky -s -v file file2 ..
With the exception of:
help/errorcodes.sed
cal/set8700.line
Due to the long lines in those files, we use:
picky -w -s -v help/errorcodes.sed cal/set8700.line
For more information about the picky tool, see:
http://cis.csuohio.edu/~somos/picky.html
Removed functions from strings.cal that have been replaced by
the new ctype-like builtin functions.
Fixed cal/Makefile to include missing intnum.cal file.
Added detail_help_list make target to cal/Makefile.
The detaillist make target in help/Makefile is now
called detail_help_list.
Removed requirement of gen_u0(h, n, v1) in lucas.cal that h
be odd. While still lucas(h, n) converts even h into an odd h
internally by incrementing n, gen_u0(h, n, v1) will output even
when h is even.
The following are the changes from calc version 2.12.4.6 to version 2.12.4.10:
Updated RPM build process to remove use of deprecated flags. Updated RPM build process to remove use of deprecated flags.
@@ -14,6 +270,53 @@ The following are the changes from calc version 2.12.4.6 to date:
Silenced annoying warning about unused variable 'intp' Silenced annoying warning about unused variable 'intp'
while compiline endian.c under some circumstances. while compiline endian.c under some circumstances.
Fixed typo in redeclaration warnings. Thanks to
Christoph Zurnieden <czurnieden at gmx dot de> for this report.
Added a number of calc resource files by
Christoph Zurnieden <czurnieden at gmx dot de> including:
bernpoly.cal - Computes the nth Bernoulli polynomial at z for any n,z
brentsolve.cal - root-finder implementwed with the Brent-Dekker trick
factorial.cal - product of the positive integers
factorial2.cal - variety of integer functions quasi-related to factoral
lambertw.cal - Computes Lambert's W-function at "z" at branch "branch"
lnseries.cal - Calculates a series of natural logarithms at 1,2,3,4...n
specialfunctions.cal - Calculates the value of the beta function
statistics.cal - a wide vareity of stastical functions
toomcook.cal - Multiply by way of the Toom-Cook algorithm
zeta2.cal - Calculate the value of the Hurwitz Zeta function
Fixed a makefile bug that prevented the those new calc resource
files from being installed.
Improved the formatting of the output from:
help resource
We replaced COPYING-LGPL with the version that is found at
http://www.gnu.org/licenses/lgpl-2.1.txt because that version
contans some whitespace formatting cleanup. Otherwise the
license is the same.
We fixed a number of places where "the the" was used
when just "the" should be used.
NOTE: Fixes to grammar, spelling and minor formatting
problems are welcome. Please send us your patches!
With the exception of 3 source files, we became "picky" about
line lengths and other issues reported by the picky tool:
cal/test8900.cal
cal/set8700.line
help/errorcodes.sed
The above 3 files now pass picky -w (OK except for line length).
For more information about the picky tool, see:
http://cis.csuohio.edu/~somos/picky.html
The following are the changes from calc version 2.12.4.3 to 2.12.4.5: The following are the changes from calc version 2.12.4.3 to 2.12.4.5:
@@ -1169,8 +1472,7 @@ The following are the changes from calc version 2.11.10 to 2.11.10:
The following are the changes from calc version 2.11.9 to 2.11.9.3: The following are the changes from calc version 2.11.9 to 2.11.9.3:
Fixed calc man page examples to move -f to the end of the line. Fixed calc man page examples to move -f to the end of the line.
Thanks goes to Michael Somos <somos at grail dot cba dot csuohio Thanks goes to Michael Somos for pointing this out.
dot edu> for pointing this out.
Linux and gcc now compiled with -Wall -W -Wno-comment. Linux and gcc now compiled with -Wall -W -Wno-comment.
@@ -2125,7 +2427,7 @@ The following are the changes from calc version 2.11.1 to 2.11.1t2.2:
Cleaned up help display system. Help file lines that begin with Cleaned up help display system. Help file lines that begin with
'##' are not displayed. '##' are not displayed.
Calc source and documentation now uses the the these terms: Calc source and documentation now uses these terms:
*.cal files calc resource file *.cal files calc resource file
*.a files calc binary link library *.a files calc binary link library
@@ -2163,7 +2465,7 @@ The following are the changes from calc version 2.11.0t10 to 2.11.0t11:
Fixed whitespace to make the best use of 8 character tabs. Fixed whitespace to make the best use of 8 character tabs.
Fixed some bugs relating to '// and %' in combination with some Fixed some bugs relating to '// and %' in combination with some
of the the rounding modes based on a patch from Ernest Bowen of the rounding modes based on a patch from Ernest Bowen
<ernie at turing dot une dot edu dot au>. <ernie at turing dot une dot edu dot au>.
A patch from Klaus Alexander Seistrup <klaus at seistrup dot dk>, when A patch from Klaus Alexander Seistrup <klaus at seistrup dot dk>, when
@@ -2357,7 +2659,7 @@ The following are the changes from calc version 2.11.0t10 to 2.11.0t11:
Where ``/usr/local/bin/calc'' is the path to the calc binary. Where ``/usr/local/bin/calc'' is the path to the calc binary.
Additional -options may be added to the line, but it MUST Additional -options may be added to the line, but it MUST
start with -S. For example, the the executable file ``plus'' start with -S. For example, the executable file ``plus''
contain the following: contain the following:
#!/usr/local/bin/calc -S -e #!/usr/local/bin/calc -S -e
@@ -4820,7 +5122,7 @@ The following are the changes from calc version 2.10.3t0 to 2.10.3t2:
global variable: to the end of the session with calc global variable: to the end of the session with calc
static within a function definition: to the the first of: static within a function definition: to the first of:
an end of a global, static or local declaration (including an end of a global, static or local declaration (including
initialization code) with the same identifier initialization code) with the same identifier
@@ -4918,7 +5220,7 @@ The following are the changes from calc version 2.10.3t0 to 2.10.3t2:
global a, b, mat A, B[2] = {3,4}, C[2] = {4,5}, obj point P = {5,6}, Q global a, b, mat A, B[2] = {3,4}, C[2] = {4,5}, obj point P = {5,6}, Q
Fixed some bugs related to global and static scoping. See the the Fixed some bugs related to global and static scoping. See the
5200 regress test and lib/test5200.cal for details. 5200 regress test and lib/test5200.cal for details.
Optimized opcode generator so that functions defined using '=' do not Optimized opcode generator so that functions defined using '=' do not
@@ -5415,7 +5717,7 @@ The following are the changes from calc version 2.10.2t4 to 2.10.2t24:
ILDFLAGS are flags given to ${CC} for linking .o files ILDFLAGS are flags given to ${CC} for linking .o files
for intermediate progs for intermediate progs
CC is how the the C compiler is invoked CC is how the C compiler is invoked
Added more tests to regress.cal. Added more tests to regress.cal.
@@ -5640,7 +5942,7 @@ The following are the changes from calc version 2.10.2t1 to 2.10.2t3:
Some systems has a libc symbolic qadd() that conflicted with calc's Some systems has a libc symbolic qadd() that conflicted with calc's
qadd function. To avoid this, qadd() has been renamed to qqadd(). qadd function. To avoid this, qadd() has been renamed to qqadd().
The calc error codes are produced from the the calcerr.tbl file. The calc error codes are produced from the calcerr.tbl file.
Instead of changing #defines in value.h, one can not edit calcerr.tbl. Instead of changing #defines in value.h, one can not edit calcerr.tbl.
The Makefile builds calcerr.h from this file. The Makefile builds calcerr.h from this file.
@@ -6183,7 +6485,7 @@ The following are the changes from calc version 2.9.3t11 to 2.10.0t12:
LDFLAGS are flags given to ${CC} for linking .o files LDFLAGS are flags given to ${CC} for linking .o files
ILDFLAGS are given to ${CC} for linking .o's for intermediate progs ILDFLAGS are given to ${CC} for linking .o's for intermediate progs
CC is how the the C compiler is invoked CC is how the C compiler is invoked
The syntax error: The syntax error:
@@ -6818,7 +7120,7 @@ Following is a list of visible changes to calc from version 1.24.7 to 1.26.1:
A small bug in the library file regress.cal was fixed. A small bug in the library file regress.cal was fixed.
## Copyright (C) 2001 Landon Curt Noll ## Copyright (C) 2001-2014 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -6834,8 +7136,8 @@ Following is a list of visible changes to calc from version 1.24.7 to 1.26.1:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.26 $ ## @(#) $Revision: 30.49 $
## @(#) $Id: CHANGES,v 30.26 2013/05/19 22:10:34 chongo Exp $ ## @(#) $Id: CHANGES,v 30.49 2016/02/06 08:42:57 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/RCS/CHANGES,v $ ## @(#) $Source: /usr/local/src/bin/calc/RCS/CHANGES,v $
## ##
## Under source code control: 1993/06/02 18:12:57 ## Under source code control: 1993/06/02 18:12:57

78
COPYING
View File

@@ -6,17 +6,17 @@ This file is Copyrighted
This file is covered under the following Copyright: This file is covered under the following Copyright:
Copyright (C) 1999-2008 Landon Curt Noll Copyright (C) 1999-2014 Landon Curt Noll
All rights reserved. All rights reserved.
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
# @(#) $Revision: 30.2 $ # @(#) $Revision: 30.6 $
# @(#) $Id: COPYING,v 30.2 2008/10/24 10:46:52 chongo Exp $ # @(#) $Id: COPYING,v 30.6 2014/10/12 12:23:43 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/COPYING,v $ # @(#) $Source: /usr/local/src/bin/calc/RCS/COPYING,v $
=-= -=-
Calc is covered by the GNU Lesser General Public License Calc is covered by the GNU Lesser General Public License
-------------------------------------------------------- --------------------------------------------------------
@@ -53,47 +53,64 @@ Calc is covered by the GNU Lesser General Public License
Boston, MA 02110-1301 Boston, MA 02110-1301
USA USA
The contact addresses for calc is as follows: To subscribe to the calc-tester mailing list, visit the following URL:
Web: http://www.isthe.com/chongo/tech/comp/calc/email.html http://www.isthe.com/chongo/tech/comp/calc/calc-tester.html
To join the low volume calc mailing list. Send a EMail message to: This is a low volume moderated mailing list.
calc-tester-request at asthe dot com This mailing list replaces calc-tester at asthe dot com list.
Your subject must contain the words: If you need a human to help you with your mailing list subscription,
please send EMail to our special:
calc mailing list subscription calc-tester-maillist-help at asthe dot com
You may have additional words in your subject line. NOTE: Remove spaces and replace 'at' with @, 'dot' with .
Your message body (not the subject) should consist of: address. To be sure we see your EMail asking for help with your
mailing list subscription, please use the following phase in your
EMail Subject line:
subscribe calc-tester address calc tester mailing list help
end
name your_full_name
where ``address'' is your EMail address and ``your_full_name'' is That phrase in your subject line will help ensure your
your full name. request will get past our anti-spam filters. You may have
additional words in your subject line.
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 bug reports and calc bug fixes should be sent to:
calc-bugs at asthe dot com calc-bug-report at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] NOTE: Remove spaces and replace 'at' with @, 'dot' with .
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
Your subject must contain the words: This replaces the old calc-bugs at asthe dot com address.
calc bug report To be sure we see your EMail reporting a calc bug, please use the
following phase in your EMail Subject line:
You may have additional words in your subject line. calc bug report
=-= That phrase in your subject line will help ensure your
request will get past our anti-spam filters. You may have
additional words in your subject line.
However, you may find it more helpful to simply subscribe
to the calc-tester mailing list (see above) and then to
send your report to that mailing list as a wider set calc
testers may be able to help you.
-=-
The calc web site is located at:
http://www.isthe.com/chongo/tech/comp/calc/
NOTE: The EMail address uses 'asthe', while the web site uses 'isthe'.
-=-
Calc's relationship to the GNU Lesser General Public License Calc's relationship to the GNU Lesser General Public License
------------------------------------------------------------ ------------------------------------------------------------
@@ -149,7 +166,7 @@ Calc's relationship to the GNU Lesser General Public License
except for the exception files explicitly listed in the ``Calc except for the exception files explicitly listed in the ``Calc
copyrights and exception files'' section below. copyrights and exception files'' section below.
=-= -=-
Calc copyrights and exception files Calc copyrights and exception files
----------------------------------- -----------------------------------
@@ -165,6 +182,7 @@ Calc copyrights and exception files
Copyright (C) year Ernest Bowen and Landon Curt Noll Copyright (C) year Ernest Bowen and Landon Curt Noll
Copyright (C) year Ernest Bowen Copyright (C) year Ernest Bowen
Copyright (C) year Petteri Kettunen and Landon Curt Noll Copyright (C) year Petteri Kettunen and Landon Curt Noll
Copyright (C) year Christoph Zurnieden
These files are not covered under one of the Copyrights listed above: These files are not covered under one of the Copyrights listed above:
@@ -188,7 +206,7 @@ Calc copyrights and exception files
And because one may freely distribute the LGPL covered files, the And because one may freely distribute the LGPL covered files, the
entire calc source may be freely used and distributed. entire calc source may be freely used and distributed.
=-= -=-
General Copyleft and License info General Copyleft and License info
--------------------------------- ---------------------------------
@@ -202,7 +220,7 @@ General Copyleft and License info
http://www.gnu.org/copyleft/lesser.html http://www.gnu.org/copyleft/lesser.html
http://www.gnu.org/copyleft/lesser.txt http://www.gnu.org/copyleft/lesser.txt
=-= -=-
Why calc did not use the GNU General Public License Why calc did not use the GNU General Public License
--------------------------------------------------- ---------------------------------------------------

View File

@@ -1,8 +1,8 @@
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999 Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc. Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
@@ -10,7 +10,7 @@
as the successor of the GNU Library Public License, version 2, hence as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.] the version number 2.1.]
Preamble Preamble
The licenses for most software are designed to take away your The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public freedom to share and change it. By contrast, the GNU General Public
@@ -112,7 +112,7 @@ modification follow. Pay close attention to the difference between a
former contains code derived from the library, whereas the latter must former contains code derived from the library, whereas the latter must
be combined with the library in order to run. be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other 0. This License Agreement applies to any software library or other
@@ -146,7 +146,7 @@ such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does. and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's 1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an you conspicuously and appropriately publish on each copy an
@@ -432,7 +432,7 @@ decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing of all derivatives of our free software and of promoting the sharing
and reuse of software generally. and reuse of software generally.
NO WARRANTY NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
@@ -455,7 +455,7 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES. DAMAGES.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries How to Apply These Terms to Your New Libraries
@@ -485,7 +485,8 @@ convey the exclusion of warranty; and each file should have at least the
You should have received a copy of the GNU Lesser General Public You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
Also add information on how to contact you by electronic and paper mail. Also add information on how to contact you by electronic and paper mail.
@@ -500,5 +501,3 @@ necessary. Here is a sample; alter the names:
Ty Coon, President of Vice Ty Coon, President of Vice
That's all there is to it! That's all there is to it!

870
Makefile

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

66
README
View File

@@ -73,52 +73,64 @@ for a wish/todo list. Code contributions are welcome.
=-= =-=
To join the calc-tester mailing list. Send an EMail message to: To subscribe to the calc-tester mailing list, visit the following URL:
calc-tester-request at asthe dot com http://www.isthe.com/chongo/tech/comp/calc/calc-tester.html
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] This is a low volume moderated mailing list.
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
Your subject must contain the words: This mailing list replaces calc-tester at asthe dot com list.
calc mailing list subscription If you need a human to help you with your mailing list subscription,
please send EMail to our special:
You may have additional words in your subject line. calc-tester-maillist-help at asthe dot com
Your message body (not the subject) should consist of: NOTE: Remove spaces and replace 'at' with @, 'dot' with .
subscribe calc-tester address address. To be sure we see your EMail asking for help with your
end mailing list subscription, please use the following phase in your
name your_full_name EMail Subject line:
where ``address'' is your EMail address and ``your_full_name'' is calc tester mailing list help
your full name.
Feel free to follow the name line with additional EMail text as desired. That phrase in your subject line will help ensure your
request will get past our anti-spam filters. You may have
additional words in your subject line.
=-= -=-
Send Calc bug and bug fixes to: Calc bug reports and calc bug fixes should be sent to:
calc-bugs at asthe dot com calc-bug-report at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] NOTE: Remove spaces and replace 'at' with @, 'dot' with .
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
but see the BUGS file first. This replaces the old calc-bugs at asthe dot com address.
Your subject must contain the words: To be sure we see your EMail reporting a calc bug, please use the
following phase in your EMail Subject line:
calc bug report calc bug report
You may have additional words in your subject line. That phrase in your subject line will help ensure your
request will get past our anti-spam filters. You may have
additional words in your subject line.
However, you may find it more helpful to simply subscribe
to the calc-tester mailing list (see above) and then to
send your report to that mailing list as a wider set calc
testers may be able to help you.
-=-
The calc web site is located at: The calc web site is located at:
http://www.isthe.com/chongo/tech/comp/calc/ http://www.isthe.com/chongo/tech/comp/calc/
## Copyright (C) 1999 Landon Curt Noll NOTE: The EMail address uses 'asthe', while the web site uses 'isthe'.
## Copyright (C) 1999,2014 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -134,8 +146,8 @@ The calc web site is located at:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.3 $
## @(#) $Id: README,v 30.1 2007/03/16 11:09:46 chongo Exp $ ## @(#) $Id: README,v 30.3 2014/10/12 12:23:43 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/RCS/README,v $ ## @(#) $Source: /usr/local/src/bin/calc/RCS/README,v $
## ##
## Under source code control: 1995/10/25 05:27:59 ## Under source code control: 1995/10/25 05:27:59

18
alloc.h
View File

@@ -1,7 +1,7 @@
/* /*
* alloc - storage allocation and storage debug macros * alloc - storage allocation and storage debug macros
* *
* Copyright (C) 1999-2007 David I. Bell * Copyright (C) 1999-2007,2014 David I. Bell
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.5 $
* @(#) $Id: alloc.h,v 30.2 2008/04/15 21:17:57 chongo Exp $ * @(#) $Id: alloc.h,v 30.5 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/alloc.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/alloc.h,v $
* *
* Under source code control: 1990/02/15 01:48:29 * Under source code control: 1990/02/15 01:48:29
@@ -28,8 +28,8 @@
*/ */
#if !defined(__ALLOC_H__) #if !defined(INCLUDE_ALLOC_H)
#define __ALLOC_H__ #define INCLUDE_ALLOC_H
#if defined(CALC_SRC) /* if we are building from the calc source tree */ #if defined(CALC_SRC) /* if we are building from the calc source tree */
@@ -53,7 +53,8 @@
# if defined(HAVE_NEWSTR) # if defined(HAVE_NEWSTR)
E_FUNC void *memcpy(); E_FUNC void *memcpy();
E_FUNC void *memset(); E_FUNC void *memset();
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) #if defined(FORCE_STDC) || \
(defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
E_FUNC size_t strlen(); E_FUNC size_t strlen();
# else # else
E_FUNC long strlen(); E_FUNC long strlen();
@@ -82,7 +83,8 @@ E_FUNC int strcmp();
#if !defined(HAVE_MEMMOVE) #if !defined(HAVE_MEMMOVE)
# undef MEMMOVE_SIZE_T # undef MEMMOVE_SIZE_T
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) #if defined(FORCE_STDC) || \
(defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
# define MEMMOVE_SIZE_T size_t # define MEMMOVE_SIZE_T size_t
# else # else
# define MEMMOVE_SIZE_T long # define MEMMOVE_SIZE_T long
@@ -90,4 +92,4 @@ E_FUNC int strcmp();
E_FUNC void *memmove(void *s1, CONST void *s2, MEMMOVE_SIZE_T n); E_FUNC void *memmove(void *s1, CONST void *s2, MEMMOVE_SIZE_T n);
#endif #endif
#endif /* !__ALLOC_H__ */ #endif /* !INCLUDE_ALLOC_H */

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: assocfunc.c,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: assocfunc.c,v 30.3 2014/09/30 00:55:11 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/assocfunc.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/assocfunc.c,v $
* *
* Under source code control: 1993/07/20 23:04:27 * Under source code control: 1993/07/20 23:04:27
@@ -83,7 +83,7 @@ associndex(ASSOC *ap, BOOL create, long dim, VALUE *indices)
* so that we can first select the correct hash chain, and * so that we can first select the correct hash chain, and
* also so we can quickly compare each element for a match. * also so we can quickly compare each element for a match.
*/ */
hash = FNV1_32_BASIS; hash = QUICKHASH_BASIS;
for (i = 0; i < dim; i++) for (i = 0; i < dim; i++)
hash = hashvalue(&indices[i], hash); hash = hashvalue(&indices[i], hash);
@@ -332,7 +332,8 @@ assoccopy(ASSOC *oldap)
oldep = oldep->e_next) { oldep = oldep->e_next) {
ep = (ASSOCELEM *) malloc(ELEMSIZE(oldep->e_dim)); ep = (ASSOCELEM *) malloc(ELEMSIZE(oldep->e_dim));
if (ep == NULL) { if (ep == NULL) {
math_error("Cannot allocate association element"); math_error("Cannot allocate "
"association element");
/*NOTREACHED*/ /*NOTREACHED*/
} }
ep->e_dim = oldep->e_dim; ep->e_dim = oldep->e_dim;
@@ -340,7 +341,8 @@ assoccopy(ASSOC *oldap)
ep->e_value.v_type = V_NULL; ep->e_value.v_type = V_NULL;
ep->e_value.v_subtype = V_NOSUBTYPE; ep->e_value.v_subtype = V_NOSUBTYPE;
for (i = 0; i < ep->e_dim; i++) for (i = 0; i < ep->e_dim; i++)
copyvalue(&oldep->e_indices[i], &ep->e_indices[i]); copyvalue(&oldep->e_indices[i],
&ep->e_indices[i]);
copyvalue(&oldep->e_value, &ep->e_value); copyvalue(&oldep->e_value, &ep->e_value);
listhead = &ap->a_table[ep->e_hash % ap->a_size]; listhead = &ap->a_table[ep->e_hash % ap->a_size];
ep->e_next = *listhead; ep->e_next = *listhead;

View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.2 $
* @(#) $Id: blkcpy.c,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: blkcpy.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/blkcpy.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/blkcpy.c,v $
* *
* Under source code control: 1997/04/18 20:41:26 * Under source code control: 1997/04/18 20:41:26
@@ -374,7 +374,8 @@ copyblk2mat(BLOCK *blk, long ssi, long num, MATRIX *dmat, long dsi)
* copymat2blk - copy matrix to block * copymat2blk - copy matrix to block
*/ */
int int
copymat2blk(MATRIX *smat, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc) copymat2blk(MATRIX *smat, long ssi, long num, BLOCK *dblk, long dsi,
BOOL noreloc)
{ {
long i; long i;
long newlen; long newlen;
@@ -720,7 +721,8 @@ copystr2file(STRING *str, long ssi, long num, FILEID id, long dsi)
* copyblk2blk - copy block to block * copyblk2blk - copy block to block
*/ */
int int
copyblk2blk(BLOCK *sblk, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc) copyblk2blk(BLOCK *sblk, long ssi, long num, BLOCK *dblk, long dsi,
BOOL noreloc)
{ {
long newlen; long newlen;
long newsize; long newsize;
@@ -762,7 +764,8 @@ copyblk2blk(BLOCK *sblk, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc
* copystr2blk - copy string to block * copystr2blk - copy string to block
*/ */
int int
copystr2blk(STRING *str, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc) copystr2blk(STRING *str, long ssi, long num, BLOCK *dblk, long dsi,
BOOL noreloc)
{ {
long len; long len;
long newlen; long newlen;
@@ -982,7 +985,8 @@ memmove(void *s1, CONST void *s2, MEMMOVE_SIZE_T n)
* copynum2blk - copy number numerator to block * copynum2blk - copy number numerator to block
*/ */
int int
copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc) copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi,
BOOL noreloc)
{ {
size_t newlen; size_t newlen;
size_t newsize; size_t newsize;
@@ -1033,7 +1037,8 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
* copyblk2num - copy block to number * copyblk2num - copy block to number
*/ */
int int
copyblk2num(BLOCK *sblk, long ssi, long num, NUMBER *dnum, long dsi, NUMBER **res) copyblk2num(BLOCK *sblk, long ssi, long num, NUMBER *dnum, long dsi,
NUMBER **res)
{ {
size_t newlen; size_t newlen;
NUMBER *ret; /* cloned and modified numerator */ NUMBER *ret; /* cloned and modified numerator */

View File

@@ -1,7 +1,7 @@
/* /*
* blkcpy - general values and related routines used by the calculator * blkcpy - general values and related routines used by the calculator
* *
* Copyright (C) 1999-2007 Landon Curt Noll and Ernest Bowen * Copyright (C) 1999-2007,2014 Landon Curt Noll and Ernest Bowen
* *
* Primary author: Landon Curt Noll * Primary author: Landon Curt Noll
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: blkcpy.h,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: blkcpy.h,v 30.3 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/blkcpy.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/blkcpy.h,v $
* *
* Under source code control: 1997/04/18 20:41:25 * Under source code control: 1997/04/18 20:41:25
@@ -30,8 +30,8 @@
*/ */
#if !defined(__BLKCPY_H__) #if !defined(INCLUDE_BLKCPY_H)
#define __BLKCPY_H__ #define INCLUDE_BLKCPY_H
/* /*
* the main copy gateway function * the main copy gateway function
@@ -59,4 +59,4 @@ E_FUNC int copystr2blk(STRING *, long, long, BLOCK *, long, BOOL);
E_FUNC int copystr2file(STRING *, long, long, FILEID, long); E_FUNC int copystr2file(STRING *, long, long, FILEID, long);
E_FUNC int copystr2str(STRING *, long, long, STRING *, long); E_FUNC int copystr2str(STRING *, long, long, STRING *, long);
#endif /* !__BLKCPY_H__ */ #endif /* !INCLUDE_BLKCPY_H */

12
block.h
View File

@@ -1,7 +1,7 @@
/* /*
* block - fixed, dynamic, fifo and circular memory blocks * block - fixed, dynamic, fifo and circular memory blocks
* *
* Copyright (C) 1999-2007 Landon Curt Noll and Ernest Bowen * Copyright (C) 1999-2007,2014 Landon Curt Noll and Ernest Bowen
* *
* Primary author: Landon Curt Noll * Primary author: Landon Curt Noll
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: block.h,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: block.h,v 30.3 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/block.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/block.h,v $
* *
* Under source code control: 1997/02/21 05:03:39 * Under source code control: 1997/02/21 05:03:39
@@ -31,8 +31,8 @@
*/ */
#if !defined(__BLOCK_H__) #if !defined(INCLUDE_BLOCK_H)
#define __BLOCK_H__ #define INCLUDE_BLOCK_H
/* /*
@@ -222,4 +222,4 @@ E_FUNC int countnblocks(void);
E_FUNC void shownblocks(void); E_FUNC void shownblocks(void);
#endif /* !__BLOCK_H__ */ #endif /* !INCLUDE_BLOCK_H */

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.2 $
* @(#) $Id: byteswap.c,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: byteswap.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/byteswap.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/byteswap.c,v $
* *
* Under source code control: 1995/10/11 04:44:01 * Under source code control: 1995/10/11 04:44:01
@@ -102,7 +102,8 @@ swap_b8_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all)
*/ */
dest = malloc(sizeof(ZVALUE)); dest = malloc(sizeof(ZVALUE));
if (dest == NULL) { if (dest == NULL) {
math_error("swap_b8_in_ZVALUE: swap_b8_in_ZVALUE: Not enough memory"); math_error("swap_b8_in_ZVALUE: swap_b8_in_ZVALUE: "
"Not enough memory");
/*NOTREACHED*/ /*NOTREACHED*/
} }

View File

@@ -1,7 +1,7 @@
/* /*
* byteswap - byte swapping macros * byteswap - byte swapping macros
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: byteswap.h,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: byteswap.h,v 30.3 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/byteswap.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/byteswap.h,v $
* *
* Under source code control: 1995/10/11 04:44:01 * Under source code control: 1995/10/11 04:44:01
@@ -29,8 +29,8 @@
*/ */
#if !defined(__BYTESWAP_H__) #if !defined(INCLUDE_BYTESWAP_H)
#define __BYTESWAP_H__ #define INCLUDE_BYTESWAP_H
#if defined(CALC_SRC) /* if we are building from the calc source tree */ #if defined(CALC_SRC) /* if we are building from the calc source tree */
@@ -178,4 +178,4 @@
#endif /* LONG_BITS == 64 */ #endif /* LONG_BITS == 64 */
#endif /* !__BYTESWAP_H__ */ #endif /* !INCLUDE_BYTESWAP_H */

View File

@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# @(#) $Revision: 30.5 $ # @(#) $Revision: 30.11 $
# @(#) $Id: Makefile,v 30.5 2011/05/23 22:50:18 chongo Exp $ # @(#) $Id: Makefile,v 30.11 2014/09/02 07:14:49 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/cal/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/bin/calc/cal/RCS/Makefile,v $
# #
# Under source code control: 1991/07/21 05:00:54 # Under source code control: 1991/07/21 05:00:54
@@ -179,22 +179,37 @@ MV= mv
CO= co CO= co
TRUE= true TRUE= true
TOUCH= touch TOUCH= touch
SED= sed
SORT= sort
FMT= fmt
# The calc files to install # The calc files to install
# #
CALC_FILES= README bigprime.cal deg.cal ellip.cal lucas.cal lucas_chk.cal \ # This list is prodiced by the detaillist rule when no WARNINGS are detected.
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 \ # Please use:
sumsq.cal surd.cal unitfrac.cal varargs.cal chrem.cal mfactor.cal \ #
bindings randmprime.cal test1700.cal randrun.cal linear.cal \ # make calc_files_list
randbitrun.cal bernoulli.cal test2300.cal test2600.cal \ #
test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \ # to keep this list in nice sorted order and to check that these
test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \ # deailed help files are under RCS control.
beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \ #
randomrun.cal repeat.cal xx_print.cal natnumset.cal qtime.cal \ CALC_FILES= README alg_config.cal beer.cal bernoulli.cal \
test8400.cal test8500.cal test8600.cal chi.cal intfile.cal screen.cal \ bernpoly.cal bigprime.cal bindings brentsolve.cal chi.cal chrem.cal \
dotest.cal set8700.cal set8700.line alg_config.cal sumtimes.cal \ constants.cal deg.cal dms.cal dotest.cal ellip.cal factorial.cal \
dms.cal hms.cal gvec.cal factorial2.cal gvec.cal hello.cal hms.cal infinities.cal \
intfile.cal intnum.cal lambertw.cal linear.cal lnseries.cal \
lucas.cal lucas_chk.cal lucas_tbl.cal mersenne.cal mfactor.cal \
mod.cal natnumset.cal pell.cal pi.cal pix.cal pollard.cal poly.cal \
prompt.cal psqrt.cal qtime.cal quat.cal randbitrun.cal randmprime.cal \
randombitrun.cal randomrun.cal randrun.cal regress.cal repeat.cal \
screen.cal seedrandom.cal set8700.cal set8700.line smallfactors.cal \
solve.cal specialfunctions.cal statistics.cal strings.cal sumsq.cal \
sumtimes.cal surd.cal test1700.cal test2300.cal test2600.cal \
test2700.cal test3100.cal test3300.cal test3400.cal test3500.cal \
test4000.cal test4100.cal test4600.cal test5100.cal test5200.cal \
test8400.cal test8500.cal test8600.cal test8900.cal toomcook.cal \
unitfrac.cal varargs.cal xx_print.cal zeta2.cal
# These files are found (but not built) in the distribution # These files are found (but not built) in the distribution
# #
@@ -242,6 +257,27 @@ calcliblist:
fi; \ fi; \
done done
# These next rule help form the ${CALC_FILES} makefile variables above.
#
calc_files_list:
${Q} -(find . -mindepth 1 -maxdepth 1 -type f -name '*.cal' -print | \
while read i; 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; \
echo '--first_line--'; \
echo README; \
echo set8700.line; \
echo bindings) | \
${SED} -e 's:^\./::' | LANG=C ${SORT} | ${FMT} -70 | \
${SED} -e '1s/--first_line--/CALC_FILES=/' -e '2,$$s/^/ /' \
-e 's/$$/ \\/' -e '$$s/ \\$$//'
## ##
# #
# rpm rules # rpm rules
@@ -272,8 +308,8 @@ clobber: clean
# #
install: all install: all
-${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \ -${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \
echo ${MKDIR} ${T}${CALC_SHAREDIR}; \ echo ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
${MKDIR} ${T}${CALC_SHAREDIR}; \ ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \ if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \
echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
@@ -293,7 +329,7 @@ install: all
${RM} -f ${T}${CALC_SHAREDIR}/$$i.new; \ ${RM} -f ${T}${CALC_SHAREDIR}/$$i.new; \
${CP} -f $$i ${T}${CALC_SHAREDIR}/$$i.new; \ ${CP} -f $$i ${T}${CALC_SHAREDIR}/$$i.new; \
${CHMOD} 0444 ${T}${CALC_SHAREDIR}/$$i.new; \ ${CHMOD} 0444 ${T}${CALC_SHAREDIR}/$$i.new; \
${MV} -f ${T}${CALC_SHAREDIR}/$$i.new ${T}${CALC_SHAREDIR}/$$i; \ ${MV} -f ${T}${CALC_SHAREDIR}/$$i.new ${T}${CALC_SHAREDIR}/$$i;\
echo "installed ${T}${CALC_SHAREDIR}/$$i"; \ echo "installed ${T}${CALC_SHAREDIR}/$$i"; \
fi; \ fi; \
done done

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
/* /*
* alg_config - help determine optimal values for algorithm levels * alg_config - help determine optimal values for algorithm levels
* *
* Copyright (C) 2006 Landon Curt Noll * Copyright (C) 2006,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.12 $
* @(#) $Id: alg_config.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $ * @(#) $Id: alg_config.cal,v 30.12 2016/02/06 08:38:56 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/alg_config.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/alg_config.cal,v $
* *
* Under source code control: 2006/06/07 14:10:11 * Under source code control: 2006/06/07 14:10:11
@@ -28,8 +28,37 @@
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/ * Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/ */
static test_time; /* try for this many seconds in loop test */
global test_time; /* try for this many seconds in loop test */
/*
* close_to_one - set to 1 if the ratio is close enough to 1
*
* given:
* ratio the ratio of time between two algorithms
*
* retuns:
* 1 When ratio is near 1.0
* 0 otherwise
*
* We consider the range [0.995, 1.005] to be close enough to 1 to be call unity
* because of the precision of the CPU timing.
*/
define close_to_one(ratio)
{
/* firewall */
if (!isreal(ratio)) {
quit "close: 1st arg: must be a real number";
}
/* check if the ratio is far from unity */
if ((ratio < 0.995) || (ratio > 1.005)) {
return 0;
}
/* we are close to unity */
return 1;
}
/* /*
@@ -80,7 +109,8 @@ define mul_loop(repeat, x)
len = sizeof((*x)[0]) / baseb_bytes; len = sizeof((*x)[0]) / baseb_bytes;
for (i=1; i < 4; ++i) { for (i=1; i < 4; ++i) {
if ((sizeof((*x)[i]) / baseb_bytes) != len) { if ((sizeof((*x)[i]) / baseb_bytes) != len) {
quit "mul_loop: 2nd arg matrix elements are not of equal BASEB-bit word length"; quit "mul_loop: 2nd arg matrix elements are not of "
"equal BASEB-bit word length";
} }
} }
@@ -142,7 +172,7 @@ define mul_loop(repeat, x)
* len length in BASEB-bit words to multiply * len length in BASEB-bit words to multiply
* *
* return: * return:
* ratio of (1st / 2nd) algorithm rate * ratio of (1st / 2nd) algorithm rate.
* *
* When want to determine a rate to a precision of 1 part in 1000. * When want to determine a rate to a precision of 1 part in 1000.
* Most systems today return CPU time to at least 10 msec precision. * Most systems today return CPU time to at least 10 msec precision.
@@ -165,6 +195,7 @@ define mul_ratio(len)
local tover; /* est of time for loop overhead */ local tover; /* est of time for loop overhead */
local alg1_rate; /* loop rate of 1st algorithm */ local alg1_rate; /* loop rate of 1st algorithm */
local alg2_rate; /* loop rate of 2nd algorithm */ local alg2_rate; /* loop rate of 2nd algorithm */
local ret; /* return ratio, or 1.0 */
local i; local i;
/* /*
@@ -217,12 +248,12 @@ define mul_ratio(len)
* determine the 1st algorithm rate * determine the 1st algorithm rate
*/ */
loops = max(1, ceil(loops * test_time / tlen)); loops = max(1, ceil(loops * test_time / tlen));
if (loops < 8) { if (loops < 16) {
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" we must expand loop test time to more than %d secs\n", printf(" we must expand alg1 loop test time to about %d secs\n",
ceil(test_time * (8 / loops))); ceil(test_time * (16 / loops)));
} }
loops = 8; loops = 16;
} }
if (config("user_debug") > 3) { if (config("user_debug") > 3) {
printf("\t will try alg1 %d loops\n", loops); printf("\t will try alg1 %d loops\n", loops);
@@ -263,12 +294,12 @@ define mul_ratio(len)
* determine the 2nd algorithm rate * determine the 2nd algorithm rate
*/ */
loops = max(1, ceil(loops * test_time / tlen)); loops = max(1, ceil(loops * test_time / tlen));
if (loops < 8) { if (loops < 16) {
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" we must expand loop test time to more than %d secs\n", printf(" we must expand alg2 loop test time to about %d secs\n",
ceil(test_time * (8 / loops))); ceil(test_time * (16 / loops)));
} }
loops = 8; loops = 16;
} }
tlen = mul_loop(loops, &x); tlen = mul_loop(loops, &x);
if (config("user_debug") > 3) { if (config("user_debug") > 3) {
@@ -297,7 +328,12 @@ define mul_ratio(len)
/* /*
* return alg1 / alg2 rate ratio * return alg1 / alg2 rate ratio
*/ */
return (alg1_rate / alg2_rate); ret = alg1_rate / alg2_rate;
if (config("user_debug") > 2) {
printf("\tprecise ratio is: %.f mul_ratio will return: %.3f\n",
alg1_rate / alg2_rate, ret);
}
return ret;
} }
@@ -319,30 +355,40 @@ define best_mul2()
{ {
local ratio; /* previously calculated alg1/alg2 ratio */ local ratio; /* previously calculated alg1/alg2 ratio */
local low; /* low loop value tested */ local low; /* low loop value tested */
local high; /* low loop value tested */ local high; /* high loop value tested */
local mid; /* between low and high */
local best_val; /* value found with ratio closest to unity */
local best_ratio; /* cloest ratio found to unity */
local expand; /* how fast to expand the length */ local expand; /* how fast to expand the length */
/* /*
* setup * setup
*/ */
test_time = 15.0; printf("WARNING: This tool may not be computing the correct best value\n");
if (config("user_debug") > 0) { test_time = 5.0;
printf("will start with loop test time of %d secs\n", test_time); printf("The best_mul2() function will take a LONG time to run!\n");
printf("It is important that best_mul2() run on an othwewise idle host!\n");
if (config("user_debug") <= 0) {
printf("To monitor progress, set user_debug to 2: "
"config(\"user_debug\", 2)\n");
} }
printf("Starting with loop test time of %d secs\n", test_time);
/* /*
* firewall - must have a >1 ratio for the initial length * firewall - must have a >1 ratio for the initial length
*/ */
high = 16; high = 8;
best_val = high;
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("testing multiply alg1/alg2 ratio for len = %d\n", high); printf("testing multiply alg1/alg2 ratio for len = %d\n", high);
} }
ratio = mul_ratio(high); ratio = mul_ratio(high);
best_ratio = ratio;
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" multiply alg1/alg2 ratio = %.3f\n", ratio); printf(" multiply alg1/alg2 ratio = %.6f\n", ratio);
} }
if (ratio <= 1.0) { if (ratio < 1.0) {
quit "best_mul2: tests imply config(\"mul2\") should be < 4"; quit "best_mul2: tests imply mul2 should be < 16, which seems bogus";
} }
/* /*
@@ -355,7 +401,7 @@ define best_mul2()
* We will multiplicatively expand our test level until * We will multiplicatively expand our test level until
* the ratio drops below 1.0. * the ratio drops below 1.0.
*/ */
expand = ((ratio >= 3.5) ? 16 : 2^round(ratio)); expand = 2;
low = high; low = high;
high *= expand; high *= expand;
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
@@ -367,19 +413,63 @@ define best_mul2()
* determine the alg1/alg2 test ratio for this new length * determine the alg1/alg2 test ratio for this new length
*/ */
if (high >= 2^31) { if (high >= 2^31) {
quit "best_mul2: tests imply config(\"mul2\") should be >= 2^31"; quit "best_mul2: test implies mul2 >= 2^31, which seems bogus";
} }
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("testing multiply alg1/alg2 ratio for len = %d\n", high); printf("testing multiply alg1/alg2 ratio for len = %d\n", high);
} }
ratio = mul_ratio(high); ratio = mul_ratio(high);
if (config("user_debug") > 1) { if (abs(ratio - 1.0) < abs(best_ratio - 1.0)) {
printf(" multiply alg1/alg2 ratio = %.3f\n", ratio); best_val = high;
best_ratio = ratio;
if (config("user_debug") > 1) {
printf(" len %d has a new cloest ratio to unity: %.6f\n",
best_val, best_ratio);
}
} }
} while (ratio >= 1.0); if (config("user_debug") > 1) {
printf(" multiply alg1/alg2 ratio = %.6f\n", ratio);
}
} while (ratio > 1.0);
/*
* If we previously expanded more than by a factor of 2, then
* we may have jumped over the crossover point. So now
* drop down powers of two until the ratio is again >= 1.0
*/
if (expand > 2) {
do {
/*
* contract by 2
*/
high /= 2;
low = high / 2;
if (config("user_debug") > 0) {
printf("retesting multiply alg1/alg2 ratio for len = %d\n",
high);
}
ratio = mul_ratio(high);
if (abs(ratio - 1.0) < abs(best_ratio - 1.0)) {
best_val = high;
best_ratio = ratio;
if (config("user_debug") > 1) {
printf(" len %d has a new cloest ratio to unity: %.6f\n",
best_val, best_ratio);
}
}
if (config("user_debug") > 1) {
printf(" multiply alg1/alg2 ratio = %.6f\n", ratio);
}
} while (ratio <= 1.0);
/* now that the ratio flipped again, use the previous range */
low = high;
high = high * 2;
}
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("alg1/alg2 ratio now < 1.0, starting binary search between %d and %d\n", printf("Starting binary search between %d and %d\n", low, high);
low, high);
} }
/* /*
@@ -388,30 +478,54 @@ define best_mul2()
while (low+1 < high) { while (low+1 < high) {
/* try the mid-point */ /* try the mid-point */
mid = int((low+high)/2);
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("testing multiply alg1/alg2 ratio for len = %d\n", printf("testing multiply alg1/alg2 ratio for len = %d\n", mid);
int((low+high)/2)); }
ratio = mul_ratio(mid);
if (abs(ratio - 1.0) < abs(best_ratio - 1.0)) {
best_val = mid;
best_ratio = ratio;
if (config("user_debug") > 1) {
printf(" len %d has a new cloest ratio to unity: %.6f\n",
best_val, best_ratio);
}
} }
ratio = mul_ratio(int((low+high)/2));
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" multiply alg1/alg2 ratio = %.3f\n", ratio); printf(" len %d multiply alg1/alg2 ratio = %.6f\n", mid, ratio);
}
/* stop search if near unity */
if (close_to_one(ratio)) {
low = mid;
high = mid;
if (config("user_debug") > 0) {
printf("\twe are close enough to unity ratio at: %d\n", mid);
}
break;
} }
/* bump lower range up if we went over */ /* bump lower range up if we went over */
if (ratio >= 1.0) { if (ratio > 1.0) {
if (config("user_debug") > 2) { if (config("user_debug") > 2) {
printf("\tmove low from %d up to %d\n", printf("\tmove low from %d up to %d\n",
low, int((low+high)/2)); low, mid);
} }
low = int((low+high)/2); low = mid;
/* drop higher range down if we went under */ /* drop higher range down if we went under */
} else { } else {
if (config("user_debug") > 2) { if (config("user_debug") > 2) {
printf("\tmove high from %d down to %d\n", printf("\tmove high from %d down to %d\n",
high, int((low+high)/2)); high, mid);
} }
high = int((low+high)/2); high = mid;
}
/* report on test loop progress */
if (config("user_debug") > 1) {
printf("\tsetting low: %d high: %d diff: %d\n",
low, high, high-low);
} }
} }
@@ -419,10 +533,15 @@ define best_mul2()
* return on the suggested config("mul2") value * return on the suggested config("mul2") value
*/ */
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("best value of config(\"mul2\") is %d\n", printf("Best value for multiply is near %d\n", best_val);
(ratio >= 1.0) ? high : low); printf("Best multiply alg1/alg2 ratio is: %.6f\n", best_ratio);
printf("We suggest placing this line in your .calcrc:\n");
printf("config(\"mul2\", %d),;\n", best_val);
printf("WARNING: It is believed that the output "
"of this resource file is bogus!\n");
printf("WARNING: You may NOT wish to follow the above suggeston.\n");
} }
return ((ratio >= 1.0) ? high : low); return mid;
} }
@@ -472,7 +591,8 @@ define sq_loop(repeat, x)
len = sizeof((*x)[0]) / baseb_bytes; len = sizeof((*x)[0]) / baseb_bytes;
for (i=1; i < 4; ++i) { for (i=1; i < 4; ++i) {
if ((sizeof((*x)[i]) / baseb_bytes) != len) { if ((sizeof((*x)[i]) / baseb_bytes) != len) {
quit "sq_loop: 2nd arg matrix elements are not of equal BASEB-bit word length"; quit "sq_loop: 2nd arg matrix elements are not of equal "
"BASEB-bit word length";
} }
} }
@@ -559,6 +679,7 @@ define sq_ratio(len)
local tover; /* est of time for loop overhead */ local tover; /* est of time for loop overhead */
local alg1_rate; /* loop rate of 1st algorithm */ local alg1_rate; /* loop rate of 1st algorithm */
local alg2_rate; /* loop rate of 2nd algorithm */ local alg2_rate; /* loop rate of 2nd algorithm */
local ret; /* return ratio, or 1.0 */
local i; local i;
/* /*
@@ -611,12 +732,12 @@ define sq_ratio(len)
* determine the 1st algorithm rate * determine the 1st algorithm rate
*/ */
loops = max(1, ceil(loops * test_time / tlen)); loops = max(1, ceil(loops * test_time / tlen));
if (loops < 8) { if (loops < 16) {
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" we must expand loop test time to more than %d secs\n", printf(" we must expand alg1 loop test time to about %d secs\n",
ceil(test_time * (8 / loops))); ceil(test_time * (16 / loops)));
} }
loops = 8; loops = 16;
} }
tlen = sq_loop(loops, &x); tlen = sq_loop(loops, &x);
if (config("user_debug") > 3) { if (config("user_debug") > 3) {
@@ -654,12 +775,12 @@ define sq_ratio(len)
* determine the 2nd algorithm rate * determine the 2nd algorithm rate
*/ */
loops = max(1, ceil(loops * test_time / tlen)); loops = max(1, ceil(loops * test_time / tlen));
if (loops < 8) { if (loops < 16) {
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" we must expand loop test time to more than %d secs\n", printf(" we must expand alg2 loop test time to about %d secs\n",
ceil(test_time * (8 / loops))); ceil(test_time * (16 / loops)));
} }
loops = 8; loops = 16;
} }
tlen = sq_loop(loops, &x); tlen = sq_loop(loops, &x);
if (config("user_debug") > 3) { if (config("user_debug") > 3) {
@@ -688,7 +809,12 @@ define sq_ratio(len)
/* /*
* return alg1 / alg2 rate ratio * return alg1 / alg2 rate ratio
*/ */
return (alg1_rate / alg2_rate); ret = alg1_rate / alg2_rate;
if (config("user_debug") > 2) {
printf("\tprecise ratio is: %.f sq_ratio will return: %.3f\n",
alg1_rate / alg2_rate, ret);
}
return ret;
} }
@@ -710,30 +836,40 @@ define best_sq2()
{ {
local ratio; /* previously calculated alg1/alg2 ratio */ local ratio; /* previously calculated alg1/alg2 ratio */
local low; /* low loop value tested */ local low; /* low loop value tested */
local high; /* low loop value tested */ local high; /* high loop value tested */
local mid; /* between low and high */
local best_val; /* value found with ratio closest to unity */
local best_ratio; /* cloest ratio found to unity */
local expand; /* how fast to expand the length */ local expand; /* how fast to expand the length */
/* /*
* setup * setup
*/ */
test_time = 15.0; printf("WARNING: This tool may not be computing the correct best value\n");
if (config("user_debug") > 0) { test_time = 5.0;
printf("will start with loop test time of %d secs\n", test_time); printf("The best_sq2() function will take a LONG time to run!\n");
printf("It is important that best_sq2() run on an othwewise idle host!\n");
if (config("user_debug") <= 0) {
printf("To monitor progress, set user_debug to 2: "
"config(\"user_debug\", 2)\n");
} }
printf("Starting with loop test time of %d secs\n", test_time);
/* /*
* firewall - must have a >1 ratio for the initial length * firewall - must have a >1 ratio for the initial length
*/ */
high = 16; high = 8;
best_val = high;
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("testing square alg1/alg2 ratio for len = %d\n", high); printf("testing square alg1/alg2 ratio for len = %d\n", high);
} }
ratio = sq_ratio(high); ratio = sq_ratio(high);
best_ratio = ratio;
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" square alg1/alg2 ratio = %.3f\n", ratio); printf(" square alg1/alg2 ratio = %.3f\n", ratio);
} }
if (ratio <= 1.0) { if (ratio < 1.0) {
quit "best_sq2: tests imply config(\"sq2\") should be < 4"; quit "best_sq2: test implies sq2 < 16, which seems bogus";
} }
/* /*
@@ -746,31 +882,75 @@ define best_sq2()
* We will multiplicatively expand our test level until * We will multiplicatively expand our test level until
* the ratio drops below 1.0. * the ratio drops below 1.0.
*/ */
expand = ((ratio >= 3.5) ? 16 : 2^round(ratio)); expand = 2;
low = high; low = high;
high *= expand; high *= expand;
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" expand the next test range by a factor of %d\n", printf(" expand the next test range by a factor of %d\n",
expand); expand);
} }
/* /*
* determine the alg1/alg2 test ratio for this new length * determine the alg1/alg2 test ratio for this new length
*/ */
if (high >= 2^31) { if (high >= 2^31) {
quit "best_sq2: tests imply config(\"sq2\") should be >= 2^31"; quit "best_sq2: tests imply sq2 >= 2^31, which seems bogus";
} }
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("testing square alg1/alg2 ratio for len = %d\n", high); printf("testing square alg1/alg2 ratio for len = %d\n", high);
} }
ratio = sq_ratio(high); ratio = sq_ratio(high);
if (abs(ratio - 1.0) < abs(best_ratio - 1.0)) {
best_val = high;
best_ratio = ratio;
if (config("user_debug") > 1) {
printf(" len %d has a new cloest ratio to unity: %.6f\n",
best_val, best_ratio);
}
}
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" square alg1/alg2 ratio = %.3f\n", ratio); printf(" square alg1/alg2 ratio = %.3f\n", ratio);
} }
} while (ratio >= 1.0); } while (ratio > 1.0);
/*
* If we previously expanded more than by a factor of 2, then
* we may have jumped over the crossover point. So now
* drop down powers of two until the ratio is again >= 1.0
*/
if (expand > 2) {
do {
/*
* contract by 2
*/
high /= 2;
low = high / 2;
if (config("user_debug") > 0) {
printf("retesting multiply alg1/alg2 ratio for len = %d\n",
high);
}
ratio = mul_ratio(high);
if (abs(ratio - 1.0) < abs(best_ratio - 1.0)) {
best_val = high;
best_ratio = ratio;
if (config("user_debug") > 1) {
printf(" len %d has a new cloest ratio to unity: %.6f\n",
best_val, best_ratio);
}
}
if (config("user_debug") > 1) {
printf(" multiply alg1/alg2 ratio = %.6f\n", ratio);
}
} while (ratio <= 1.0);
/* now that the ratio flipped again, use the previous range */
low = high;
high = high * 2;
}
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("alg1/alg2 ratio now < 1.0, starting binary search between %d and %d\n", printf("Starting binary search between %d and %d\n", low, high);
low, high);
} }
/* /*
@@ -779,41 +959,71 @@ define best_sq2()
while (low+1 < high) { while (low+1 < high) {
/* try the mid-point */ /* try the mid-point */
mid = int((low+high)/2);
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("testing square alg1/alg2 ratio for len = %d\n", printf("testing square alg1/alg2 ratio for len = %d\n", mid);
int((low+high)/2)); }
ratio = sq_ratio(mid);
if (abs(ratio - 1.0) < abs(best_ratio - 1.0)) {
best_val = mid;
best_ratio = ratio;
if (config("user_debug") > 1) {
printf(" len %d has a new cloest ratio to unity: %.6f\n",
best_val, best_ratio);
}
} }
ratio = sq_ratio(int((low+high)/2));
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" square alg1/alg2 ratio = %.3f\n", ratio); printf(" len %d square alg1/alg2 ratio = %.6f\n", mid, ratio);
}
/* stop search if near unity */
if (close_to_one(ratio)) {
low = mid;
high = mid;
if (config("user_debug") > 0) {
printf("\twe are close enough to unity ratio at: %d\n", mid);
}
break;
} }
/* bump lower range up if we went over */ /* bump lower range up if we went over */
if (ratio >= 1.0) { if (ratio > 1.0) {
if (config("user_debug") > 2) { if (config("user_debug") > 2) {
printf("\tmove low from %d up to %d\n", printf("\tmove low from %d up to %d\n",
low, int((low+high)/2)); low, mid);
} }
low = int((low+high)/2); low = mid;
/* drop higher range down if we went under */ /* drop higher range down if we went under */
} else { } else {
if (config("user_debug") > 2) { if (config("user_debug") > 2) {
printf("\tmove high from %d down to %d\n", printf("\tmove high from %d down to %d\n",
high, int((low+high)/2)); high, mid);
} }
high = int((low+high)/2); high = mid;
}
/* report on test loop progress */
if (config("user_debug") > 1) {
printf("\tsetting low: %d high: %d diff: %d\n",
low, high, high-low);
} }
} }
/* /*
* return on the suggested config("sq2") value * return on the suggested config("sq2") value
*/ */
mid = int((low+high)/2);
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("best value of config(\"sq2\") is %d\n", printf("Best value for square is near %d\n", best_val);
(ratio >= 1.0) ? high : low); printf("Best square alg1/alg2 ratio is: %.6f\n", best_ratio);
printf("We suggest placing this line in your .calcrc:\n");
printf("config(\"sq2\", %d),;\n", best_val);
printf("WARNING: It is believed that the output "
"of this resource file is bogus!\n");
printf("WARNING: You may NOT wish to follow the above suggeston.\n");
} }
return ((ratio >= 1.0) ? high : low); return mid;
} }
@@ -866,7 +1076,8 @@ define pow_loop(repeat, x, ex)
len = sizeof((*x)[0]) / baseb_bytes; len = sizeof((*x)[0]) / baseb_bytes;
for (i=1; i < 4; ++i) { for (i=1; i < 4; ++i) {
if ((sizeof((*x)[i]) / baseb_bytes) != len) { if ((sizeof((*x)[i]) / baseb_bytes) != len) {
quit "pow_loop: 2nd arg matrix elements are not of equal BASEB-bit word length"; quit "pow_loop: 2nd arg matrix elements are not of "
"equal BASEB-bit word length";
} }
} }
if (!isint(ex) || ex < 3) { if (!isint(ex) || ex < 3) {
@@ -963,6 +1174,7 @@ define pow_ratio(len)
local alg1_rate; /* loop rate of 1st algorithm */ local alg1_rate; /* loop rate of 1st algorithm */
local alg2_rate; /* loop rate of 2nd algorithm */ local alg2_rate; /* loop rate of 2nd algorithm */
local ex; /* exponent to use in pow_loop() */ local ex; /* exponent to use in pow_loop() */
local ret; /* return ratio, or 1.0 */
local i; local i;
/* /*
@@ -985,7 +1197,7 @@ define pow_ratio(len)
/* /*
* setup * setup
*/ */
ex = 5; ex = 7;
/* /*
* initialize x, the values we will pmod * initialize x, the values we will pmod
@@ -1021,12 +1233,12 @@ define pow_ratio(len)
* determine the 1st algorithm rate * determine the 1st algorithm rate
*/ */
loops = max(1, ceil(loops * test_time / tlen)); loops = max(1, ceil(loops * test_time / tlen));
if (loops < 8) { if (loops < 16) {
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" we must expand loop test time to more than %d secs\n", printf(" we must expand alg1 loop test time to about %d secs\n",
ceil(test_time * (8 / loops))); ceil(test_time * (16 / loops)));
} }
loops = 8; loops = 16;
} }
tlen = pow_loop(loops, &x, ex); tlen = pow_loop(loops, &x, ex);
if (config("user_debug") > 3) { if (config("user_debug") > 3) {
@@ -1065,12 +1277,12 @@ define pow_ratio(len)
* determine the 2nd algorithm rate * determine the 2nd algorithm rate
*/ */
loops = max(1, ceil(loops * test_time / tlen)); loops = max(1, ceil(loops * test_time / tlen));
if (loops < 8) { if (loops < 16) {
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" we must expand loop test time to more than %d secs\n", printf(" we must expand alg2 loop test time to about %d secs\n",
ceil(test_time * (8 / loops))); ceil(test_time * (16 / loops)));
} }
loops = 8; loops = 16;
} }
tlen = pow_loop(loops, &x, ex); tlen = pow_loop(loops, &x, ex);
if (config("user_debug") > 3) { if (config("user_debug") > 3) {
@@ -1099,7 +1311,12 @@ define pow_ratio(len)
/* /*
* return alg1 / alg2 rate ratio * return alg1 / alg2 rate ratio
*/ */
return (alg1_rate / alg2_rate); ret = alg1_rate / alg2_rate;
if (config("user_debug") > 2) {
printf("\tprecise ratio is: %.f pow_ratio will return: %.3f\n",
alg1_rate / alg2_rate, ret);
}
return ret;
} }
@@ -1121,17 +1338,25 @@ define best_pow2()
{ {
local ratio; /* previously calculated alg1/alg2 ratio */ local ratio; /* previously calculated alg1/alg2 ratio */
local low; /* low loop value tested */ local low; /* low loop value tested */
local high; /* low loop value tested */ local high; /* high loop value tested */
local mid; /* between low and high */
local best_val; /* value found with ratio closest to unity */
local best_ratio; /* cloest ratio found to unity */
local expand; /* how fast to expand the length */ local expand; /* how fast to expand the length */
local looped; /* 1 ==> we have expanded lengths before */ local looped; /* 1 ==> we have expanded lengths before */
/* /*
* setup * setup
*/ */
test_time = 15.0; printf("WARNING: This tool may not be computing the correct best value\n");
if (config("user_debug") > 0) { test_time = 60.0;
printf("will start with loop test time of %d secs\n", test_time); printf("The best_pow2() function will take a LONG time to run!\n");
printf("It is important that best_pow2() run on an othwewise idle host!\n");
if (config("user_debug") <= 0) {
printf("To monitor progress, set user_debug to 2: "
"config(\"user_debug\", 2)\n");
} }
printf("Starting with loop test time of %d secs\n", test_time);
/* /*
* firewall - must have a >1.02 ratio for the initial length * firewall - must have a >1.02 ratio for the initial length
@@ -1142,16 +1367,27 @@ define best_pow2()
*/ */
low = 4; low = 4;
high = 4; high = 4;
best_val = high;
best_ratio = 1e10; /* not a real value */
do { do {
high *= 4; high *= 4;
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("testing pmod alg1/alg2 ratio for len = %d\n", high); printf("testing pmod alg1/alg2 ratio for len = %d\n", high);
} }
ratio = pow_ratio(high); ratio = pow_ratio(high);
if (abs(ratio - 1.0) < abs(best_ratio - 1.0)) {
best_val = high;
best_ratio = ratio;
if (config("user_debug") > 1) {
printf(" len %d has a new cloest ratio to unity: %.6f\n",
best_val, best_ratio);
}
}
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" pmod alg1/alg2 ratio = %.3f\n", ratio); printf(" pmod alg1/alg2 ratio = %.3f\n", ratio);
if (ratio > 1.0 && ratio <= 1.02) { if (ratio > 1.0 && ratio <= 1.02) {
printf(" while alg1 is slightly better than alg2, it is not clearly better\n"); printf(" while alg1 is slightly better than alg2, "
"it is not clearly better\n");
} }
} }
} while (ratio <= 1.02); } while (ratio <= 1.02);
@@ -1193,20 +1429,27 @@ define best_pow2()
* determine the alg1/alg2 test ratio for this new length * determine the alg1/alg2 test ratio for this new length
*/ */
if (high >= 2^31) { if (high >= 2^31) {
quit "best_pow2: tests imply config(\"pow2\") should be >= 2^31"; quit "best_pow2: test implies pow2 >= 2^31, which seems bogus";
} }
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("testing pmod alg1/alg2 ratio for len = %d\n", high); printf("testing pmod alg1/alg2 ratio for len = %d\n", high);
} }
ratio = pow_ratio(high); ratio = pow_ratio(high);
if (abs(ratio - 1.0) < abs(best_ratio - 1.0)) {
best_val = high;
best_ratio = ratio;
if (config("user_debug") > 1) {
printf(" len %d has a new cloest ratio to unity: %.6f\n",
best_val, best_ratio);
}
}
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" pmod alg1/alg2 ratio = %.3f\n", ratio); printf(" pmod alg1/alg2 ratio = %.6f\n", ratio);
} }
looped = 1; looped = 1;
} while (ratio >= 1.0); } while (ratio > 1.0);
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("alg1/alg2 ratio now < 1.0, starting binary search between %d and %d\n", printf("Starting binary search between %d and %d\n", low, high);
low, high);
} }
/* /*
@@ -1215,39 +1458,69 @@ define best_pow2()
while (low+1 < high) { while (low+1 < high) {
/* try the mid-point */ /* try the mid-point */
mid = int((low+high)/2);
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("testing pmod alg1/alg2 ratio for len = %d\n", printf("testing pow2 alg1/alg2 ratio for len = %d\n", mid);
int((low+high)/2)); }
ratio = pow_ratio(mid);
if (abs(ratio - 1.0) < abs(best_ratio - 1.0)) {
best_val = mid;
best_ratio = ratio;
if (config("user_debug") > 1) {
printf(" len %d has a new cloest ratio to unity: %.6f\n",
best_val, best_ratio);
}
} }
ratio = pow_ratio(int((low+high)/2));
if (config("user_debug") > 1) { if (config("user_debug") > 1) {
printf(" pmod alg1/alg2 ratio = %.3f\n", ratio); printf(" len %d pmod alg1/alg2 ratio = %.6f\n", mid, ratio);
}
/* stop search if near unity */
if (close_to_one(ratio)) {
low = mid;
high = mid;
if (config("user_debug") > 0) {
printf("\twe are close enough to unity ratio at: %d\n", mid);
}
break;
} }
/* bump lower range up if we went over */ /* bump lower range up if we went over */
if (ratio >= 1.0) { if (ratio > 1.0) {
if (config("user_debug") > 2) { if (config("user_debug") > 2) {
printf("\tmove low from %d up to %d\n", printf("\tmove low from %d up to %d\n",
low, int((low+high)/2)); low, mid);
} }
low = int((low+high)/2); low = mid;
/* drop higher range down if we went under */ /* drop higher range down if we went under */
} else { } else {
if (config("user_debug") > 2) { if (config("user_debug") > 2) {
printf("\tmove high from %d down to %d\n", printf("\tmove high from %d down to %d\n",
high, int((low+high)/2)); high, mid);
} }
high = int((low+high)/2); high = mid;
}
/* report on test loop progress */
if (config("user_debug") > 1) {
printf("\tsetting low: %d high: %d diff: %d\n",
low, high, high-low);
} }
} }
/* /*
* return on the suggested config("pow2") value * return on the suggested config("pow2") value
*/ */
mid = int((low+high)/2);
if (config("user_debug") > 0) { if (config("user_debug") > 0) {
printf("best value of config(\"pow2\") is %d\n", printf("Best value for pmod is near %d\n", best_val);
(ratio >= 1.0) ? high : low); printf("Best pmod alg1/alg2 ratio is: %.6f\n", best_ratio);
printf("We suggest placing this line in your .calcrc:\n");
printf("config(\"pow2\", %d),;\n", best_val);
printf("WARNING: It is believed that the output "
"of this resource file is bogus!\n");
printf("WARNING: You may NOT wish to follow the above suggeston.\n");
} }
return ((ratio >= 1.0) ? high : low); return mid;
} }

59
cal/bernpoly.cal Normal file
View File

@@ -0,0 +1,59 @@
/*
* bernpoly - Bernoully polynomials B_n(z) for arbitrary n,z..
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: bernpoly.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/bernpoly.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
read -once zeta2
/* Idea by Don Zagier */
define bernpoly(n,z){
local h s c k;
if(isint(n) && n>=0){
h=0;s=0;c=-1;
for(k=1;k<=n+1;k++){
c*=1-(n+2)/k;
s+=z^n;
z++;
h+=c*s/k;
}
return h;
}
else return -n*hurwitzzeta(1-n,z);
}
/*
* restore internal function from resource debugging
*/
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "bernpoly(n,z)";
}

258
cal/brentsolve.cal Normal file
View File

@@ -0,0 +1,258 @@
/*
* brentsolve - Root finding with the Brent-Dekker trick
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: brentsolve.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/brentsolve.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
/*
A short explanation is at http://en.wikipedia.org/wiki/Brent%27s_method
I tried to follow the description at wikipedia as much as possible to make
the slight changes I did more visible.
You may give http://people.sc.fsu.edu/~jburkardt/cpp_src/brent/brent.html a
short glimpse (Brent's originl Fortran77 versions and some translations of
it).
*/
static true = 1;
static false = 0;
define brentsolve(low, high,eps){
local a b c d fa fb fc fa2 fb2 fc2 s fs tmp tmp2 mflag i places;
a = low;
b = high;
c = 0;
if(isnull(eps))
eps = epsilon(epsilon()*1e-3);
places = highbit(1 + int( 1/epsilon() ) ) + 1;
d = 1/eps;
fa = f(a);
fb = f(b);
fc = 0;
s = 0;
fs = 0;
if(fa * fb >= 0){
if(fa < fb){
epsilon(eps);
return a;
}
else{
epsilon(eps);
return b;
}
}
if(abs(fa) < abs(fb)){
tmp = a; a = b; b = tmp;
tmp = fa; fa = fb; fb = tmp;
}
c = a;
fc = fa;
mflag = 1;
i = 0;
while(!(fb==0) && (abs(a-b) > eps)){
if((fa != fc) && (fb != fc)){
/* Inverse quadratic interpolation*/
fc2 = fc^2;
fa2 = fa^2;
s = bround(((fb^2*((fc*a)-(c*fa)))+(fb*((c*fa2)-(fc2*a)))+(b*((fc2*fa)
-(fc*fa2))))/((fc - fb)*(fa - fb)*(fc - fa)),places++);
}
else{
/* Secant Rule*/
s =bround( b - fb * (b - a) / (fb - fa),places++);
}
tmp2 = (3 * a + b) / 4;
if( (!( ((s > tmp2) && (s < b))||((s < tmp2) && (s > b))))
|| (mflag && (abs(s - b) >= (abs(b - c) / 2)))
|| (!mflag && (abs(s - b) >= (abs(c - d) / 2)))) {
s = (a + b) / 2;
mflag = true;
}
else{
if( (mflag && (abs(b - c) < eps))
|| (!mflag && (abs(c - d) < eps))) {
s = (a + b) / 2;
mflag = true;
}
else
mflag = false;
}
fs = f(s);
c = b;
fc = fb;
if (fa * fs < 0){
b = s;
fb = fs;
}
else {
a = s;
fa = fs;
}
if (abs(fa) < abs(fb)){
tmp = a; a = b; b = tmp;
tmp = fa; fa = fb; fb = tmp;
}
i++;
if (i > 1000){
epsilon(eps);
return newerror("brentsolve: does not converge");
}
}
epsilon(eps);
return b;
}
/*
A variation of the solver to accept functions named differently from "f". The
code should explain it.
*/
define brentsolve2(low, high,which,eps){
local a b c d fa fb fc fa2 fb2 fc2 s fs tmp tmp2 mflag i places;
a = low;
b = high;
c = 0;
switch(param(0)){
case 0:
case 1: return newerror("brentsolve2: not enough argments");
case 2: eps = epsilon(epsilon()*1e-2);
which = 0;break;
case 3: eps = epsilon(epsilon()*1e-2);break;
default: break;
};
places = highbit(1 + int(1/epsilon())) + 1;
d = 1/eps;
switch(which){
case 1: fa = __CZ__invbeta(a);
fb = __CZ__invbeta(b); break;
case 2: fa = __CZ__invincgamma(a);
fb = __CZ__invincgamma(b); break;
default: fa = f(a);fb = f(b); break;
};
fc = 0;
s = 0;
fs = 0;
if(fa * fb >= 0){
if(fa < fb)
return a;
else
return b;
}
if(abs(fa) < abs(fb)){
tmp = a; a = b; b = tmp;
tmp = fa; fa = fb; fb = tmp;
}
c = a;
fc = fa;
mflag = 1;
i = 0;
while(!(fb==0) && (abs(a-b) > eps)){
if((fa != fc) && (fb != fc)){
/* Inverse quadratic interpolation*/
fc2 = fc^2;
fa2 = fa^2;
s = bround(((fb^2*((fc*a)-(c*fa)))+(fb*((c*fa2)-(fc2*a)))+(b*((fc2*fa)
-(fc*fa2))))/((fc - fb)*(fa - fb)*(fc - fa)),places);
places++;
}
else{
/* Secant Rule*/
s =bround( b - fb * (b - a) / (fb - fa),places);
places++;
}
tmp2 = (3 * a + b) / 4;
if( (!( ((s > tmp2) && (s < b))||((s < tmp2) && (s > b))))
|| (mflag && (abs(s - b) >= (abs(b - c) / 2)))
|| (!mflag && (abs(s - b) >= (abs(c - d) / 2)))) {
s = (a + b) / 2;
mflag = true;
}
else{
if( (mflag && (abs(b - c) < eps))
|| (!mflag && (abs(c - d) < eps))) {
s = (a + b) / 2;
mflag = true;
}
else
mflag = false;
}
switch(which){
case 1: fs = __CZ__invbeta(s); break;
case 2: fs = __CZ__invincgamma(s); break;
default: fs = f(s); break;
};
c = b;
fc = fb;
if (fa * fs < 0){
b = s;
fb = fs;
}
else {
a = s;
fa = fs;
}
if (abs(fa) < abs(fb)){
tmp = a; a = b; b = tmp;
tmp = fa; fa = fb; fb = tmp;
}
i++;
if (i > 1000){
return newerror("brentsolve2: does not converge");
}
}
return b;
}
/*
* restore internal function from resource debugging
*/
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "brentsolve(low, high,eps)";
print "brentsolve2(low, high,which,eps)";
}

104
cal/constants.cal Normal file
View File

@@ -0,0 +1,104 @@
/*
* constants - implementation of different constants to arbitrary precision
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: constants.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/constants.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
static __CZ__euler_mascheroni = 0;
static __CZ__euler_mascheroni_prec = 0;
define e(){
local k temp1 temp2 ret eps factor upperlimit prec;
prec = digits(1/epsilon());
if(__CZ__euler_mascheroni != 0 && __CZ__euler_mascheroni_prec >= prec)
return __CZ__euler_mascheroni;
if(prec<=20) return 2.718281828459045235360287471;
if(prec<=1800){
__CZ__euler_mascheroni = exp(1);
__CZ__euler_mascheroni_prec = prec;
}
eps=epsilon(1e-20);
factor = 1;
k = 0;
upperlimit = prec * ln(10);
while(k<upperlimit){
k += ln(factor);
factor++;
}
epsilon(eps);
temp1 = 0;
ret = 1;
for(k=3;k<=factor;k++){
temp2 = temp1;
temp1 = ret;
ret = (k-1) *(temp1 + temp2);
}
ret = inverse( ret * inverse(factorial(factor) ) ) ;
__CZ__euler_mascheroni = ret;
__CZ__euler_mascheroni_prec = prec;
return ret;
}
/* Lupas' series */
static __CZ__catalan = 0;
static __CZ__catalan_prec = 0;
define G(){
local eps a s t n;
eps = epsilon(epsilon()*1e-10);
if(__CZ__catalan != 0 && __CZ__catalan >= log(1/eps))
return __CZ__catalan;
a = 1;
s = 0;
t = 1;
n = 1;
while(abs(t)> eps){
a *= 32 * n^3 * (2*n-1);
a /=((3-16*n+16*n^2)^2);
t = a * (-1)^(n-1) * (40*n^2-24*n+3) / (n^3 * (2*n-1));
s += t;
n += 1;
}
s = s/64;
__CZ__catalan = s;
__CZ__catalan_prec = log(1/eps);
epsilon(eps);
return s;
}
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "e()";
print "G()";
}

204
cal/factorial.cal Normal file
View File

@@ -0,0 +1,204 @@
/*
* factorial - implementation of different algorithms for the factorial
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: factorial.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/factorial.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
/*
* hide internal function from resource debugging
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
/*
get dependencies
*/
read -once toomcook;
/* A simple list to keep things...uhm...simple?*/
static __CZ__primelist = list();
/* Helper for primorial: fill list with primes in range a,b */
define __CZ__fill_prime_list(a,b)
{
local k;
k=a;
if(isprime(k))k--;
while(1){
k = nextprime(k);
if(k > b) break;
append(__CZ__primelist,k );
}
}
/* Helper for factorial: how often prime p divides the factorial of n */
define __CZ__prime_divisors(n,p)
{
local q,m;
q = n;
m = 0;
if (p > n) return 0;
if (p > n/2) return 1;
while (q >= p) {
q = q//p;
m += q;
}
return m;
}
/*
Wrapper. Please set cut-offs to own taste and hardware.
*/
define factorial(n){
local prime result shift prime_list k k1 k2 expo_list pix cut primorial;
result = 1;
prime = 2;
if(!isint(n)) {
return newerror("factorial(n): n is not an integer"); ## or gamma(n)?
}
if(n < 0) return newerror("factorial(n): n < 0");
if(n < 9000 && !isdefined("test8900")) {
## builtin is implemented with splitting but only with
## Toom-Cook 2 (by Karatsuba (the father))
return n!;
}
shift = __CZ__prime_divisors(n,prime);
prime = 3;
cut = n//2;
pix = pix(cut);
prime_list = mat[pix];
expo_list = mat[pix];
k = 0;
/*
Peter Borwein's algorithm
@Article{journals/jal/Borwein85,
author = {Borwein, Peter B.},
title = {On the Complexity of Calculating Factorials.},
journal = {J. Algorithms},
year = {1985},
number = {3},
url = {http://dblp.uni-trier.de/db/journals/jal/jal6.html#Borwein85}
*/
do {
prime_list[k] = prime;
expo_list[k++] = __CZ__prime_divisors(n,prime);
prime = nextprime(prime);
}while(prime <= cut);
/* size of the largest exponent in bits */
k1 = highbit(expo_list[0]);
k2 = size(prime_list)-1;
for(;k1>=0;k1--){
/*
the cut-off for T-C-4 ist still to low, using T-C-3 here
TODO: check cutoffs
*/
result = toomcook3square(result);
/*
almost all time is spend in this loop, so cutting of the
upper half of the primes makes sense
*/
for(k=0; k<=k2; k++) {
if((expo_list[k] & (1 << k1)) != 0) {
result *= prime_list[k];
}
}
}
primorial = primorial( cut, n);
result *= primorial;
result <<= shift;
return result;
}
/*
Helper for primorial: do the product with binary splitting
TODO: do it without the intermediate list
*/
define __CZ__primorial__lowlevel( a, b ,p)
{
local c;
if( b == a) return p ;
if( b-a > 1){
c= (b + a) >> 1;
return __CZ__primorial__lowlevel( a , c , __CZ__primelist[a] )
* __CZ__primorial__lowlevel( c+1 , b , __CZ__primelist[b] ) ;
}
return __CZ__primelist[a] * __CZ__primelist[b];
}
/*
Primorial, Product of consecutive primes in range a,b
Originally meant to do primorials with a start different from 2, but
found out that this is faster at about a=1,b>=10^5 than the builtin
function pfact(). With the moderately small list a=1,b=10^6 (78498
primes) it is 3 times faster. A quick look-up showed what was already
guessed: pfact() does it linearly. (BTW: what is the time complexity
of the primorial with the naive algorithm?)
*/
define primorial(a,b)
{
local C1 C2;
if(!isint(a)) return newerror("primorial(a,b): a is not an integer");
else if(!isint(b)) return newerror("primorial(a,b): b is not an integer");
else if(a < 0) return newerror("primorial(a,b): a < 0");
else if( b < 2 ) return newerror("primorial(a,b): b < 2");
else if( b < a) return newerror("primorial(a,b): b < a");
else{
/* last prime < 2^32 is also max. prime for nextprime()*/
if(b >= 4294967291) return newerror("primorial(a,b): max. prime exceeded");
if(b == 2) return 2;
/*
Can be extended by way of pfact(b)/pfact(floor(a-1/2)) for small a
*/
if(a<=2 && b < 10^5) return pfact(b);
/* TODO: use pix() and a simple array (mat[])instead*/
__CZ__primelist = list();
__CZ__fill_prime_list(a,b);
C1 = size(__CZ__primelist)-1;
return __CZ__primorial__lowlevel( 0, C1,1)
}
}
/*
* restore internal function from resource debugging
* report important interface functions
*/
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "factorial(n)";
print "primorial(a, b)";
}

723
cal/factorial2.cal Normal file
View File

@@ -0,0 +1,723 @@
/*
* factorial2 - implementation of different factorial related functions
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: factorial2.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/factorial2.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
/*
* hide internal function from resource debugging
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
/*
get dependencies
*/
read -once factorial toomcook specialfunctions;
/*
Factorize a factorial and put the result in a 2-column matrix with pi(n) rows
mat[ primes , exponent ]
Result can be restricted to start at a prime different from 2 with the second
argument "start". That arguments gets taken at face value if it prime and
smaller than n, otherwise the next larger prime is taken if that prime is
smaller than n.
*/
define __CZ__factor_factorial(n,start){
local prime prime_list k pix stop;
if(!isint(n)) return
newerror("__CZ__factor_factorial(n,start): n is not integer");
if(n < 0) return newerror("__CZ__factor_factorial(n,start): n < 0");
if(n == 1) return newerror("__CZ__factor_factorial(n,start): n == 1");
if(start){
if(!isint(start) && start < 0 && start > n)
return newerror("__CZ__factor_factorial(n,start): value of "
"parameter 'start' out of range");
if(start == n && isprime(n)){
prime_list = mat[1 , 2];
prime_list[0,0] = n;
prime_list[0,1] = 1;
}
else if(!isprime(start) && nextprime(start) >n)
return newerror("__CZ__factor_factorial(n,start): value of parameter "
"'start' out of range");
else{
if(!isprime(start)) prime = nextprime(start);
else prime = start;
}
}
else
prime = 2;
pix = pix(n);
if(start){
pix -= pix(prime) -1;
}
prime_list = mat[pix , 2];
k = 0;
do {
prime_list[k ,0] = prime;
prime_list[k++,1] = __CZ__prime_divisors(n,prime);
prime = nextprime(prime);
}while(prime <= n);
return prime_list;
}
/*
subtracts exponents of n_1! from exponents of n_2! with n_1<=n_2
Does not check for size or consecutiveness of the primes or a carry
*/
define __CZ__subtract_factored_factorials(matrix_2n,matrix_n){
local k ret len1,len2,tmp count p e;
len1 = size(matrix_n)/2;
len2 = size(matrix_2n)/2;
if(len2<len1){
swap(len1,len2);
tmp = matrix_n;
matrix_n = matrix_2n;
matrix_2n = tmp;
}
tmp = mat[len1,2];
k = 0;
for(;k<len1;k++){
p = matrix_2n[k,0];
e = matrix_2n[k,1] - matrix_n[k,1];
if(e!=0){
tmp[count ,0] = p;
tmp[count++,1] = e;
}
}
ret = mat[count + (len2-len1),2];
for(k=0;k<count;k++){
ret[k,0] = tmp[k,0];
ret[k,1] = tmp[k,1];
}
free(tmp);
for(k=len1;k<len2;k++){
ret[count,0] = matrix_2n[k,0];
ret[count++,1] = matrix_2n[k,1];
}
return ret;
}
/*
adds exponents of n_1! to exponents of n_2! with n_1<=n_2
Does not check for size or consecutiveness of the primes or a carry
*/
define __CZ__add_factored_factorials(matrix_2n,matrix_n){
local k ret len1,len2,tmp;
len1 = size(matrix_n)/2;
len2 = size(matrix_2n)/2;
if(len2<len1){
swap(len1,len2);
tmp = matrix_n;
matrix_n = matrix_2n;
matrix_2n = tmp;
}
ret = mat[len2,2];
k = 0;
for(;k<len1;k++){
ret[k,0] = matrix_2n[k,0];
ret[k,1] = matrix_2n[k,1] + matrix_n[k,1];
}
for(;k<len2;k++){
ret[k,0] = matrix_2n[k,0];
ret[k,1] = matrix_2n[k,1];
}
return ret;
}
/*
Does not check if all exponents are positive
timings
this comb comb-this rel. k/n
; benchmark_binomial(10,13)
n=2^13 k=2^10 0.064004 0.016001 + 0.76923076923076923077
n=2^13 k=2^11 0.064004 0.048003 + 0.84615384615384615385
n=2^13 k=2^12 0.068004 0.124008 - 0.92307692307692307692
; benchmark_binomial(10,15)
n=2^15 k=2^10 0.216014 0.024001 + 0.66666666666666666667
n=2^15 k=2^11 0.220014 0.064004 + 0.73333333333333333333
n=2^15 k=2^12 0.228014 0.212014 + 0.8
n=2^15 k=2^13 0.216013 0.664042 - 0.86666666666666666667
n=2^15 k=2^14 0.240015 1.868117 - 0.93333333333333333333
; benchmark_binomial(11,15)
n=2^15 k=2^11 0.216014 0.068004 + 0.73333333333333333333
n=2^15 k=2^12 0.236015 0.212013 + 0.8
n=2^15 k=2^13 0.216013 0.656041 - 0.86666666666666666667
n=2^15 k=2^14 0.244016 1.872117 - 0.93333333333333333333
; benchmark_binomial(11,18)
n=2^18 k=2^11 1.652103 0.100006 + 0.61111111111111111111
n=2^18 k=2^12 1.608101 0.336021 + 0.66666666666666666667
n=2^18 k=2^13 1.700106 1.140071 + 0.72222222222222222222
n=2^18 k=2^14 1.756109 3.924245 - 0.77777777777777777778
n=2^18 k=2^15 2.036127 13.156822 - 0.83333333333333333333
n=2^18 k=2^16 2.172135 41.974624 - 0.88888888888888888889
n=2^18 k=2^17 2.528158 121.523594 - 0.94444444444444444444
; benchmark_binomial(15,25)
n=2^25 k=2^15 303.790985 38.266392 + 0.6
; benchmark_binomial(17,25)
n=2^25 k=2^17 319.127944 529.025062 - 0.68
*/
define benchmark_binomial(s,limit){
local ret k A B T1 T2 start end N K;
N = 2^(limit);
for(k=s;k<limit;k++){
K = 2^k;
start=usertime();A=binomial(N,K);end=usertime();
T1 = end-start;
start=usertime();B=comb(N,K);end=usertime();
T2 = end-start;
print "n=2^"limit,"k=2^"k," ",T1," ",T2,T1<T2?"-":"+"," "k/limit;
if(A!=B){
print "false";
break;
}
}
}
define __CZ__multiply_factored_factorial(matrix,stop){
local prime result shift prime_list k k1 k2 expo_list pix count start;
local hb flag;
result = 1;
shift = 0;
if(!ismat(matrix))
return newerror("__CZ__multiply_factored_factorial(matrix): "
"argument matrix not a matrix ");
if(!matrix[0,0])
return
newerror("__CZ__multiply_factored_factorial(matrix): "
"matrix[0,0] is null/0");
if(!isnull(stop))
pix = stop;
else
pix = size(matrix)/2-1;
if(matrix[0,0] == 2 && matrix[0,1] > 0){
shift = matrix[0,1];
if(pix-1 == 0)
return 2^matrix[0,1];
}
/*
This is a more general way to do the multiplication, so any optimization
must have been done by the caller.
*/
k = 0;
/*
The size of the largest exponent in bits is calculated dynamically.
Can be done more elegantly and saves one run over the whole array if done
inside the main loop.
*/
hb =0;
for(k=0;k<pix;k++){
k1=highbit(matrix[k,1]);
if(hb < k1)hb=k1;
}
k2 = pix;
start = 0;
if(shift) start++;
for(k1=hb;k1>=0;k1--){
/*
the cut-off for T-C-4 ist still too low, using T-C-3 here
TODO: check cutoffs
*/
result = toomcook3square(result);
for(k=start; k<=k2; k++) {
if((matrix[k,1] & (1 << k1)) != 0) {
result *= matrix[k,0];
}
}
}
result <<= shift;
return result;
}
/*
Compute binomial coeficients n!/(k!(n-k)!)
One of the rare cases where a formula once meant to ease manual computation
is actually the (aymptotically) fastest way to do it (in July 2013) for
the extreme case binomial(2N,N) but for a high price, the memory
needed is pi(N)--theoretically.
*/
define binomial(n,k){
local ret factored_n factored_k factored_nk denom num quot K prime_list prime;
local pix diff;
if(!isint(n) || !isint(k))
return newerror("binomial(n,k): input is not integer");
if(n<0 || k<0)
return newerror("binomial(n,k): input is not >= 0"); ;
if(n<k ) return 0;
if(n==k) return 1;
if(k==0) return 1;
if(k==1) return n;
if(n-k==1) return n;
/*
cut-off depends on real size of n,k and size of n/k
The current cut-off is to small for large n, e.g.:
for 2n=2^23, k=n-n/2 the quotient is q=2n/k=0.25. Empirical tests showed
that 2n=2^23 and k=2^16 with q=0.0078125 are still faster than the
builtin function.
The symmetry (n,k) = (n,n-k) is of not much advantage here. One way
might be to get closer to k=n/2 if k<n-k but only if the difference
is small and n very large.
*/
if(n<2e4 && !isdefined("test8900")) return comb(n,k);
if(n<2e4 && k< n-n/2 && !isdefined("test8900")) return comb(n,k);
/*
This should be done in parallel to save some memory, e.g. no temporary
arrays are needed, all can be done inline.
The theoretical memory needed is pi(k).
Which is still a lot.
*/
prime = 2;
pix = pix(n);
prime_list = mat[pix , 2];
K = 0;
do {
prime_list[K ,0] = prime;
diff = __CZ__prime_divisors(n,prime)-
( __CZ__prime_divisors(n-k,prime)+__CZ__prime_divisors(k,prime));
if(diff != 0)
prime_list[K++,1] = diff;
prime = nextprime(prime);
}while(prime <= k);
do {
prime_list[K ,0] = prime;
diff = __CZ__prime_divisors(n,prime)-__CZ__prime_divisors(n-k,prime);
if(diff != 0)
prime_list[K++,1] = diff;
prime = nextprime(prime);
}while(prime <= n-k);
do {
prime_list[K ,0] = prime;
prime_list[K++,1] = __CZ__prime_divisors(n,prime);
prime = nextprime(prime);
}while(prime <= n);
##print K,pix(k),pix(n-k),pix(n);
##factored_k = __CZ__factor_factorial(k,1);
##factored_nk = __CZ__factor_factorial(n-k,1);
##denom = __CZ__add_factored_factorials(factored_k,factored_nk);
##free(factored_k,factored_nk);
##num = __CZ__factor_factorial(n,1);
##quot = __CZ__subtract_factored_factorials( num , denom );
##free(num,denom);
ret = __CZ__multiply_factored_factorial(`prime_list,K-1);
return ret;
}
/*
Compute large catalan numbers C(n) = binomial(2n,n)/(n+1) with
cut-off: (n>5e4)
Needs a lot of memory.
*/
define bigcatalan(n){
if(!isint(n) )return newerror("bigcatalan(n): n is not integer");
if( n<0) return newerror("bigcatalan(n): n < 0");
if( n<5e4 && !isdefined("test8900") ) return catalan(n);
return binomial(2*n,n)/(n+1);
}
/*
df(-111) = -1/3472059605858239446587523014902616804783337112829102414124928
7753332469144201839599609375
df(-3+1i) = 0.12532538977287649201-0.0502372106177184607i
df(2n + 1) = (2*n)!/(n!*2^n)
*/
define __CZ__double_factorial(n){
local n1 n2 diff prime pix K prime_list k;
prime = 3;
pix = pix(2*n)+1;
prime_list = mat[pix , 2];
K = 0;
do {
prime_list[K ,0] = prime;
diff = __CZ__prime_divisors(2*n,prime)-( __CZ__prime_divisors(n,prime));
if(diff != 0)
prime_list[K++,1] = diff;
prime = nextprime(prime);
}while(prime <= n);
do {
prime_list[K ,0] = prime;
prime_list[K++,1] = __CZ__prime_divisors(2*n,prime);
prime = nextprime(prime);
}while(prime <= 2*n);
return __CZ__multiply_factored_factorial(prime_list,K);
/*
n1=__CZ__factor_factorial(2*n,1);
n1[0,1] = n1[0,1]-n;
n2=__CZ__factor_factorial(n,1);
diff=__CZ__subtract_factored_factorials( n1 , n2 );
return __CZ__multiply_factored_factorial(diff);
*/
}
##1, 1, 3, 15, 105, 945, 10395, 135135, 2027025, 34459425, 654729075,
##13749310575, 316234143225, 7905853580625, 213458046676875,
##6190283353629375, 191898783962510625, 6332659870762850625,
##221643095476699771875, 8200794532637891559375
## 1, 2, 8, 48, 384, 3840, 46080, 645120, 10321920, 185794560,
##3715891200, 81749606400, 1961990553600, 51011754393600,
##1428329123020800, 42849873690624000, 1371195958099968000,
##46620662575398912000, 1678343852714360832000, 63777066403145711616000
define doublefactorial(n){
local n1 n2 diff eps ret;
if(!isint(n) ){
/*
Probably one of the not-so-good ideas. See result of
http://www.wolframalpha.com/input/?i=doublefactorial%28a%2Bbi%29
*/
eps=epsilon(epsilon()*1e-2);
ret = 2^(n/2-1/4 * cos(pi()* n)+1/4) * pi()^(1/4 *
cos(pi()* n)-1/4)* gamma(n/2+1);
epsilon(eps);
return ret;
}
if(n==2) return 2;
if(n==3) return 3;
switch(n){
case -1:
case 0 : return 1;break;
case 2 : return 2;break;
case 3 : return 3;break;
case 4 : return 8;break;
default: break;
}
if(isodd(n)){
/*
TODO: find reasonable cutoff
df(2n + 1) = (2*n)!/(n!*2^n)
*/
if(n>0){
n = (n+1)//2;
return __CZ__double_factorial(n);
}
else{
if(n == -3 ) return -1;
n = ((-n)-1)/2;
return ((-1)^-n)/__CZ__double_factorial(n);
}
}
else{
/*
I'm undecided here. The formula for complex n is valid for the negative
integers, too.
*/
n = n>>1;
if(n>0){
if(!isdefined("test8900"))
return factorial(n)<<n;
else
return n!<<n;
}
else
return newerror("doublefactorial(n): even(n) < 0");
}
}
/*
Algorithm 3.17,
Donald Kreher and Douglas Simpson,
Combinatorial Algorithms,
CRC Press, 1998, page 89.
*/
static __CZ__stirling1;
static __CZ__stirling1_n = -1;
static __CZ__stirling1_m = -1;
define stirling1(n,m){
local i j k;
if(n<0)return newerror("stirling1(n,m): n <= 0");
if(m<0)return newerror("stirling1(n,m): m < 0");
if(n<m) return 0;
if(n==m) return 1;
if(m==0 || n==0) return 0;
/* We always use the list */
/*
if(m=1){
if(iseven(n)) return -factorial(n-1);
else return factorial(n-1);
}
if(m == n-1){
if(iseven(n)) return -binomial(n,2);
else return -binomial(n,2);
}
*/
if(__CZ__stirling1_n >= n && __CZ__stirling1_m >= m){
return __CZ__stirling1[n,m];
}
else{
__CZ__stirling1 = mat[n+1,m+1];
__CZ__stirling1[0,0] = 1;
for(i=1;i<=n;i++)
__CZ__stirling1[i,0] = 0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(j<=i){
__CZ__stirling1[i, j] = __CZ__stirling1[i - 1, j - 1] - (i - 1)\
* __CZ__stirling1[i - 1, j];
}
else{
__CZ__stirling1[i, j] = 0;
}
}
}
__CZ__stirling1_n = n;
__CZ__stirling1_m = m;
return __CZ__stirling1[n,m];
}
}
define stirling2(n,m){
local k sum;
if(n<0)return newerror("stirling2(n,m): n < 0");
if(m<0)return newerror("stirling2(n,m): m < 0");
if(n<m) return 0;
if(n==0 && n!=m) return 0;
if(n==m) return 1;
if(m==0 )return 0;
if(m==1) return 1;
if(m==2) return 2^(n-1)-1;
/*
There are different methods to speed up alternating sums.
This one doesn't.
*/
if(isdefined("test8900")){
for(k=0;k<=m;k++){
sum += (-1)^(m-k)*comb(m,k)*k^n;
}
return sum/(m!);
}
else{
for(k=0;k<=m;k++){
sum += (-1)^(m-k)*binomial(m,k)*k^n;
}
return sum/factorial(m);
}
}
static __CZ__stirling2;
static __CZ__stirling2_n = -1;
static __CZ__stirling2_m = -1;
define stirling2caching(n,m){
local nm i j ;
if(n<0)return newerror("stirling2iter(n,m): n < 0");
if(m<0)return newerror("stirling2iter(n,m): m < 0");
/* no shortcuts here */
if(n<m) return 0;
if(n==0 && n!=m) return 0;
if(n==m) return 1;
if(m==0 )return 0;
if(m==1) return 1;
if(m==2) return 2^(n-1)-1;
nm = n-m;
if(__CZ__stirling2_n >= n && __CZ__stirling2_m >= m){
return __CZ__stirling2[n,m];
}
else{
__CZ__stirling2 = mat[n+1,m+1];
__CZ__stirling2[0,0] = 1;
for(i=1;i<=n;i++){
__CZ__stirling2[i,0] = 0;
for(j=1;j<=m;j++){
if(j<=i){
__CZ__stirling2[i, j] = __CZ__stirling2[i -1, j -1] + (j )\
* __CZ__stirling2[i - 1, j];
}
else{
__CZ__stirling2[i, j] = 0;
}
}
}
}
__CZ__stirling2_n = (n);
__CZ__stirling2_m = (m);
return __CZ__stirling2[n,m];
}
define bell(n){
local sum s2list k A;
if(!isint(n)) return newerror("bell(n): n is not integer");
if(n < 0) return newerror("bell(n): n is not positive");
/* place some more shortcuts here?*/
if(n<=15){
mat A[16] = {
1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, 678570,
4213597, 27644437, 190899322, 1382958545
};
return A[n];
}
/* Start by generating the list of stirling numbers of the second kind */
s2list = stirling2caching(n,n//2);
if(iserror(s2list))
return newerror("bell(n): could not build stirling num. list");
sum = 0;
for(k=1;k<=n;k++){
sum += stirling2caching(n,k);
}
return sum;
}
define subfactorialrecursive(n){
if(n==0) return 1;
if(n==1) return 0;
if(n==2) return 1;
return n * subfactorialrecursive(n-1) + (-1)^n;
}
/* This is, quite amusingely, faster than the very same algorithm in
PARI/GP + GMP*/
define subfactorialiterative(n){
local k temp1 temp2 ret;
if(n==0) return 1;
if(n==1) return 0;
if(n==2) return 1;
temp1 = 0;
ret = 1;
for(k=3;k<=n;k++){
temp2 = temp1;
temp1 = ret;
ret = (k-1) *(temp1 + temp2);
}
return ret;
}
define subfactorial(n){
local epsilon eps ret lnfact;
if(!isint(n))return newerror("subfactorial(n): n is not integer.");
if(n < 0)return newerror("subfactorial(n): n < 0");
return subfactorialiterative(n);
}
define risingfactorial(x,n){
local num denom quot ret;
if(n == 1) return x;
if(x==0) return newerror("risingfactorial(x,n): x == 0");
if(!isint(x) || !isint(n)){
return gamma(x+n)/gamma(x);
}
if(x<1)return newerror("risingfactorial(x,n): integer x and x < 1");
if(x+n < 1)return newerror("risingfactorial(x,n): integer x+n and x+n < 1");
if(x<9000&&n<9000){
return (x+n-1)!/(x-1)!;
}
else{
num = __CZ__factor_factorial(x+n-1,1);
denom = __CZ__factor_factorial(x-1,1);
quot = __CZ__subtract_factored_factorials( num , denom );
free(num,denom);
ret = __CZ__multiply_factored_factorial(quot);
return ret;
}
}
define fallingfactorial(x,n){
local num denom quot ret;
if(n == 0) return 1;
if(!isint(x) || !isint(n)){
if(x == n) return gamma(x+1);
return gamma(x+1)/gamma(x-n+1);
}
else{
if(x<0 || x-n < 0)
return newerror("fallingfactorial(x,n): integer x<0 or x-n < 0");
if(x == n) return factorial(x);
if(x<9000&&n<9000){
return (x)!/(x-n)!;
}
else{
num = __CZ__factor_factorial(x,1);
denom = __CZ__factor_factorial(x-n,1);
quot = __CZ__subtract_factored_factorials( num , denom );
free(num,denom);
ret = __CZ__multiply_factored_factorial(quot);
return ret;
}
}
}
/*
* restore internal function from resource debugging
* report important interface functions
*/
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "binomial(n,k)";
print "bigcatalan(n)";
print "doublefactorial(n)";
print "subfactorial(n)";
print "stirling1(n,m)";
print "stirling2(n,m)";
print "stirling2caching(n,m)";
print "bell(n)";
print "subfactorial(n)";
print "risingfactorial(x,n)";
print "fallingfactorial(x,n)";
}

88
cal/infinities.cal Normal file
View File

@@ -0,0 +1,88 @@
/*
* infinities - handle infinities symbolically, a little helper file
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
define isinfinite(x)
{
if (isstr(x)) {
if (strncmp(x, "cinf", 4) == 0
|| strncmp(x, "pinf", 4) == 0 || strncmp(x, "ninf", 4) == 0)
return 1;
}
return 0;
}
define iscinf(x)
{
if (isstr(x)) {
if (strncmp(x, "cinf", 4) == 0)
return 1;
}
return 0;
}
define ispinf(x)
{
if (isstr(x)) {
if (strncmp(x, "pinf", 4) == 0)
return 1;
}
return 0;
}
define isninf(x)
{
if (isstr(x)) {
if (strncmp(x, "ninf", 4) == 0)
return 1;
}
return 0;
}
define cinf()
{
return "cinf";
}
define ninf()
{
return "ninf";
}
define pinf()
{
return "pinf";
}
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "isinfinite(x)";
print "iscinf(x)";
print "ispinf(x)";
print "isninf(x)";
print "cinf()";
print "ninf()";
print "pinf()";
}

728
cal/intnum.cal Normal file
View File

@@ -0,0 +1,728 @@
/*
* intnum - implementation of tanhsinh- and Gauss-Legendre quadrature
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
read -once infinities;
static __CZ__tanhsinh_x;
static __CZ__tanhsinh_w;
static __CZ__tanhsinh_order;
static __CZ__tanhsinh_prec;
define quadtsdeletenodes()
{
free(__CZ__tanhsinh_x);
free(__CZ__tanhsinh_w);
free(__CZ__tanhsinh_order);
free(__CZ__tanhsinh_prec);
}
define quadtscomputenodes(order, expo, eps)
{
local t cht sht chp sum k PI places;
local h t0 x w;
if (__CZ__tanhsinh_order == order && __CZ__tanhsinh_prec == eps)
return 1;
__CZ__tanhsinh_order = order;
__CZ__tanhsinh_prec = eps;
__CZ__tanhsinh_x = list();
__CZ__tanhsinh_w = list();
/* The tanhsinh algorithm needs a slightly higher precision than G-L */
eps = epsilon(eps * 1e-2);
places = highbit(1 + int (1 / epsilon())) +1;
PI = pi();
sum = 0;
t0 = 2 ^ (-expo);
h = 2 * t0;
/*
* The author wanted to use the mpmath trick here which was
* advertised---and reasonably so!---to be faster. Didn't work out
* so well with calc.
* PI4 = PI/4;
* expt0 = bround(exp(t0),places);
* a = bround( PI4 * expt0,places);
* b = bround(PI4 / expt0,places);
* udelta = bround(exp(h),places);
* urdelta = bround(1/udelta,places);
*/
/* make use of x(-t) = -x(t), w(-t) = w(t) */
for (k = 0; k < 20 * order + 1; k++) {
/*
* x = tanh(pi/2 * sinh(t))
* w = pi/2 * cosh(t) / cosh(pi/2 * sinh(t))^2
*/
t = bround(t0 + k * h, places);
cht = bround(cosh(t), places);
sht = bround(sinh(t), places);
chp = bround(cosh(0.5 * PI * sht), places);
x = bround(tanh(0.5 * PI * sht), places);
w = bround((PI * h * cht) / (2 * chp ^ 2), places);
/*
* c = bround(exp(a-b),places);
* d = bround(1/c,places);
* co =bround( (c+d)/2,places);
* si =bround( (c-d)/2,places);
* x = bround(si / co,places);
* w = bround((a+b) / co^2,places);
*/
if (abs(x - 1) <= eps)
break;
append(__CZ__tanhsinh_x, x);
append(__CZ__tanhsinh_w, w);
/*
* a *= udelta;
* b *= urdelta;
*/
}
/* Normalize the weights to make them add up to 2 (two) */
/*
* for(k=0;k < size(__CZ__tanhsinh_w);k++)
* sum = bround(sum + __CZ__tanhsinh_w[k],places);
* sum *= 2;
* for(k=0;k < size(__CZ__tanhsinh_w);k++)
* __CZ__tanhsinh_w[k] = bround(2.0 * __CZ__tanhsinh_w[k] / sum,places);
*/
epsilon(eps);
return 1;
}
define quadtscore(a, b, n)
{
local k c d order eps places sum ret x x1 x2 xm w w1 w2 m sizel;
eps = epsilon(epsilon() * 1e-2);
places = highbit(1 + int (1 / epsilon())) +1;
m = int (4 + max(0, ln(places / 30.0) / ln(2))) + 2;
if (!isnull(n)) {
order = n;
m = ilog(order / 3, 2) + 1;
} else
order = 3 * 2 ^ (m - 1);
quadtscomputenodes(order, m, epsilon());
sizel = size(__CZ__tanhsinh_w);
if (isinfinite(a) || isinfinite(b)) {
/*
* x
* t = ------------
* 2
* sqrt(1 - y )
*/
if (isninf(a) && ispinf(b)) {
for (k = 0; k < sizel; k++) {
x1 = __CZ__tanhsinh_x[k];
x2 = -__CZ__tanhsinh_x[k];
w1 = __CZ__tanhsinh_w[k];
x = bround(x1 * (1 - x1 ^ 2) ^ (-1 / 2), places);
xm = bround(x2 * (1 - x2 ^ 2) ^ (-1 / 2), places);
w = bround(w1 * (((1 - x1 ^ 2) ^ (-1 / 2)) / (1 - x1 ^ 2)),
places);
w2 = bround(w1 * (((1 - x2 ^ 2) ^ (-1 / 2)) / (1 - x2 ^ 2)),
places);
sum += bround(w * f(x), places);
sum += bround(w2 * f(xm), places);
}
}
/*
* 1
* t = - - + b + 1
* x
*/
else if (isninf(a) && !iscinf(b)) {
for (k = 0; k < sizel; k++) {
x1 = __CZ__tanhsinh_x[k];
x2 = -__CZ__tanhsinh_x[k];
w1 = __CZ__tanhsinh_w[k];
x = bround((b + 1) - (2 / (x1 + 1)), places);
xm = bround((b + 1) - (2 / (x2 + 1)), places);
w = bround(w1 * (1 / 2 * (2 / (x1 + 1)) ^ 2), places);
w2 = bround(w1 * (1 / 2 * (2 / (x2 + 1)) ^ 2), places);
sum += bround(w * f(x), places);
sum += bround(w2 * f(xm), places);
}
}
/*
* 1
* t = - + a - 1
* x
*/
else if (!iscinf(a) && ispinf(b)) {
for (k = 0; k < sizel; k++) {
x1 = __CZ__tanhsinh_x[k];
x2 = -__CZ__tanhsinh_x[k];
w1 = __CZ__tanhsinh_w[k];
x = bround((a - 1) + (2 / (x1 + 1)), places);
xm = bround((a - 1) + (2 / (x2 + 1)), places);
w = bround(w1 * (((1 / 2) * (2 / (x1 + 1)) ^ 2)), places);
w2 = bround(w1 * (((1 / 2) * (2 / (x2 + 1)) ^ 2)), places);
sum += bround(w * f(x), places);
sum += bround(w2 * f(xm), places);
}
} else if (isninf(a) || isninf(b)) {
/*TODO: swap(a,b) and negate(w)? Lookup! */
return newerror("quadtscore: reverse limits?");
} else {
return
newerror("quadtscore: complex infinity not yet implemented");
}
ret = sum;
} else {
/* Avoid rounding errors */
if (a == -1 && b == 1) {
c = 1;
d = 0;
} else {
c = (b - a) / 2;
d = (b + a) / 2;
}
sum = 0;
for (k = 0; k < sizel; k++) {
sum +=
bround(__CZ__tanhsinh_w[k] * f(c * __CZ__tanhsinh_x[k] + d),
places);
sum +=
bround(__CZ__tanhsinh_w[k] * f(c * -__CZ__tanhsinh_x[k] + d),
places);
}
ret = c * sum;
}
epsilon(eps);
return ret;
}
static __CZ__quadts_error;
define quadts(a, b, points)
{
local k sp results epsbits nsect interval length segment slope C ;
local x1 x2 y1 y2 sum D1 D2 D3 D4;
if (param(0) < 2)
return newerror("quadts: not enough arguments");
epsbits = highbit(1 + int (1 / epsilon())) +1;
if (param(0) < 3 || isnull(points)) {
/* return as given */
return quadtscore(a, b);
} else {
if ((isinfinite(a) || isinfinite(b))
&& (!ismat(points) && !islist(points)))
return
newerror(strcat
("quadts: segments of infinite length ",
"are not yet supported"));
if (ismat(points) || islist(points)) {
sp = size(points);
if (sp == 0)
return
newerror(strcat
("quadts: variable 'points` must be a list or ",
"1d-matrix of a length > 0"));
/* check if all points are numbers */
for (k = 0; k < sp; k++) {
if (!isnum(points[k]))
return
newerror(strcat
("quadts: elements of 'points` must be",
" numbers only"));
}
/* We have n-1 intervals and a and b, hence n-1 + 2 results */
results = mat[sp + 1];
if (a != points[0]) {
results[0] = quadtscore(a, points[0]);
} else {
results[0] = 0;
}
if (sp == 1) {
if (b != points[0]) {
results[1] = quadtscore(points[0], b);
} else {
results[1] = 0;
}
} else {
for (k = 1; k < sp; k++) {
results[k] = quadtscore(points[k - 1], points[k]);
}
if (b != points[k - 1]) {
results[k] = quadtscore(points[k - 1], b);
} else {
results[k] = 0;
}
}
} else {
if (!isint(points) || points <= 0)
return newerror(strcat("quadts: variable 'points` must be a ",
"list or a positive integer"));
/* Taking "points" as the number of equally spaced intervals */
results = mat[points + 1];
/* It is easy if a,b lie on the real line */
if (isreal(a) && isreal(b)) {
length = abs(a - b);
segment = length / points;
for (k = 1; k <= points; k++) {
results[k - 1] =
quadtscore(a + (k - 1) * segment, a + k * segment);
}
} else {
/* We have at least one complex limit but treat "points" still
* as the number of equally spaced intervals on a straight line
* connecting a and b. Computing the segments here is a bit
* more complicated but not much, it should have been taught in
* highschool.
* Other contours by way of a list of points */
slope = (im(b) - im(a)) / (re(b) - re(a));
C = (im(a) + slope) * re(a);
length = abs(re(a) - re(b));
segment = length / points;
/* y = mx+C where m is the slope, x is the real part and y the
* imaginary part */
if(re(a)>re(b))swap(a,b);
for (k = re(a); k <= (re(b)); k+=segment) {
x1 = slope*(k) + C;
results[k] = quadtscore(k + x1 * 1i);
}
} /* else of isreal */
} /* else of ismat|islist */
} /* else of isnull(points) */
/* With a bit of undeserved luck we have a result by now. */
sp = size(results);
for (k = 0; k < sp; k++) {
sum += results[k];
}
return sum;
}
static __CZ__gl_x;
static __CZ__gl_w;
static __CZ__gl_order;
static __CZ__gl_prec;
define quadglcomputenodes(N)
{
local places k l x w t1 t2 t3 t4 t5 r tmp;
if (__CZ__gl_order == N && __CZ__gl_prec == epsilon())
return;
__CZ__gl_x = mat[N];
__CZ__gl_w = mat[N];
__CZ__gl_order = N;
__CZ__gl_prec = epsilon();
places = highbit(1 + int (1 / epsilon())) +1;
/*
* Compute roots and weights (doing it inline seems to be fastest)
* Trick shamelessly stolen from D. Bailey et .al (program "arprec")
*/
for (k = 1; k <= N//2; k++) {
r = bround(cos(pi() * (k - .25) / (N + .5)), places);
while (1) {
t1 = 1, t2 = 0;
for (l = 1; l <= N; l++) {
t3 = t2;
t2 = t1;
t1 = bround(((2 * l - 1) * r * t2 - (l - 1) * t3) / l, places);
}
t4 = bround(N * (r * t1 - t2) / ((r ^ 2) - 1), places);
t5 = r;
tmp = t1 / t4;
r = r - tmp;
if (abs(tmp) <= epsilon())
break;
}
x = r;
w = bround(2 / ((1 - r ^ 2) * t4 ^ 2), places);
__CZ__gl_x[k - 1] = x;
__CZ__gl_w[k - 1] = w;
__CZ__gl_x[N - k] = -__CZ__gl_x[k - 1];
__CZ__gl_w[N - k] = __CZ__gl_w[k - 1];
}
return;
}
define quadgldeletenodes()
{
free(__CZ__gl_x);
free(__CZ__gl_w);
free(__CZ__gl_order);
free(__CZ__gl_prec);
}
define quadglcore(a, b, n)
{
local k c d digs order eps places sum ret err x x1 w w1 m;
local phalf x2 px1 spx1 u b1 a1 half;
eps = epsilon(epsilon() * 1e-2);
places = highbit(1 + int (1 / epsilon())) +1;
if (!isnull(n))
order = n;
else {
m = int (4 + max(0, ln(places / 30.0) / ln(2))) + 2;
order = 3 * 2 ^ (m - 1);
}
quadglcomputenodes(order, 1);
if (isinfinite(a) || isinfinite(b)) {
if (isninf(a) && ispinf(b)) {
for (k = 0; k < order; k++) {
x1 = __CZ__gl_x[k];
w1 = __CZ__gl_w[k];
x = bround(x1 * (1 - x1 ^ 2) ^ (-1 / 2), places);
w = bround(w1 * (((1 - x1 ^ 2) ^ (-1 / 2)) / (1 - x1 ^ 2)),
places);
sum += bround(w * f(x), places);
}
} else if (isninf(a) && !iscinf(b)) {
for (k = 0; k < order; k++) {
x1 = __CZ__gl_x[k];
w1 = __CZ__gl_w[k];
x = bround((b + 1) - (2 / (x1 + 1)), places);
w = bround(w1 * (1 / 2 * (2 / (x1 + 1)) ^ 2), places);
sum += bround(w * f(x), places);
}
} else if (!iscinf(a) && ispinf(b)) {
for (k = 0; k < order; k++) {
x1 = __CZ__gl_x[k];
w1 = __CZ__gl_w[k];
x = bround((a - 1) + (2 / (x1 + 1)), places);
w = bround(w1 * (((1 / 2) * (2 / (x1 + 1)) ^ 2)), places);
sum += bround(w * f(x), places);
}
} else if (isninf(a) || isninf(b)) {
/*TODO: swap(a,b) and negate(w)? Lookup! */
return newerror("quadglcore: reverse limits?");
} else
return
newerror("quadglcore: complex infinity not yet implemented");
ret = sum;
} else {
/* Avoid rounding errors */
if (a == -1 && b == 1) {
c = 1;
d = 0;
} else {
c = (b - a) / 2;
d = (b + a) / 2;
}
sum = 0;
for (k = 0; k < order; k++) {
sum += bround(__CZ__gl_w[k] * f(c * __CZ__gl_x[k] + d), places);
}
ret = c * sum;
}
epsilon(eps);
return ret;
}
define quadgl(a, b, points)
{
local k sp results epsbits nsect interval length segment slope C x1 y1 x2
y2;
local sum D1 D2 D3 D4;
if (param(0) < 2)
return newerror("quadgl: not enough arguments");
epsbits = highbit(1 + int (1 / epsilon())) +1;
if (isnull(points)) {
/* return as given */
return quadglcore(a, b);
} else {
/* But if we could half the time needed to execute a single operation
* we could do all of it in just twice that time. */
if (isinfinite(a) || isinfinite(b)
&& (!ismat(points) && !islist(points)))
return
newerror(strcat
("quadgl: multiple segments of infinite length ",
"are not yet supported"));
if (ismat(points) || islist(points)) {
sp = size(points);
if (sp == 0)
return
newerror(strcat
("quadgl: variable 'points` must be a list or ",
"1d-matrix of a length > 0"));
/* check if all points are numbers */
for (k = 0; k < sp; k++) {
if (!isnum(points[k]))
return
newerror(strcat
("quadgl: elements of 'points` must be ",
"numbers only"));
}
/* We have n-1 intervals and a and b, hence n-1 + 2 results */
results = mat[sp + 1];
if (a != points[0]) {
results[0] = quadglcore(a, points[0]);
} else {
results[0] = 0;
}
if (sp == 1) {
if (b != points[0]) {
results[1] = quadglcore(points[0], b);
} else {
results[1] = 0;
}
} else {
for (k = 1; k < sp; k++) {
results[k] = quadglcore(points[k - 1], points[k]);
}
if (b != points[k - 1]) {
results[k] = quadglcore(points[k - 1], b);
} else {
results[k] = 0;
}
}
} else {
if (!isint(points) || points <= 0)
return newerror(strcat("quadgl: variable 'points` must be a ",
"list or a positive integer"));
/* Taking "points" as the number of equally spaced intervals */
results = mat[points + 1];
/* It is easy if a,b lie on the real line */
if (isreal(a) && isreal(b)) {
length = abs(a - b);
segment = length / points;
for (k = 1; k <= points; k++) {
results[k - 1] =
quadglcore(a + (k - 1) * segment, a + k * segment);
}
} else {
/* Other contours by way of a list of points */
slope = (im(b) - im(a)) / (re(b) - re(a));
C = (im(a) + slope) * re(a);
length = abs(re(a) - re(b));
segment = length / points;
/* y = mx+C where m is the slope, x is the real part and y the
* imaginary part */
if(re(a)>re(b))swap(a,b);
for (k = re(a); k <= (re(b)); k+=segment) {
x1 = slope*(k) + C;
results[k] = quadglcore(k + x1 * 1i);
}
} /* else of isreal */
} /* else of ismat|islist */
} /* else of isnull(points) */
/* With a bit of undeserved luck we have a result by now. */
sp = size(results);
for (k = 0; k < sp; k++) {
sum += results[k];
}
return sum;
}
define quad(a, b, points = -1, method = "tanhsinh")
{
if (isnull(a) || isnull(b) || param(0) < 2)
return newerror("quad: both limits must be given");
if (isstr(a)) {
if (strncmp(a, "cinf", 1) == 0)
return
newerror(strcat
("quad: complex infinity not yet supported, use",
" 'pinf' or 'ninf' respectively"));
}
if (isstr(b)) {
if (strncmp(b, "cinf", 1) == 0)
return
newerror(strcat
("quad: complex infinity not yet supported, use",
" 'pinf' or 'ninf' respectively"));
}
if (param(0) == 3) {
if (isstr(points))
method = points;
}
if (strncmp(method, "tanhsinh", 1) == 0) {
if (!isstr(points)) {
if (points == -1) {
return quadts(a, b);
} else {
return quadts(a, b, points);
}
} else {
return quadts(a, b);
}
}
if (strncmp(method, "gausslegendre", 1) == 0) {
if (!isstr(points)) {
if (points == -1) {
return quadgl(a, b);
} else {
return quadgl(a, b, points);
}
} else {
return quadgl(a, b);
}
}
}
define makerange(start, end, steps)
{
local ret k l step C length slope x1 x2 y1 y2;
local segment;
steps = int (steps);
if (steps < 1) {
return newerror("makerange: number of steps must be > 0");
}
if (!isnum(start) || !isnum(end)) {
return newerror("makerange: only numbers are supported yet");
}
if (isreal(start) && isreal(end)) {
step = (end - start) / (steps);
print step;
ret = mat[steps + 1];
for (k = 0; k <= steps; k++) {
ret[k] = k * step + start;
}
} else {
ret = mat[steps + 1];
if (re(start) > re(end)) {
swap(start, end);
}
slope = (im(end) - im(start)) / (re(end) - re(start));
C = im(start) - slope * re(start);
length = abs(re(start) - re(end));
segment = length / (steps);
for (k = re(start), l = 0; k <= (re(end)); k += segment, l++) {
x1 = slope * (k) + C;
ret[l] = k + x1 * 1i;
}
}
return ret;
}
define makecircle(radius, center, points)
{
local ret k a b twopi centerx centery;
if (!isint(points) || points < 2) {
return
newerror("makecircle: number of points is not a positive integer");
}
if (!isnum(center)) {
return newerror("makecircle: center does not lie on the complex plane");
}
if (!isreal(radius) || radius <= 0) {
return newerror("makecircle: radius is not a real > 0");
}
ret = mat[points];
twopi = 2 * pi();
centerx = re(center);
centery = im(center);
for (k = 0; k < points; k++) {
a = centerx + radius * cos(twopi * k / points);
b = centery + radius * sin(twopi * k / points);
ret[k] = a + b * 1i;
}
return ret;
}
define makeellipse(angle, a, b, center, points)
{
local ret k x y twopi centerx centery;
if (!isint(points) || points < 2) {
return
newerror("makeellipse: number of points is not a positive integer");
}
if (!isnum(center)) {
return
newerror("makeellipse: center does not lie on the complex plane");
}
if (!isreal(a) || a <= 0) {
return newerror("makecircle: a is not a real > 0");
}
if (!isreal(b) || b <= 0) {
return newerror("makecircle: b is not a real > 0");
}
if (!isreal(angle)) {
return newerror("makecircle: angle is not a real");
}
ret = mat[points];
twopi = 2 * pi();
centerx = re(center);
centery = im(center);
for (k = 0; k < points; k++) {
x = centerx + a * cos(twopi * k / points) * cos(angle)
- b * sin(twopi * k / points) * sin(angle);
y = centerx + a * cos(twopi * k / points) * sin(angle)
+ b * sin(twopi * k / points) * cos(angle);
ret[k] = x + y * 1i;
}
return ret;
}
define makepoints()
{
local ret k;
ret = mat[param(0)];
for (k = 0; k < param(0); k++) {
if (!isnum(param(k + 1))) {
return
newerror(strcat
("makepoints: parameter number \"", str(k + 1),
"\" is not a number"));
}
ret[k] = param(k + 1);
}
return ret;
}
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "quadtsdeletenodes()";
print "quadtscomputenodes(order, expo, eps)";
print "quadtscore(a,b,n)";
print "quadts(a,b,points)";
print "quadglcomputenodes(N)";
print "quadgldeletenodes()";
print "quadglcore(a,b,n)";
print "quadgl(a,b,points)";
print "quad(a,b,points=-1,method=\"tanhsinh\")";
print "makerange(start, end, steps)";
print "makecircle(radius, center, points)";
print "makeellipse(angle, a, b, center, points)";
print "makepoints(a1,[...])";
}

288
cal/lambertw.cal Normal file
View File

@@ -0,0 +1,288 @@
/*
* lambertw - Lambert's W-function
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: lambertw.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/lambertw.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
/*
R. M. Corless and G. H. Gonnet and D. E. G. Hare and D. J. Jeffrey and
D. E. Knuth, "On the Lambert W Function", Advances n Computational
Mathematics, 329--359, (1996)
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.112.6117
D. J. Jeffrey, D. E. G. Hare, R. M. Corless, "Unwinding the branches of the
Lambert W function", The Mathematical Scientist, 21, pp 1-7, (1996)
http://www.apmaths.uwo.ca/~djeffrey/Offprints/wbranch.pdf
Darko Verebic, "Having Fun with Lambert W(x) Function"
arXiv:1003.1628v1, March 2010, http://arxiv.org/abs/1003.1628
Winitzki, S. "Uniform Approximations for Transcendental Functions",
In Part 1 of Computational Science and its Applications - ICCSA 2003,
Lecture Notes in Computer Science, Vol. 2667, Springer-Verlag,
Berlin, 2003, 780-789. DOI 10.1007/3-540-44839-X_82
A copy may be found by Google.
*/
static true = 1;
static false = 0;
/* Branch 0, Winitzki (2003) , the well known Taylor series*/
define __CZ__lambertw_0(z,eps){
local a=2.344e0, b=0.8842e0, c=0.9294e0, d=0.5106e0, e=-1.213e0;
local y=sqrt(2*exp(1)*z+2);
return (2*ln(1+b*y)-ln(1+c*ln(1+d*y))+e)/(1+1/(2*ln(1+b*y)+2*a));
}
/* branch -1 */
define __CZ__lambertw_m1(z,eps){
local wn k;
/* Cut-off found in Maxima */
if(z < 0.3) return __CZ__lambertw_app(z,eps);
wn = z;
/* Verebic (2010) eqs. 16-18*/
for(k=0;k<10;k++){
wn = ln(-z)-ln(-wn);
}
return wn;
}
/*
generic approximation
series for 1+W((z-2)/(2 e))
Corless et al (1996) (4.22)
Verebic (2010) eqs. 35-37; more coefficients given at the end of sect. 3.1
or online
http://www.wolframalpha.com/input/?
i=taylor+%28+1%2Bproductlog%28+%28z-2%29%2F%282*e%29+%29+%29
or by using the function lambertw_series_print() after running
lambertw_series(z,eps,branch,terms) at least once with the wanted number of
terms and z = 1 (which might throw an error because the series will not
converge in anybodies lifetime for something that far from the branchpoint).
*/
define __CZ__lambertw_app(z,eps){
local b0=-1, b1=1, b2=-1/3, b3=11/72;
local y=sqrt(2*exp(1)*z+2);
return b0 + ( y * (b1 + (y * (b2 + (b3 * y)))));
}
static __CZ__Ws_a;
static __CZ__Ws_c;
static __CZ__Ws_len=0;
define lambertw_series_print(){
local k;
for(k=0;k<__CZ__Ws_len;k++){
print num(__CZ__Ws_c[k]):"/":den(__CZ__Ws_c[k]):"*p^":k;
}
}
/*
The series is fast but only if _very_ close to the branchpoint
The exact branch must be given explicitly, e.g.:
; lambertw(-exp(-1)+.001)-lambertw_series(-exp(-1)+.001,epsilon()*1e-10,0)
-0.14758879113205794065490184399030194122136720202792-
0.00000000000000000000000000000000000000000000000000i
; lambertw(-exp(-1)+.001)-lambertw_series(-exp(-1)+.001,epsilon()*1e-10,1)
0.00000000000000000000000000000000000000000000000000-
0.00000000000000000000000000000000000000000000000000i
*/
define lambertw_series(z,eps,branch,terms){
local k l limit tmp sum A C P PP epslocal;
if(!isnull(terms))
limit = terms;
else
limit = 100;
if(isnull(eps))
eps = epsilon(epsilon()*1e-10);
epslocal = epsilon(eps);
P = sqrt(2*(exp(1)*z+1));
if(branch != 0) P = -P;
tmp=0;sum=0;PP=P;
__CZ__Ws_a = mat[limit+1];
__CZ__Ws_c = mat[limit+1];
__CZ__Ws_len = limit;
/*
c0 = -1; c1 = 1
a0 = 2; a1 =-1
*/
__CZ__Ws_c[0] = -1; __CZ__Ws_c[1] = 1;
__CZ__Ws_a[0] = 2; __CZ__Ws_a[1] = -1;
sum += __CZ__Ws_c[0];
sum += __CZ__Ws_c[1] * P;
PP *= P;
for(k=2;k<limit;k++){
for(l=2;l<k;l++){
__CZ__Ws_a[k] += __CZ__Ws_c[l]*__CZ__Ws_c[k+1-l];
}
__CZ__Ws_c[k] = (k-1) * ( __CZ__Ws_c[k-2]/2
+__CZ__Ws_a[k-2]/4)/
(k+1)-__CZ__Ws_a[k]/2-__CZ__Ws_c[k-1]/(k+1);
tmp = __CZ__Ws_c[k] * PP;
sum += tmp;
if(abs(tmp) <= eps){
epsilon(epslocal);
return sum;
}
PP *= P;
}
epsilon(epslocal);
return
newerror(strcat("lambertw_series: does not converge in ",
str(limit)," terms" ));
}
/* */
define lambertw(z,branch){
local eps epslarge ret branchpoint bparea w we ew w1e wn k places m1e;
local closeness;
eps = epsilon();
if(branch == 0){
if(!im(z)){
if(abs(z) <= eps) return 0;
if(abs(z-exp(1)) <= eps) return 1;
if(abs(z - (-ln(2)/2)) <= eps ) return -ln(2);
if(abs(z - (-pi()/2)) <= eps ) return 1i*pi()/2;
}
}
branchpoint = -exp(-1);
bparea = .2;
if(branch == 0){
if(!im(z) && abs(z-branchpoint) == 0) return -1;
ret = __CZ__lambertw_0(z,eps);
/* Yeah, C&P, I know, sorry */
##ret = ln(z) + 2*pi()*1i*branch - ln(ln(z)+2*pi()*1i*branch);
}
else if(branch == 1){
if(im(z)<0 && abs(z-branchpoint) <= bparea)
ret = __CZ__lambertw_app(z,eps);
/* Does calc have a goto? Oh, it does! */
ret =ln(z) + 2*pi()*1i*branch - ln(ln(z)+2*pi()*1i*branch);
}
else if(branch == -1){##print "-1";
if(!im(z) && abs(z-branchpoint) == 0) return -1;
if(!im(z) && z>branchpoint && z < 0){##print "0";
ret = __CZ__lambertw_m1(z,eps);}
if(im(z)>=0 && abs(z-branchpoint) <= bparea){##print "1";
ret = __CZ__lambertw_app(z,eps);}
ret =ln(z) + 2*pi()*1i*branch - ln(ln(z)+2*pi()*1i*branch);
}
else
ret = ln(z) + 2*pi()*1i*branch - ln(ln(z)+2*pi()*1i*branch);
/*
Such a high precision is only needed _very_ close to the branchpoint
and might even be insufficient if z has not been computed with
sufficient precision itself (M below was calculated by Mathematica and also
with the series above with epsilon(1e-200)):
; epsilon(1e-50)
0.00000000000000000001
; display(50)
20
; M=-0.9999999999999999999999997668356018402875796636464119050387
; lambertw(-exp(-1)+1e-50,0)-M
-0.00000000000000000000000002678416515423276355643684
; epsilon(1e-60)
0.0000000000000000000000000000000000000000000000000
; A=-exp(-1)+1e-50
; epsilon(1e-50)
0.00000000000000000000000000000000000000000000000000
; lambertw(A,0)-M
-0.00000000000000000000000000000000000231185460220585
; lambertw_series(A,epsilon(),0)-M
-0.00000000000000000000000000000000000132145133161626
; epsilon(1e-100)
0.00000000000000000000000000000000000000000000000001
; A=-exp(-1)+1e-50
; epsilon(1e-65)
0.00000000000000000000000000000000000000000000000000
; lambertw_series(A,epsilon(),0)-M
0.00000000000000000000000000000000000000000000000000
; lambertw_series(-exp(-1)+1e-50,epsilon(),0)-M
-0.00000000000000000000000000000000000000002959444084
; epsilon(1e-74)
0.00000000000000000000000000000000000000000000000000
; lambertw_series(-exp(-1)+1e-50,epsilon(),0)-M
-0.00000000000000000000000000000000000000000000000006
*/
closeness = abs(z-branchpoint);
if( closeness< 1){
if(closeness != 0)
eps = epsilon(epsilon()*( closeness));
else
eps = epsilon(epsilon()^2);
}
else
eps = epsilon(epsilon()*1e-2);
epslarge =epsilon();
places = highbit(1 + int(1/epslarge)) + 1;
w = ret;
for(k=0;k<100;k++){
ew = exp(w);
we = w*ew;
if(abs(we-z)<= 4*epslarge*abs(z))break;
w1e = (1+w)*ew;
wn = bround(w- ((we - z) / ( w1e - ( (w+2)*(we-z) )/(2*w+2) ) ),places++) ;
if( abs(wn - w) <= epslarge*abs(wn)) break;
else w = wn;
}
if(k==100){
epsilon(eps);
return newerror("lambertw: Halley iteration does not converge");
}
/* The Maxima coders added a check if the iteration converged to the correct
branch. This coder deems it superfluous. */
epsilon(eps);
return wn;
}
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "lambertw(z,branch)";
print "lambertw_series(z,eps,branch,terms)";
print "lambertw_series_print()";
}

112
cal/lnseries.cal Normal file
View File

@@ -0,0 +1,112 @@
/*
* lnseries - special functions (e.g.: gamma, zeta, psi)
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: lnseries.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/lnseries.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
/*
* hide internal function from resource debugging
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
static __CZ__int_logs;
static __CZ__int_logs_limit;
static __CZ__int_logs_prec;
define deletelnseries(){
free(__CZ__int_logs,__CZ__int_logs_limit,__CZ__int_logs_prec);
}
define lnfromseries(n){
if( isnull(__CZ__int_logs)
|| __CZ__int_logs_limit < n
|| __CZ__int_logs_prec < log(1/epsilon())){
lnseries(n+1);
}
return __CZ__int_logs[n,0];
}
define lnseries(limit){
local k j eps ;
if( isnull(__CZ__int_logs)
|| __CZ__int_logs_limit < limit
|| __CZ__int_logs_prec < log(1/epsilon())){
__CZ__int_logs = mat[limit+1,2];
__CZ__int_logs_limit = limit;
__CZ__int_logs_prec = log(1/epsilon());
/* probably still too much */
eps = epsilon(epsilon()*10^(-(5+log(limit))));
k =2;
while(1){
/* the prime itself, compute logarithm */
__CZ__int_logs[k,0] = ln(k);
__CZ__int_logs[k,1] = k;
for(j = 2*k;j<=limit;j+=k){
/* multiples of prime k, add logarithm of k computed earlier */
__CZ__int_logs[j,0] += __CZ__int_logs[k,0];
/* First hit, set counter to number */
if(__CZ__int_logs[j,1] ==0)
__CZ__int_logs[j,1]=j;
/* reduce counter by prime added */
__CZ__int_logs[j,1] //= __CZ__int_logs[k,1];
}
k++;
if(k>=limit) break;
/* Erastothenes-sieve: look for next prime. */
while(__CZ__int_logs[k,0]!=0){
k++;
if(k>=limit) break;
}
}
/* Second run to include the last factor */
for(k=1;k<=limit;k++){
if(__CZ__int_logs[k,1] != k){
__CZ__int_logs[k,0] +=__CZ__int_logs[ __CZ__int_logs[k,1],0];
__CZ__int_logs[k,1] = 0;
}
}
epsilon(eps);
}
return 1;
}
/*
* restore internal function from resource debugging
*/
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "lnseries(limit)";
print "lnfromseries(n)";
print "deletelnseries()";
}

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.2 $
* @(#) $Id: lucas.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $ * @(#) $Id: lucas.cal,v 30.2 2013/09/27 08:58:46 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/lucas.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/lucas.cal,v $
* *
* Under source code control: 1990/05/03 16:49:51 * Under source code control: 1990/05/03 16:49:51
@@ -442,7 +442,7 @@ lucas(h, n)
* See the function gen_v1() for details on the value of v(1). * See the function gen_v1() for details on the value of v(1).
* *
* input: * input:
* h - h as in h*2^n-1 (h mod 2 != 0) * h - h as in h*2^n-1
* n - n as in h*2^n-1 * n - n as in h*2^n-1
* v1 - gen_v1(h,n) (see function below) * v1 - gen_v1(h,n) (see function below)
* *
@@ -475,13 +475,6 @@ gen_u0(h, n, v1)
quit "bogus arg: v1 is <= 0"; quit "bogus arg: v1 is <= 0";
} }
/*
* enforce the h mod rules
*/
if (h%2 == 0) {
quit "h must not be even";
}
/* /*
* enforce the h > 0 and n >= 2 rules * enforce the h > 0 and n >= 2 rules
*/ */

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.2 $
* @(#) $Id: quat.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $ * @(#) $Id: quat.cal,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/quat.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/quat.cal,v $
* *
* Under source code control: 1990/02/15 01:50:35 * Under source code control: 1990/02/15 01:50:35
@@ -55,7 +55,8 @@ define quat(a,b,c,d)
define quat_print(a) define quat_print(a)
{ {
print "quat(" : a.s : ", " : a.v[0] : ", " : a.v[1] : ", " : a.v[2] : ")" :; print "quat(" : a.s : ", " : a.v[0] : ", " :
a.v[1] : ", " : a.v[2] : ")" :;
} }

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.6 $ * @(#) $Revision: 30.13 $
* @(#) $Id: regress.cal,v 30.6 2010/09/02 06:09:06 chongo Exp $ * @(#) $Id: regress.cal,v 30.13 2016/02/06 08:39:35 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/regress.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/regress.cal,v $
* *
* Under source code control: 1990/02/15 01:50:36 * Under source code control: 1990/02/15 01:50:36
@@ -403,14 +403,14 @@ define test_config()
'512: config("trace") == 0'); '512: config("trace") == 0');
vrfy(config("maxprint") == 16, vrfy(config("maxprint") == 16,
'513: config("maxprint") == 16'); '513: config("maxprint") == 16');
vrfy(config("mul2") == 1780, vrfy(config("mul2") == 28,
'514: config("mul2") == 1780'); '514: config("mul2") == 28');
vrfy(config("sq2") == 3388, vrfy(config("sq2") == 28,
'515: config("sq2") == 3388'); '515: config("sq2") == 28');
vrfy(config("pow2") == 176, vrfy(config("pow2") == 20,
'516: config("pow2") == 176'); '516: config("pow2") == 20');
vrfy(config("redc2") == 220, vrfy(config("redc2") == 25,
'517: config("redc2") == 220'); '517: config("redc2") == 25');
vrfy(config("tilde"), vrfy(config("tilde"),
'518: config("tilde")'); '518: config("tilde")');
vrfy(config("tab"), vrfy(config("tab"),
@@ -768,6 +768,8 @@ print '016: parsed test_bignums()';
/* /*
* Test many of the built-in functions. * Test many of the built-in functions.
*
* See test_functionss() starting at test 9000 for more built-in function tests.
*/ */
define test_functions() define test_functions()
{ {
@@ -1397,7 +1399,8 @@ define test_functions()
vrfy(quomod(10,-3,a,b,12) == 1, '1193: vrfy(quomod(10,-3,a,b,12) == 1'); vrfy(quomod(10,-3,a,b,12) == 1, '1193: vrfy(quomod(10,-3,a,b,12) == 1');
vrfy(a == -3, '1194: a == -3'); vrfy(a == -3, '1194: a == -3');
vrfy(b == 1, '1195: b == 1'); vrfy(b == 1, '1195: b == 1');
vrfy(quomod(-10,-3,a,b,13) == 1,'1196: vrfy(quomod(-10,-3,a,b,13) == 1'); vrfy(quomod(-10,-3,a,b,13) == 1,
'1196: vrfy(quomod(-10,-3,a,b,13) == 1');
vrfy(a == 4, '1197: a == 4'); vrfy(a == 4, '1197: a == 4');
vrfy(b == 2, '1198: b == 2'); vrfy(b == 2, '1198: b == 2');
vrfy(quomod(10,3,a,b,14) == 1, '1199: vrfy(quomod(10,3,a,b,14) == 1'); vrfy(quomod(10,3,a,b,14) == 1, '1199: vrfy(quomod(10,3,a,b,14) == 1');
@@ -1444,7 +1447,12 @@ define test_functions()
vrfy(jacobi(-1,-1) == 0, '1236: jacobi(-1,-1) == 0'); vrfy(jacobi(-1,-1) == 0, '1236: jacobi(-1,-1) == 0');
vrfy(jacobi(0,-1) == 0, '1237: jacobi(0,-1) == 0'); vrfy(jacobi(0,-1) == 0, '1237: jacobi(0,-1) == 0');
print '1238: Ending test_functions'; /*
* NOTE: Function tests are continued in test_functionss()
* starting at test 9000.
*/
print '1293: Ending test_functions';
} }
print '017: parsed test_functions()'; print '017: parsed test_functions()';
@@ -1461,14 +1469,14 @@ define _test_underscore()
local _a = 27; local _a = 27;
local __a = 23209; local __a = 23209;
print "1290: Beginning _test_underscore"; print "1294: Beginning _test_underscore";
vrfy(_a == 27, '1291: _a == 27'); vrfy(_a == 27, '1295: _a == 27');
vrfy(_ == 49, '1292: _ == 49'); vrfy(_ == 49, '1296: _ == 49');
vrfy(__ == 63, '1293: __ == 63'); vrfy(__ == 63, '1297: __ == 63');
vrfy(__a == 23209, '1294: __a == 23209'); vrfy(__a == 23209, '1298: __a == 23209');
print "1295: Ending _test_underscore"; print "1299: Ending _test_underscore";
} }
print '020: parsed _test_underscore'; print '020: parsed _test_underscore';
@@ -1509,8 +1517,10 @@ define test_assoc()
vrfy(isnull(search(a,16)), '1312: isnull(search(a,16))'); vrfy(isnull(search(a,16)), '1312: isnull(search(a,16))');
a["curds","whey"] = "spider"; a["curds","whey"] = "spider";
print '1313: a["curds","whey"] = "spider"'; print '1313: a["curds","whey"] = "spider"';
vrfy(a["curds","whey"] == "spider", '1314: a["curds","whey"] == "spider"'); vrfy(a["curds","whey"] == "spider",
vrfy(a[[rsearch(a,"spider")]] == "spider", '1315: a[[rsearch(a,"spider")]] == "spider"'); '1314: a["curds","whey"] == "spider"');
vrfy(a[[rsearch(a,"spider")]] == "spider",
'1315: a[[rsearch(a,"spider")]] == "spider"');
b = a; b = a;
print '1316: b = a'; print '1316: b = a';
vrfy(b[17] == 19, '1317: b[17] == 19'); vrfy(b[17] == 19, '1317: b[17] == 19');
@@ -4892,7 +4902,8 @@ define test_newsyn()
vrfy(s5500 == 55, '5510: s5500 == 45'); vrfy(s5500 == 55, '5510: s5500 == 45');
vrfy(i == 11, '5511: i == 11'); vrfy(i == 11, '5511: i == 11');
} }
print "5512: { local i; for (s5500 = 0, i = 0; i < 10; i++) s5500 += i; ... }"; print "5512: { local i; for (s5500 = 0, i = 0; i < 10; i++) ":
"s5500 += i; ... }";
vrfy(s5500 == 55, '5513: s5500 == 55'); vrfy(s5500 == 55, '5513: s5500 == 55');
vrfy(i == 11, '5514: i == 11'); vrfy(i == 11, '5514: i == 11');
@@ -5027,7 +5038,7 @@ vrfy(i == 9, '151: i == 9');
/* /*
* test_commaeq - test changes to , and = * test_commaeq - test changes to = and ,
*/ */
obj xx5600 {} xx5600; obj xx5600 {} xx5600;
print '152: obj xx5600 {} xx5600'; print '152: obj xx5600 {} xx5600';
@@ -6506,7 +6517,8 @@ define test_blk()
/* A second named block */ /* A second named block */
B1 = blk("+++6700", 15, 10) = {1,2,3,4,5}; B1 = blk("+++6700", 15, 10) = {1,2,3,4,5};
print '6746: B1 = blk("+++6700", 15 , 10) = {1,2,3,4,5};'; print
'6746: B1 = blk("+++6700", 15 , 10) = {1,2,3,4,5};';
vrfy(size(B1) == 15, '6747: size(B1) == 15'); vrfy(size(B1) == 15, '6747: size(B1) == 15');
vrfy(sizeof(B1) == 20, '6748: sizeof(B1) == 20'); vrfy(sizeof(B1) == 20, '6748: sizeof(B1) == 20');
vrfy(test(B1) == 1, '6749: test(B1) == 1'); vrfy(test(B1) == 1, '6749: test(B1) == 1');
@@ -6871,7 +6883,8 @@ define test_sha1()
z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100)); 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));'; print '7210: z = sha1(list(1,2,3), "curds and whey",',
'2^21701-1, pi(1e-100));';
vrfy(sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83, vrfy(sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83,
'7211: sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83'); '7211: sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83');
@@ -7914,6 +7927,137 @@ return test_exponentiation();
/* 88xx: test exponentiation */ /* 88xx: test exponentiation */
/*
* calc resource functions by Christoph Zurnieden
*/
print;
print '8900: Starting test of calc resource functions by Christoph Zurnieden';
print '8901: read -once "test8900"';
read -once "test8900";
print '8902: about to run test8900(1,,8903)';
testnum = test8900(1,,8903);
print '8999: ecnt = 203;'
ecnt = 203;
/* 89xx: test calc resource functions by Christoph Zurnieden */
/*
* Test more of the built-in functions.
*
* See test_functions() (test 700 - 1238) for other built-in function tests.
*/
define test_functions2()
{
print '9001: Beginning test_functions2';
/* ctype function tests */
vrfy(isalnum("A") == 1, '9002: isalnum("A") == 1');
vrfy(isalnum("a") == 1, '9003: isalnum("a") == 1');
vrfy(isalnum("2") == 1, '9004: isalnum("2") == 1');
vrfy(isalnum("\t") == 0, '9005: isalnum("\\t") == 0');
vrfy(isalpha("A") == 1, '9006: isalpha("A") == 1');
vrfy(isalpha("a") == 1, '9007: isalpha("a") == 1');
vrfy(isalpha("2") == 0, '9008: isalpha("2") == 0');
vrfy(isalpha("\t") == 0, '9009: isalpha("\\t") == 0');
vrfy(iscntrl("A") == 0, '9010: iscntrl("A") == 0');
vrfy(iscntrl("a") == 0, '9011: iscntrl("a") == 0');
vrfy(iscntrl("2") == 0, '9012: iscntrl("2") == 0');
vrfy(iscntrl("\t") == 1, '9013: iscntrl("\\t") == 1');
vrfy(isdigit("A") == 0, '9014: isdigit("A") == 0');
vrfy(isdigit("a") == 0, '9015: isdigit("a") == 0');
vrfy(isdigit("2") == 1, '9016: isdigit("2") == 1');
vrfy(isdigit("\t") == 0, '9017: isdigit("\\t") == 0');
vrfy(isgraph("A") == 1, '9018: isgraph("A") == 1');
vrfy(isgraph("a") == 1, '9019: isgraph("a") == 1');
vrfy(isgraph("2") == 1, '9020: isgraph("2") == 1');
vrfy(isgraph("\t") == 0, '9021: isgraph("\\t") == 0');
vrfy(islower("A") == 0, '9022: islower("A") == 0');
vrfy(islower("a") == 1, '9023: islower("a") == 1');
vrfy(islower("1") == 0, '9024: islower("1") == 0');
vrfy(isprint("A") == 1, '9025: isprint("A") == 1');
vrfy(isprint("a") == 1, '9026: isprint("a") == 1');
vrfy(isprint(" ") == 1, '9027: isprint(" ") == 1');
vrfy(isprint("\t") == 0, '9028: isprint("\\t") == 0');
vrfy(ispunct("A") == 0, '9029: ispunct("A") == 0');
vrfy(ispunct("a") == 0, '9030: ispunct("a") == 0');
vrfy(ispunct(" ") == 0, '9031: ispunct(" ") == 0');
vrfy(ispunct("?") == 1, '9032: ispunct("?") == 1');
vrfy(isspace("A") == 0, '9033: isspace("A") == 0');
vrfy(isspace("Krik") == 0, '9034: isspace("Krik") == 0');
vrfy(isspace(" ") == 1, '9035: isspace(" ") == 1');
vrfy(isspace("?") == 0, '9036: isspace("?") == 0');
vrfy(isupper("A") == 1, '9037: isupper("A") == 1');
vrfy(isupper("a") == 0, '9038: isupper("a") == 0');
vrfy(isupper("1") == 0, '9039: isupper("1") == 0');
vrfy(isxdigit("A") == 1, '9040: isxdigit("A") == 1');
vrfy(isxdigit("f") == 1, '9041: isxdigit("f") == 1');
vrfy(isxdigit("2") == 1, '9042: isxdigit("2") == 1');
vrfy(isxdigit("x") == 0, '9043: isxdigit("x") == 0');
vrfy(strcasecmp("ab", "aBc") == -1,
'9044: strcasecmp("ab", "aBc") == -1');
vrfy(strcasecmp("abc", "aBb") == 1,
'9045: strcasecmp("abc", "aBb") == 1');
vrfy(strcasecmp("abc", "abc") == 0,
'9046: strcasecmp("abc", "abc") == 0');
vrfy(strcasecmp("abc", "aBc") == 0,
'9047: strcasecmp("abc", "aBc") == 0');
vrfy(strcasecmp("abc", "aBd") == -1,
'9048: strcasecmp("abc", "aBd") == -1');
vrfy(strcasecmp("abc\0", "aBc") == 1,
'9049: strcasecmp("a8c\\0", "aBc") == 1');
vrfy(strcasecmp("a\0b", "A\0c") == -1,
'9050: strcasecmp("a\\0b", "A\\0c") == -1');
vrfy(strncasecmp("abc", "xyz", 0) == 0,
'9051: strncasecmp("abc", "xyz", 0) == 0');
vrfy(strncasecmp("abc", "xyz", 1) == -1,
'9052: strncasecmp("abc", "xyz", 1) == -1');
vrfy(strncasecmp("abc", "", 1) == 1,
'9053: strncasecmp("abc", "", 1) == 1');
vrfy(strncasecmp("a", "b", 2) == -1,
'9054: strncasecmp("a", "b", 2) == -1');
vrfy(strncasecmp("ab", "Ac", 2) == -1,
'9055: strncasecmp("ab", "Ac", 2) == -1');
vrfy(strncasecmp("\0ac", "\0b", 2) == -1,
'9056: strncasecmp("\\0ac", "\\0b", 2) == -1');
vrfy(strncasecmp("ab", "aBc", 2) == 0,
'9057: strncasecmp("ab", "aBc", 2) == 0');
vrfy(strncasecmp("abc", "abd", 2) == 0,
'9058: strncasecmp("abc", "abd", 2) == 0');
local s1 = " gnu lesser general public license";
print '9059: local s1 = " gnu lesser general public license";';
vrfy(strcmp(strtolower(" GNU Lesser General Public License"), s1) == 0,
'9060: strcmp(strtolower(" GNU Lesser General Public License"),' +
' s1) == 0');
local s2 = " GNU LESSER GENERAL PUBLIC LICENSE";
print '9061: local s2 = " GNU LESSER GENERAL PUBLIC LICENSE";';
vrfy(strcmp(strtoupper(" GNU Lesser General Public License"), s2) == 0,
'9062: strcmp(strtoupper(" GNU Lesser General Public License"),' +
' s2) == 0');
print '9063: Ending test_functions2';
}
print;
print '9000: parsed test_functions2()';
print;
return test_functions2();
/* /*
* read various calc resource files * read various calc resource files
* *

71
cal/smallfactors.cal Normal file
View File

@@ -0,0 +1,71 @@
/*
* smallfactors - find the factors of a number < 2^32
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
define smallfactors(x0)
{
local d q x flist tuple w;
if (x >= (2 ^ 32) - 1)
return newerror("smallfactors: number must be < 2^32 -1");
tuple = mat[2];
flist = list();
x = x0;
d = 2;
q = 0;
tuple[0] = d;
if (x < 2)
return 0;
do {
q = x // d;
while (x == (q * d)) {
tuple[0] = d;
tuple[1]++;
x = floor(q);
q = x // d;
}
d = nextprime(d);
if (tuple[1] > 0)
append(flist, tuple);
tuple = mat[2];
} while (d <= x);
return flist;
}
define printsmallfactors(flist)
{
local k;
for (k = 0; k < size(flist); k++) {
print flist[k][0]:"^":flist[k][1];
}
}
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "smallfactors(x0)";
print "printsmallfactors(flist)";
}

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.3 $
* @(#) $Id: solve.cal,v 30.2 2008/05/10 13:30:00 chongo Exp $ * @(#) $Id: solve.cal,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/solve.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/solve.cal,v $
* *
* Under source code control: 1990/02/15 01:50:37 * Under source code control: 1990/02/15 01:50:37
@@ -52,7 +52,8 @@ define solve(low, high, epsilon)
if (sgn(flow) == sgn(fhigh)) if (sgn(flow) == sgn(fhigh))
quit "Non-opposite signs"; quit "Non-opposite signs";
while (1) { while (1) {
mid = bround(high - fhigh * (high - low) / (fhigh - flow), places); mid = bround(high - fhigh * (high - low) / (fhigh - flow),
places);
if ((mid == low) || (mid == high)) if ((mid == low) || (mid == high))
places++; places++;
fmid = f(mid); fmid = f(mid);

1469
cal/specialfunctions.cal Normal file

File diff suppressed because it is too large Load Diff

502
cal/statistics.cal Normal file
View File

@@ -0,0 +1,502 @@
/*
* statistics - Some assorted statistics functions.
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: statistics.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/statistics.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
/*
* get dependencies
*/
read -once factorial2 brentsolve
/*******************************************************************************
*
*
* Continuous distributions
*
*
******************************************************************************/
/* regularized incomplete gamma function like in Octave, hence the name */
define gammaincoctave(z,a){
local tmp;
tmp = gamma(z);
return (tmp-gammainc(a,z))/tmp;
}
/* Inverse incomplete beta function. Old and slow. */
static __CZ__invbeta_a;
static __CZ__invbeta_b;
static __CZ__invbeta_x;
define __CZ__invbeta(x){
return __CZ__invbeta_x-__CZ__ibetaas63(x,__CZ__invbeta_a,__CZ__invbeta_b);
}
define invbetainc_slow(x,a,b){
local flag ret eps;
/* place checks and balances here */
eps = epsilon();
if(.5 < x){
__CZ__invbeta_x = 1 - x;
__CZ__invbeta_a = b;
__CZ__invbeta_b = a;
flag = 1;
}
else{
__CZ__invbeta_x = x;
__CZ__invbeta_a = a;
__CZ__invbeta_b = b;
flag = 0;
}
ret = brentsolve2(0,1,1);
if(flag == 1)
ret = 1-ret;
epsilon(eps);
return ret;
}
/* Inverse incomplete beta function. Still old but not as slow as the function
above. */
/*
Purpose:
invbetainc computes inverse of the incomplete Beta function.
Licensing:
This code is distributed under the GNU LGPL license.
Modified:
10 August 2013
Author:
Original FORTRAN77 version by GW Cran, KJ Martin, GE Thomas.
C version by John Burkardt.
Calc version by Christoph Zurnieden
Reference:
GW Cran, KJ Martin, GE Thomas,
Remark AS R19 and Algorithm AS 109:
A Remark on Algorithms AS 63: The Incomplete Beta Integral
and AS 64: Inverse of the Incomplete Beta Integeral,
Applied Statistics,
Volume 26, Number 1, 1977, pages 111-114.
Parameters:
Input, P, Q, the parameters of the incomplete
Beta function.
Input, BETA, the logarithm of the value of
the complete Beta function.
Input, ALPHA, the value of the incomplete Beta
function. 0 <= ALPHA <= 1.
Output, the argument of the incomplete
Beta function which produces the value ALPHA.
Local Parameters:
Local, SAE, the most negative decimal exponent
which does not cause an underflow.
*/
define invbetainc(x,a,b){
return __CZ__invbetainc(a,b,lnbeta(a,b),x);
}
define __CZ__invbetainc(p,q,beta,alpha){
local a acu adj fpu g h iex indx pp prev qq r s sae sq t tx value;
local w xin y yprev places eps;
/* Dirty trick, don't try at home */
eps= epsilon(epsilon()^2);
sae = -((log(1/epsilon())/log(2))//2);
fpu = 10.0^sae;
places = highbit(1 + int(1/epsilon())) + 1;
value = alpha;
if( p <= 0.0 ){
epsilon(eps);
return newerror("invbeta: argument p <= 0");
}
if( q <= 0.0 ){
epsilon(eps);
return newerror("invbeta: argument q <= 0");
}
if( alpha < 0.0 || 1.0 < alpha ){
epsilon(eps);
return newerror("invbeta: argument alpha out of domain");
}
if( alpha == 0.0 ){
epsilon(eps);
return 0;
}
if( alpha == 1.0 ){
epsilon(eps);
return 1;
}
if ( 0.5 < alpha ){
a = 1.0 - alpha;
pp = q;
qq = p;
indx = 1;
}
else{
a = alpha;
pp = p;
qq = q;
indx = 0;
}
r = sqrt ( - ln ( a * a ) );
y = r-(2.30753+0.27061*r)/(1.0+(0.99229+0.04481*r)*r);
if ( 1.0 < pp && 1.0 < qq ){
r = ( y * y - 3.0 ) / 6.0;
s = 1.0 / ( pp + pp - 1.0 );
t = 1.0 / ( qq + qq - 1.0 );
h = 2.0 / ( s + t );
w = y*sqrt(h+r)/h-(t-s)*(r+5.0/6.0-2.0/(3.0*h));
value = pp / ( pp + qq * exp ( w + w ) );
}
else{
r = qq + qq;
t = 1.0 / ( 9.0 * qq );
t = r * ( 1.0 - t + y * sqrt ( t )^ 3 );
if ( t <= 0.0 ){
value = 1.0 - exp ( ( ln ( ( 1.0 - a ) * qq ) + beta ) / qq );
}
else{
t = ( 4.0 * pp + r - 2.0 ) / t;
if ( t <= 1.0 ) {
value = exp ( ( ln ( a * pp ) + beta ) / pp );
}
else{
value = 1.0 - 2.0 / ( t + 1.0 );
}
}
}
r = 1.0 - pp;
t = 1.0 - qq;
yprev = 0.0;
sq = 1.0;
prev = 1.0;
if ( value < 0.0001 )
value = 0.0001;
if ( 0.9999 < value )
value = 0.9999;
acu = 10^sae;
for ( ; ; ){
y = bround(__CZ__ibetaas63( value, pp, qq, beta),places);
xin = value;
y = bround(exp(ln(y-a)+(beta+r*ln(xin)+t*ln(1.0- xin ) )),places);
if ( y * yprev <= 0.0 ) {
prev = max ( sq, fpu );
}
g = 1.0;
for ( ; ; ){
for ( ; ; ){
adj = g * y;
sq = adj * adj;
if ( sq < prev ){
tx = value - adj;
if ( 0.0 <= tx && tx <= 1.0 ) break;
}
g = g / 3.0;
}
if ( prev <= acu ){
if ( indx )
value = 1.0 - value;
epsilon(eps);
return value;
}
if ( y * y <= acu ){
if ( indx )
value = 1.0 - value;
epsilon(eps);
return value;
}
if ( tx != 0.0 && tx != 1.0 )
break;
g = g / 3.0;
}
if ( tx == value ) break;
value = tx;
yprev = y;
}
if ( indx )
value = 1.0 - value;
epsilon(eps);
return value;
}
/*******************************************************************************
*
*
* Beta distribution
*
*
******************************************************************************/
define betapdf(x,a,b){
if(x<0 || x>1) return newerror("betapdf: parameter x out of domain");
if(a<=0) return newerror("betapdf: parameter a out of domain");
if(b<=0) return newerror("betapdf: parameter b out of domain");
return 1/beta(a,b) *x^(a-1)*(1-x)^(b-1);
}
define betacdf(x,a,b){
if(x<0 || x>1) return newerror("betacdf: parameter x out of domain");
if(a<=0) return newerror("betacdf: parameter a out of domain");
if(b<=0) return newerror("betacdf: parameter b out of domain");
return betainc(x,a,b);
}
define betacdfinv(x,a,b){
return invbetainc(x,a,b);
}
define betamedian(a,b){
local t106 t104 t103 t105 approx ret;
if(a == b) return 1/2;
if(a == 1 && b > 0) return 1-(1/2)^(1/b);
if(a > 0 && b == 1) return (1/2)^(1/a);
if(a == 3 && b == 2){
/* Yes, the author is not ashamed to ask Maxima for the exact solution
of a quartic equation. */
t103 = ( (2^(3/2))/27 +4/27 )^(1/3);
t104 = sqrt( ( 9*t103^2 + 4*t103 + 2 )/(t103) )/3;
t105 = -t103-2/(9*t103) +8/9;
t106 = sqrt( (27*t104*t105+16)/(t104) )/(2*3^(3/2));
return -t106+t104/2+1/3;
}
if(a == 2 && b == 3){
t103 = ( (2^(3/2))/27 +4/27 )^(1/3);
t104 = sqrt( ( 9*t103^2 + 4*t103 + 2 )/(t103) )/3;
t105 = -t103-2/(9*t103) +8/9;
t106 = sqrt( (27*t104*t105+16)/(t104) )/(2*3^(3/2));
return 1-(-t106+t104/2+1/3);
}
return invbetainc(1/2,a,b);
}
define betamode(a,b){
if(a + b == 2) return newerror("betamod: a + b = 2 = division by zero");
return (a-1)/(a+b-2);
}
define betavariance(a,b){
return (a*b)/( (a+b)^2*(a+b+1) );
}
define betalnvariance(a,b){
return polygamma(1,a)-polygamma(a+b);
}
define betaskewness(a,b){
return (2*(b-a)*sqrt(a+b+1))/( (a+b+1)*sqrt(a*b) );
}
define betakurtosis(a,b){
local num denom;
num = 6*( (a-b)^2*(a+b+1)-a*b*(a+b+2));
denom = a*b*(a+b+2)*(a+b+3);
return num/denom;
}
define betaentropy(a,b){
return lnbeta(a,b)-(a-1)*psi(a)-(b-1)*psi(b)+(a+b+1)*psi(a+b);
}
/*******************************************************************************
*
*
* Normal (Gaussian) distribution
*
*
******************************************************************************/
define normalpdf(x,mu,sigma){
return 1/(sqrt(2*pi()*sigma^2))*exp( ( (x-mu)^2 )/( 2*sigma^2 ) );
}
define normalcdf(x,mu,sigma){
return 1/2*(1+erf( ( x-mu )/( sqrt(2*sigma^2) ) ) );
}
define probit(p){
if(p<0 || p > 1) return newerror("probit: p out of domain 0<=p<=1");
return sqrt(2)*ervinv(2*p-1);
}
define normalcdfinv(p,mu,sigma){
if(p<0 || p > 1) return newerror("normalcdfinv: p out of domain 0<=p<=1");
return mu+ sigma*probit(p);
}
define normalmean(mu,sigma){return mu;}
define normalmedian(mu,sigma){return mu;}
define normalmode(mu,sigma){return mu;}
define normalvariance(mu,sigma){return sigma^2;}
define normalskewness(mu,sigma){return 0;}
define normalkurtosis(mu,sigma){return 0;}
define normalentropy(mu,sigma){
return 1/3*ln( 2*pi()*exp(1)*sigma^2 );
}
/* moment generating f. */
define normalmgf(mu,sigma,t){
return exp(mu*t+1/2*sigma^2*t^2);
}
/* characteristic f. */
define normalcf(mu,sigma,t){
return exp(mu*t-1/2*sigma^2*t^2);
}
/*******************************************************************************
*
*
* Chi-squared distribution
*
*
******************************************************************************/
define chisquaredpdf(x,k){
if(!isint(k) || k<0) return newerror("chisquaredpdf: k not in N");
if(im(x) || x<0) return newerror("chisquaredpdf: x not in +R");
/* The gamma function does not check for half integers, do it here? */
return 1/(2^(k/2)*gamma(k/2))*x^((k/2)-1)*exp(-x/2);
}
define chisquaredpcdf(x,k){
if(!isint(k) || k<0) return newerror("chisquaredcdf: k not in N");
if(im(x) || x<0) return newerror("chisquaredcdf: x not in +R");
return 1/(gamma(k/2))*gammainc(k/2,x/2);
}
define chisquaredmean(x,k){return k;}
define chisquaredmedian(x,k){
/* TODO: implement a FAST inverse incomplete gamma-{q,p} function */
return k*(1-2/(9*k))^3;
}
define chisquaredmode(x,k){return max(k-2,0);}
define chisquaredvariance(x,k){return 2*k;}
define chisquaredskewness(x,k){return sqrt(8/k);}
define chisquaredkurtosis(x,k){return 12/k;}
define chisquaredentropy(x,k){
return k/2+ln(2*gamma(k/2)) + (1-k/2)*psi(k/2);
}
define chisquaredmfg(k,t){
if(t>=1/2)return newerror("chisquaredmfg: t >= 1/2");
return (1-2*t)^(k/2);
}
define chisquaredcf(k,t){
return (1-2*1i*t)^(k/2);
}
/*
* restore internal function from resource debugging
*/
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "gammaincoctave(z,a)";
print "invbetainc(x,a,b)";
print "betapdf(x,a,b)";
print "betacdf(x,a,b)";
print "betacdfinv(x,a,b)";
print "betamedian(a,b)";
print "betamode(a,b)";
print "betavariance(a,b)";
print "betalnvariance(a,b)";
print "betaskewness(a,b)";
print "betakurtosis(a,b)";
print "betaentropy(a,b)";
print "normalpdf(x,mu,sigma)";
print "normalcdf(x,mu,sigma)";
print "probit(p)";
print "normalcdfinv(p,mu,sigma)";
print "normalmean(mu,sigma)";
print "normalmedian(mu,sigma)";
print "normalmode(mu,sigma)";
print "normalvariance(mu,sigma)";
print "normalskewness(mu,sigma)";
print "normalkurtosis(mu,sigma)";
print "normalentropy(mu,sigma)";
print "normalmgf(mu,sigma,t)";
print "normalcf(mu,sigma,t)";
print "chisquaredpdf(x,k)";
print "chisquaredpcdf(x,k)";
print "chisquaredmean(x,k)";
print "chisquaredmedian(x,k)";
print "chisquaredmode(x,k)";
print "chisquaredvariance(x,k)";
print "chisquaredskewness(x,k)";
print "chisquaredkurtosis(x,k)";
print "chisquaredentropy(x,k)";
print "chisquaredmfg(k,t)";
print "chisquaredcf(k,t)";
}

41
cal/strings.cal Normal file
View File

@@ -0,0 +1,41 @@
/*
* strings - implementation of some of the macros in ctype.h
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
define isascii(c){
c = ord(c);
return (c >= 0 && c< 128);
}
define isblank(c){
c = ord(c);
return ( c == 32 || c == 9 );
}
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "isascii(c)";
print "isblank(c)";
}

View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.3 $
* @(#) $Id: test2600.cal,v 30.2 2007/07/11 22:57:23 chongo Exp $ * @(#) $Id: test2600.cal,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/test2600.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/test2600.cal,v $
* *
* Under source code control: 1995/10/13 00:13:14 * Under source code control: 1995/10/13 00:13:14
@@ -91,7 +91,8 @@ define testismult(str, n, verbose)
if (!ismult(c,a)) { if (!ismult(c,a)) {
m++; m++;
if (verbose > 1) { if (verbose > 1) {
printf("*** Failure with:\na = %d\nb = %d\n", a,b); printf("*** Failure with:\na = %d\nb = %d\n",
a,b);
} }
} }
} }
@@ -133,7 +134,8 @@ define testsqrt(str, n, eps, verbose)
if (abs(c) > 1) { if (abs(c) > 1) {
m++; m++;
if (verbose > 1) { if (verbose > 1) {
printf("*** Failure with:\na = %d\neps = %d\n", a,eps); printf("*** Failure with:\na = %d\neps = %d\n",
a,eps);
} }
} }
} }
@@ -178,7 +180,8 @@ define testexp(str, n, eps, verbose)
if (abs(c) > 0.02) { if (abs(c) > 0.02) {
m++; m++;
if (verbose > 1) { if (verbose > 1) {
printf("*** Failure with:\na = %d\neps = %d\n", a,eps); printf("*** Failure with:\na = %d\neps = %d\n",
a,eps);
} }
} }
} }
@@ -235,7 +238,8 @@ define testln(str, n, eps, verbose)
if (abs(c) > 0.5) { if (abs(c) > 0.5) {
m++; m++;
if (verbose > 1) { if (verbose > 1) {
printf("*** Failure with:\na = %d\neps = %d\n", a,eps); printf("*** Failure with:\na = %d\neps = %d\n",
a,eps);
} }
} }
} }

View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.2 $
* @(#) $Id: test2700.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $ * @(#) $Id: test2700.cal,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/test2700.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/test2700.cal,v $
* *
* Under source code control: 1995/11/01 22:52:25 * Under source code control: 1995/11/01 22:52:25
@@ -127,7 +127,8 @@ define testcsqrt(str, n, verbose)
if (p) { if (p) {
if (verbose > 0) if (verbose > 0)
printf( printf(
"*** Type %d failure for x = %r, y = %r, z = %d\n", "*** Type %d failure for x = %r, "
"y = %r, z = %d\n",
p, x, y, z); p, x, y, z);
m++; m++;
} }

View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.2 $
* @(#) $Id: test4000.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $ * @(#) $Id: test4000.cal,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/test4000.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/test4000.cal,v $
* *
* Under source code control: 1996/03/13 02:38:45 * Under source code control: 1996/03/13 02:38:45
@@ -199,7 +199,8 @@ define ctimes(str, N, n, count, skip, verbose)
p = ptest(A[i], count, skip); p = ptest(A[i], count, skip);
if (p) { if (p) {
if (verbose > 0) { if (verbose > 0) {
printf("*** Error, what should be rare has occurred for x = %d \n", A[i]); printf("*** Error, what should be rare "
"has occurred for x = %d \n", A[i]);
m++; m++;
} }
} }
@@ -306,7 +307,8 @@ define ntimes(str, N, n, count, skip, residue, modulus, verbose)
} }
tprev = round(usertime() - t, 4); tprev = round(usertime() - t, 4);
if (verbose > 0) { if (verbose > 0) {
printf("%d evaluations, nextcand: %d, prevcand: %d\n", n, tnext, tprev); printf("%d evaluations, nextcand: %d, "
"prevcand: %d\n", n, tnext, tprev);
} }
} }

View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.2 $
* @(#) $Id: test8500.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $ * @(#) $Id: test8500.cal,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/test8500.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/test8500.cal,v $
* *
* Under source code control: 1999/11/12 20:59:59 * Under source code control: 1999/11/12 20:59:59
@@ -134,8 +134,8 @@ define onetest_8500(a,b,rnd) {
* The rounding parameter is randomly chosen. * The rounding parameter is randomly chosen.
* *
* After a run of divmod_8500 the a, b, rnd values which gave failure are * After a run of divmod_8500 the a, b, rnd values which gave failure are
* stored in the list L_8500. L_8500[0], L_8500[1], L_8500[2] are a, b, rnd for the first * stored in the list L_8500. L_8500[0], L_8500[1], L_8500[2] are a, b,
* test, etc. * rnd for the first* test, etc.
*/ */
define divmod_8500(N = 10, M1 = 2^128, M2 = 2^64, testnum = 0) define divmod_8500(N = 10, M1 = 2^128, M2 = 2^64, testnum = 0)
{ {

3120
cal/test8900.cal Normal file

File diff suppressed because it is too large Load Diff

362
cal/toomcook.cal Normal file
View File

@@ -0,0 +1,362 @@
/*
* toomcook - implementation of Toom-Cook(3,4) multiplication algorithm
*
* Copyright (C) 2013 Christoph Zurnieden
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: toomcook.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/toomcook.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
/*
* hide internal function from resource debugging
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
/* */
define toomcook3(a,b){
local alen blen a0 a1 a2 b0 b1 b2 m ret sign mask;
local S0 S1 S2 S3 S4 T1 T2;
if(!isint(a) || !isint(b))
return newerror("toomcook3(a,b): a and/or b is not an integer");
alen = digits(a,2);
blen = digits(b,2);
sign = sgn(a) * sgn(b);
/* sgn(x) returns 0 if x = 0 */
if(sign == 0) return 0;
m = min(alen,blen)//3;
mask = ~-(1<<m);
/*
Cut-off at about 4,000 dec. digits
TODO: check
*/
if(isdefined("test8900")){
if(m < 20) return a*b;
}
else{
if(m < 4096 ) return a*b;
}
a = abs(a);
b = abs(b);
a0 = a & mask;
a1 = (a>>m) & mask;
a2 = (a>>(2*m));
b0 = b & mask;
b1 = (b>>m) & mask;
b2 = (b>>(2*m));
/*
Zimmermann
*/
S0 = toomcook3(a0 , b0);
S1 = toomcook3((a2+a1+a0) , (b2+b1+b0));
S2 = toomcook3(((a2<<2)+(a1<<1)+a0) , ((b2<<2)+(b1<<1)+b0));
S3 = toomcook3((a2-a1+a0) , (b2-b1+b0));
S4 = toomcook3(a2,b2);
T1 = (S3<<1) + S2;
T1 /= 3;
T1 += S0;
T1 >>= 1;
T1 -= S4<<1;
T2 = (S1 + S3)>>1;
S1 -= T1;
S2 = T2 - S0 - S4;
S3 = T1 - T2;
ret = (S4<<(4*m)) + (S3<<(3*m)) + (S2<<(2*m)) + (S1<<(1*m)) + S0;
ret = sign *ret;
return ret;
}
define toomcook3square(a){
local alen a0 a1 a2 m tmp tmp2 ret sign S0 S1 S2 S3 S4 T1 mask;
if(!isint(a))return newerror("toomcook3square(a): a is not integer");
alen = digits(a,2);
sign = sgn(a) * sgn(a);
if(sign == 0) return 0;
m = alen//3;
mask = ~-(1<<m);
/*
Cut-off at about 5,000 dec. digits
TODO: check
*/
if(isdefined("test8900")){
if(m < 20) return a^2;
}
else{
if(m < 5000 ) return a^2;
}
a = abs(a);
a0 = a & mask;
a1 = (a>>m) & mask;
a2 = (a>>(2*m));
/*
Bodrato/Zanoni
*/
S0 = toomcook3square(a0);
S1 = toomcook3square(a2+a1+a0);
S2 = toomcook3square(a2-a1+a0);
S3 = toomcook3(a1<<1,a2);
S4 = toomcook3square(a2);
T1 = (S1 + S2)>>1;
S1 = S1 - T1 - S3;
S2 = T1 - S4 -S0;
S1 = S1<<(1*m);
S2 = S2<<(2*m);
S3 = S3<<(3*m);
S4 = S4<<(4*m);
ret = S0 + S1 + S2 + S3 + S4;
ret = sign *ret;
return ret;
}
define toomcook4(a,b)
{
local a0 a1 a2 a3 b0 b1 b2 b3 b4 ret tmp tmp2 tmp3 sign;
local m alen blen mask;
local w1, w2, w3, w4, w5, w6, w7;
if(!isint(a) || !isint(b))
return newerror("toomcook4(a,b): a and/or b is not integer");
alen = digits(a,2);
blen = digits(b,2);
sign = sgn(a) * sgn(b);
if(sign == 0) return 0;
m = min(alen//4,blen//4);
mask = ~-(1<<m);
if(isdefined("test8900")){
if(m < 100) return toomcook3(a,b);
}
else{
if(m < 256*3072) return toomcook3(a,b);
}
a = abs(a);
b = abs(b);
a0 = a & mask;
a1 = (a>>m) & mask;
a2 = (a>>(2*m)) & mask;
a3 = (a>>(3*m));
b0 = b & mask;
b1 = (b>>m) & mask;
b2 = (b>>(2*m)) & mask;
b3 = (b>>(3*m));
/*
Bodrato / Zanoni
*/
w3 = a3 + (a1 + (a2 + a0));
w7 = b3 + (b1 + (b2 + b0));
w4 = -a3 + (-a1 + (a2 + a0));
w5 = -b3 + (-b1 + (b2 + b0));
w3 = toomcook4(w3, w7);
w4 = toomcook4(w4, w5);
w5 = a3 + ((a1<<2) + ((a2<<1) + (a0<<3)));
w2 = b3 + ((b1<<2) + ((b2<<1) + (b0<<3)));
w6 = -a3 + (-(a1<<2) + ((a2<<1) + (a0<<3)));
w7 = -b3 + (-(b1<<2) + ((b2<<1) + (b0<<3)));
w5 = toomcook4(w5, w2);
w6 = toomcook4(w6, w7);
w2 = (a3<<3) + ((a1<<1) + ((a2<<2) + a0));
w7 = (b3<<3) + ((b1<<1) + ((b2<<2) + b0));
w2 = toomcook4(w2, w7);
w1 = toomcook4(a3, b3);
w7 = toomcook4(a0, b0);
w2 = w2 + w5;
w6 = w5 - w6;
w4 = w3 - w4;
w5 = w5 - w1;
w5 -= w7 << 6;
w4 = w4>>1;
w3 = w3 - w4;
w5 = w5<<1;
w5 = w5 - w6;
w2 -= w3 * 65;
w3 = w3 - w7;
w3 = w3 - w1;
w2 += w3 * 45;
w5 -= w3<<3;
w5 = w5//24;
w6 = w6 - w2;
w2 -= w4<<4;
w2 = w2//18;
w3 = w3 - w5;
w4 = w4 - w2;
w6 += w2 * 30;
w6 = w6//60;
w2 = w2 - w6;
ret = w7 + (w6<<m) + (w5<<(2*m)) + (w4<<(3*m))+ (w3<<(4*m))+
(w2<<(5*m))+ (w1<<(6*m));
ret = sign *ret;
return ret;
}
define toomcook4square(a){
local a0 a1 a2 a3 ret S0 S1 S2 S3 S4 S5 S6 S7 tmp tmp2 tmp3;
local sign m alen mask;
local T0 T1 T2 T3 T4 T5 T6 T7 T8;
if(!isint(a) )return newerror("toomcook3square(a): a is not integer");
alen = digits(a,2);
sign = sgn(a) * sgn(a);
/* sgn(x) returns 0 if x = 0 */
if(sign == 0) return 0;
m = (alen)//4;
mask = ~-( 1 << m );
/*
cut-off at about 2 mio. dec. digits
TODO: check!
*/
if(isdefined("test8900")){
if(m < 100) return toomcook3square(a);
}
else{
if(m < 512*3072) return toomcook3square(a);
}
a = abs(a);
a0 = a & mask;
a1 = (a>>m) & mask;
a2 = (a>>(2*m)) & mask;
a3 = (a>>(3*m)) ;
/*
Bodrato / Zanoni
*/
S1 = toomcook4square(a0);
S2 = toomcook4(a0<<1,a1);
S3 = toomcook4((a0 + a1 - a2 - a3 ) , (a0 - a1 - a2 + a3 ));
S4 = toomcook4square(a0 + a1 + a2 + a3 );
S5 = toomcook4( (a0 - a2 )<<1 , (a1 - a3 ));
S6 = toomcook4(a3<<1 , a2);
S7 = toomcook4square(a3);
T1 = S3 + S4;
T2 = (T1 + S5 )>>1;
T3 = S2 + S6;
T4 = T2 - T3;
T5 = T3 - S5;
T6 = T4 - S3;
T7 = T4 - S1;
T8 = T6 - S7;
ret = (S7<<(6*m)) + (S6<<(5*m)) + (T7<<(4*m))
+ (T5<<(3*m)) + (T8<<(2*m)) + (S2<<(1*m)) + S1;
ret = sign *ret;
return ret;
}
/*
TODO: Implement the asymmetric variations
*/
/*
produce_long_random_number(n) returns large pseudorandom numbers. Really large
numbers, e.g.:
produce_long_random_number(16)
is ca 4,128,561 bits (ca 1,242,821 dec. digits) large. Exact length is not
predeterminable because of the chaotic output of the function random().
*/
define __CZ__produce_long_random_number(n)
{
local ret k;
ret = 1;
if(!isint(n) || n<1)
return newerror("__CZ__produce_long_random_number(n): "
"n is not an integer >=1");
for(k=0;k<n;k++){
ret += random();
ret = toomcook4square(ret);
}
return ret;
}
/*
* restore internal function from resource debugging
* report important interface functions
*/
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "toomcook3(a,b)";
print "toomcook3square(a)";
print "toomcook4(a,b)";
print "toomcook4square(a)";
}

116
cal/zeta2.cal Normal file
View File

@@ -0,0 +1,116 @@
/*
* zeta2 - Hurwitz Zeta function
*
* 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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.4 $
* @(#) $Id: zeta2.cal,v 30.4 2013/08/18 20:01:53 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/zeta2.cal,v $
*
* Under source code control: 2013/08/11 01:31:28
* File existed as early as: 2013
*/
/*
* hide internal function from resource debugging
*/
static resource_debug_level;
resource_debug_level = config("resource_debug", 0);
define hurwitzzeta(s,a){
local realpart_a imagpart_s tmp tmp1 tmp2 tmp3;
local sum1 sum2 sum3 i k n precision result limit;
local limit_function offset offset_squared rest_sum eps;
/*
According to Linas Vepstas' "An efficient algorithm for accelerating
the convergence of oscillatory series, useful for computing the
polylogarithm and Hurwitz zeta functions" the Euler-Maclaurin series
is the fastest in most cases.
With a lot of help of the PARI/GP implementation by Prof. Henri Cohen,
hence the different license.
*/
eps=epsilon( epsilon() * 1e-3);
realpart_a=re(a);
if(realpart_a>1.5){
tmp=floor(realpart_a-0.5);
sum1 = 0;
for( i = 1 ; i <= tmp ; i++){
sum1 += ( a - i )^( -s );
}
epsilon(eps);
return (hurwitzzeta(s,a-tmp)-sum1);
}
if(realpart_a<=0){
tmp=ceil(-realpart_a+0.5);
for( i = 0 ; i <= tmp-1 ; i++){
sum2 += ( a + i )^( -s );
}
epsilon(eps);
return (hurwitzzeta(s,a+tmp)+sum2);
}
precision=digits(1/epsilon());
realpart_a=re(s);
imagpart_s=im(s);
epsilon(1e-9);
result=s-1.;
if(abs(result)<0.1){
result=-1;
}
else
result=ln(result);
limit=(precision*ln(10)-re((s-.5)*result)+(1.*realpart_a)*ln(2.*pi()))/2;
limit=max(2,ceil(max(limit,abs(s*1.)/2)));
limit_function=ceil(sqrt((limit+realpart_a/2-.25)^2+(imagpart_s*1.)^2/4)/
pi());
if (config("user_debug") > 0) {
print "limit_function = " limit_function;
print "limit = " limit;
print "prec = " precision;
}
/* Full precison plus 5 digits angstzuschlag*/
epsilon( (10^(-precision)) * 1e-5);
tmp3=(a+limit_function+0.)^(-s);
sum3 = tmp3/2;
for(n=0;n<=limit_function-1;n++){
sum3 += (a+n)^(-s);
}
result=sum3;
offset=a+limit_function;
offset_squared=1./(offset*offset);
tmp1=2*s-1;
tmp2=s*(s-1);
rest_sum=bernoulli(2*limit);
for(k=2*limit-2;k>=2;k-=2){
rest_sum=bernoulli(k)+offset_squared*
(k*k+tmp1*k+tmp2)*rest_sum/((k+1)*(k+2));
}
rest_sum=offset*(1+offset_squared*tmp2*rest_sum/2);
result+=rest_sum*tmp3/(s-1);
epsilon(eps);
return result;
}
/*
* restore internal function from resource debugging
* report important interface functions
*/
config("resource_debug", resource_debug_level),;
if (config("resource_debug") & 3) {
print "hurwitzzeta(s,a)";
}

18
calc.h
View File

@@ -1,7 +1,7 @@
/* /*
* calc - definitions for calculator program * calc - definitions for calculator program
* *
* Copyright (C) 1999-2007 David I. Bell * Copyright (C) 1999-2007,2014 David I. Bell
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.6 $
* @(#) $Id: calc.h,v 30.2 2007/07/10 17:44:52 chongo Exp $ * @(#) $Id: calc.h,v 30.6 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/calc.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/calc.h,v $
* *
* Under source code control: 1990/02/15 01:48:31 * Under source code control: 1990/02/15 01:48:31
@@ -28,8 +28,8 @@
*/ */
#if !defined(__CALC_H__) #if !defined(INCLUDE_CALC_H)
#define __CALC_H__ #define INCLUDE_CALC_H
#include <setjmp.h> #include <setjmp.h>
#if defined(CALC_SRC) /* if we are building from the calc source tree */ #if defined(CALC_SRC) /* if we are building from the calc source tree */
@@ -140,7 +140,8 @@ E_FUNC int ftellid(FILEID id, ZVALUE *res);
E_FUNC int fseekid(FILEID id, ZVALUE offset, int whence); E_FUNC int fseekid(FILEID id, ZVALUE offset, int whence);
E_FUNC int isattyid(FILEID id); E_FUNC int isattyid(FILEID id);
E_FUNC int fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res); E_FUNC int fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res);
E_FUNC int frsearch(FILEID id, char *str, ZVALUE first, ZVALUE last, ZVALUE *res); E_FUNC int frsearch(FILEID id, char *str, ZVALUE first, ZVALUE last,
ZVALUE *res);
E_FUNC void showconstants(void); E_FUNC void showconstants(void);
E_FUNC void freeconstant(unsigned long); E_FUNC void freeconstant(unsigned long);
E_FUNC void freestringconstant(long); E_FUNC void freestringconstant(long);
@@ -151,7 +152,8 @@ E_FUNC void trimconstants(void);
*/ */
E_FUNC int openstring(char *str, size_t num); E_FUNC int openstring(char *str, size_t num);
E_FUNC int openterminal(void); E_FUNC int openterminal(void);
E_FUNC int opensearchfile(char *name, char *pathlist, char *exten, int reopen_ok); E_FUNC int opensearchfile(char *name, char *pathlist, char *exten,
int reopen_ok);
E_FUNC char *nextline(void); E_FUNC char *nextline(void);
E_FUNC int nextchar(void); E_FUNC int nextchar(void);
E_FUNC void reread(void); E_FUNC void reread(void);
@@ -265,4 +267,4 @@ EXTERN char *Copyright;
E_FUNC char *version(void); E_FUNC char *version(void);
#endif /* !__CALC_H__ */ #endif /* !INCLUDE_CALC_H */

View File

@@ -1,5 +1,5 @@
.\" .\"
.\" Copyright (C) 1999-2007 Landon Curt Noll .\" Copyright (C) 1999-2007,2014 Landon Curt Noll
.\" .\"
.\" Calc is open software; you can redistribute it and/or modify it under .\" Calc is open software; you can redistribute it and/or modify it under
.\" the terms of the version 2.1 of the GNU Lesser General Public License .\" the terms of the version 2.1 of the GNU Lesser General Public License
@@ -15,8 +15,8 @@
.\" received a copy with calc; if not, write to Free Software Foundation, Inc. .\" received a copy with calc; if not, write to Free Software Foundation, Inc.
.\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. .\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
.\" .\"
.\" @(#) $Revision: 30.3 $ .\" @(#) $Revision: 30.6 $
.\" @(#) $Id: calc.man,v 30.3 2007/09/08 02:53:09 chongo Exp $ .\" @(#) $Id: calc.man,v 30.6 2014/10/06 08:39:45 chongo Exp $
.\" @(#) $Source: /usr/local/src/bin/calc/RCS/calc.man,v $ .\" @(#) $Source: /usr/local/src/bin/calc/RCS/calc.man,v $
.\" .\"
.\" Under source code control: 1991/07/23 05:48:26 .\" Under source code control: 1991/07/23 05:48:26
@@ -1115,45 +1115,62 @@ To contribute comments, suggestions, enhancements
and interesting and interesting
.B calc .B calc
resource files, and resource files, and
shell scripts please join the low volume calc mailing list. shell scripts please join the calc-tester
low volume moderated calc mailing list.
.sp .sp
To join the low volume calc mailing list, send EMail to: To the calc-tester mailing list, visit the following URL:
.sp .sp
.in +0.5i .in +0.5i
.nf .nf
calc-tester-request at asthe dot com https://www.listbox.com/subscribe/?list_id=239342
.fi .fi
.in -0.5i .in -0.5i
.sp .sp
Your subject must contain the words: To help determine you are a human and not just a spam bot,
you will be required to provide the following additional information:
.sp .sp
.in +0.5i .in +0.5i
.nf .nf
calc mailing list subscription Your Name
Calc Version
For example, the current version is: ${VERSION}
Operating System
If you don't know your operating system, enter: unknown
The date 7 days ago
Consult a calendar :-)
.fi
.in -0.5i
.sp
If you need a human to help you with your mailing list subscription,
or if you have problems with the above procedure, please
send EMail to our special address:
.sp
.in +0.5i
.nf
calc-tester-maillist-help at asthe dot com
NOTE: Remove spaces and replace 'at' with @, 'dot' with .
NOTE: Yes, the EMail address uses 'asthe',
while the web site uses 'isthe'.
.fi
.in -0.5i
.sp
To be sure we see your EMail asking for help with your mailing list
subscription, please use the following phase in your EMail Subject line
your subject must contain the words:
.sp
.in +0.5i
.nf
calc tester mailing list help
.fi .fi
.in -0.5i .in -0.5i
.sp .sp
You may have additional words in your subject line. You may have additional words in your subject line.
.sp .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" .SH "BUG REPORTS / BUG FIXES"
\& \&
.br .br
@@ -1162,10 +1179,12 @@ Send bug reports and bug fixes to:
.sp .sp
.in +0.5i .in +0.5i
.nf .nf
calc-bugs at asthe dot com calc-bug-report at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] NOTE: Remove spaces and replace 'at' with @, 'dot' with .
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
NOTE: Yes, the EMail address uses 'asthe',
while the web site uses 'isthe'.
.fi .fi
.in -0.5i .in -0.5i
.sp .sp
@@ -1178,6 +1197,10 @@ calc bug report
.in -0.5i .in -0.5i
.sp .sp
You may have additional words in your subject line. You may have additional words in your subject line.
.in
However, you may find it more helpful to simply subscribe to the
calc-tester mailing list (see above) and then to send your report
to that mailing list as a wider set calc testers may be able to help you.
.sp .sp
See the See the
.I BUGS .I BUGS
@@ -1196,7 +1219,7 @@ for more information about bug reporting.
.SH "CALC WEB SITE" .SH "CALC WEB SITE"
\& \&
.br .br
Landon Noll maintains the the Landon Noll maintains the
.B calc .B calc
web site is located at: web site is located at:
.sp .sp

View File

@@ -1,8 +1,7 @@
#****h* calc/calc.spec.in
# #
# calc.spec.in - template specfile for calc # calc.spec.in - template specfile for calc
# #
# Copyright (C) 2003-2013 Petteri Kettunen and Landon Curt Noll # Copyright (C) 2003-2014 Petteri Kettunen and Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +17,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# @(#) $Revision: 30.10 $ # @(#) $Revision: 30.23 $
# @(#) $Id: calc.spec.in,v 30.10 2013/05/05 11:57:44 chongo Exp $ # @(#) $Id: calc.spec.in,v 30.23 2014/09/22 05:01:58 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/calc.spec.in,v $ # @(#) $Source: /usr/local/src/bin/calc/RCS/calc.spec.in,v $
# #
# Under source code control: 2003/02/16 20:21:39 # Under source code control: 2003/02/16 20:21:39
@@ -31,13 +30,13 @@
# BUGS # BUGS
# - Uninstalling calc and calc-devel leaves empty dirs /usr/include/calc # - Uninstalling calc and calc-devel leaves empty dirs /usr/include/calc
# and /usr/share/calc and its subdirs. In case e.g. %{_includedir}/calc # and /usr/share/calc and its subdirs. In case e.g. %{_includedir}/calc
# is defined in `%files devel' section, then rpmbuild complains that # is defined in `files devel' section, then rpmbuild complains that
# header files are defined twice - rpmbuild bug or bug in specfile conf??? # header files are defined twice - rpmbuild bug or bug in specfile conf???
Summary: Arbitrary precision calculator. Summary: Arbitrary precision calculator.
Name: calc Name: calc
Version: <<<PROJECT_VERSION>>> Version: <<<PROJECT_VERSION>>>
Release: 10 Release: 12
License: LGPL License: LGPL
Group: Applications/Engineering Group: Applications/Engineering
Source: http://www.isthe.com/chongo/src/calc/%{name}-%{version}.tar.bz2 Source: http://www.isthe.com/chongo/src/calc/%{name}-%{version}.tar.bz2
@@ -46,6 +45,8 @@ Vendor: Landon Noll and Associates
Packager: Landon Noll and Associates (http://www.isthe.com/chongo/index.html) Packager: Landon Noll and Associates (http://www.isthe.com/chongo/index.html)
Requires: ncurses >= 5.5-24, readline >= 5.1-3, less >= 358 Requires: ncurses >= 5.5-24, readline >= 5.1-3, less >= 358
BuildRequires: ncurses-devel >= 5.5-24, readline-devel >= 5.1-3 BuildRequires: ncurses-devel >= 5.5-24, readline-devel >= 5.1-3
Provides: libcalc.so.%{version}()(64bit)
Provides: libcustcalc.so.%{version}()(64bit)
BuildRoot: %{_tmppath}/build-root BuildRoot: %{_tmppath}/build-root
%description %description
@@ -61,7 +62,10 @@ For the latest calc release, see the calc project home page:
%package devel %package devel
Summary: Development files and documentation for calc. Summary: Development files and documentation for calc.
Group: Applications/Engineering Group: Applications/Engineering
Requires: calc = %{version}-%{release} Requires: calc(x86-64) = %{version}-%{release}
Requires: libcalc.so.%{version}()(64bit)
Requires: libcustcalc.so.%{version}()(64bit)
Requires: ncurses >= 5.5-24, readline >= 5.1-3, less >= 358
%description devel %description devel
This package contains the header files and static libraries for developing This package contains the header files and static libraries for developing
@@ -76,42 +80,67 @@ For the latest calc release, see the project home page:
%build %build
echo '-=- calc.spec beginning make clobber -=-' echo '-=- calc.spec beginning make clobber -=-'
make %{?_smp_mflags} T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ clobber make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ clobber
echo '-=- calc.spec ending make clobber -=-' echo '-=- calc.spec ending make clobber -=-'
echo '-=- calc.spec beginning make calc-static-only -=-' echo '-=- calc.spec beginning make calc-static-only -=-'
make %{?_smp_mflags} T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ calc-static-only BLD_TYPE=calc-static-only make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ calc-static-only BLD_TYPE=calc-static-only
echo '-=- calc.spec ending make calc-static-only -=-' echo '-=- calc.spec ending make calc-static-only -=-'
echo '-=- calc.spec beginning make rpm-hide-static -=-' echo '-=- calc.spec beginning make rpm-hide-static -=-'
make %{?_smp_mflags} T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ rpm-hide-static make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ rpm-hide-static
echo '-=- calc.spec ending make rpm-hide-static -=-' echo '-=- calc.spec ending make rpm-hide-static -=-'
echo '-=- calc.spec beginning make clobber (again) -=-' echo '-=- calc.spec beginning make clobber (again) -=-'
make %{?_smp_mflags} T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ clobber make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ clobber
echo '-=- calc.spec ending make clobber (again) -=-' echo '-=- calc.spec ending make clobber (again) -=-'
echo '-=- calc.spec beginning make calc-dynamic-only -=-' echo '-=- calc.spec beginning make calc-dynamic-only -=-'
make %{?_smp_mflags} T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ calc-dynamic-only BLD_TYPE=calc-dynamic-only LD_SHARE= make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ calc-dynamic-only \
BLD_TYPE=calc-dynamic-only LD_SHARE=
echo '-=- calc.spec ending make calc-dynamic-only -=-' echo '-=- calc.spec ending make calc-dynamic-only -=-'
echo '-=- calc.spec beginning make chk -=-' echo '-=- calc.spec beginning make chk -=-'
make %{?_smp_mflags} T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ chk make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ chk
echo '-=- calc.spec ending make chk -=-' echo '-=- calc.spec ending make chk -=-'
echo '-=- calc.spec beginning make rpm-unhide-static -=-' echo '-=- calc.spec beginning make rpm-unhide-static -=-'
make %{?_smp_mflags} T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ rpm-unhide-static make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ rpm-unhide-static
echo '-=- calc.spec ending make rpm-unhide-static -=-' echo '-=- calc.spec ending make rpm-unhide-static -=-'
echo '-=- calc.spec beginning make rpm-clean-static -=-' echo '-=- calc.spec beginning make rpm-clean-static -=-'
make %{?_smp_mflags} T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ rpm-clean-static make -j1 BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ rpm-clean-static
echo '-=- calc.spec ending make rpm-clean-static -=-' echo '-=- calc.spec ending make rpm-clean-static -=-'
echo '-=- calc.spec beginning make rpm-chk-static -=-' echo '-=- calc.spec beginning make rpm-chk-static -=-'
make %{?_smp_mflags} T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ rpm-chk-static make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ rpm-chk-static
echo '-=- calc.spec ending make rpm-chk-static -=-' echo '-=- calc.spec ending make rpm-chk-static -=-'
%install %install
echo '-=- calc.spec beginning make install -=-' echo '-=- calc.spec beginning make install -=-'
rm -rf %{_buildroot}
mkdir -p %{_buildroot} mkdir -p %{_buildroot}
make T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ install make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
MANDIR=%{_mandir}/man1 EXT= V=@ install
echo '-=- calc.spec ending make install -=-' echo '-=- calc.spec ending make install -=-'
%clean %clean
rm -rf %{_buildroot} echo '-=- calc.spec beginning make clean -=-'
rm -rf %{_tmppath}
rm -rf %{_builddir}
rm -rf %{_specdir}
rm -rf %{_buildrootdir}
echo '-=- calc.spec beginning make clean -=-'
%files %files
%defattr(-, root, root) %defattr(-, root, root)
@@ -125,11 +154,11 @@ rm -rf %{_buildroot}
%attr(644, root, root) %{_datadir}/%{name}/custom/*.cal %attr(644, root, root) %{_datadir}/%{name}/custom/*.cal
%attr(644, root, root) %{_datadir}/%{name}/help/* %attr(644, root, root) %{_datadir}/%{name}/help/*
%attr(644, root, root) %{_datadir}/%{name}/*.cal %attr(644, root, root) %{_datadir}/%{name}/*.cal
%attr(644, root, root) %{_datadir}/%{name}/*.line %attr(644, root, root) %{_datadir}/%{name}/set8700.line
%attr(644, root, root) %{_libdir}/libcalc.so %attr(644, root, root) %{_libdir}/libcalc.so
%attr(644, root, root) %{_libdir}/libcalc.so.* %attr(644, root, root) %{_libdir}/libcalc.so.%{version}
%attr(644, root, root) %{_libdir}/libcustcalc.so %attr(644, root, root) %{_libdir}/libcustcalc.so
%attr(644, root, root) %{_libdir}/libcustcalc.so.* %attr(644, root, root) %{_libdir}/libcustcalc.so.%{version}
%files devel %files devel
%defattr(-, root, root) %defattr(-, root, root)
@@ -140,7 +169,27 @@ rm -rf %{_buildroot}
%attr(644, root, root) %{_libdir}/libcustcalc.a %attr(644, root, root) %{_libdir}/libcustcalc.a
%changelog %changelog
* Sat May 05 2013 Landon Curt Noll http://www.isthe.com/chongo * Mon Sep 01 2014 Landon Curt Noll http://www.isthe.com/chongo
- Release: 12
- Removed use of %{?_smp_mflags}. On Ubuntu 14.04, the -j2
was executing make lines within a rule out of order. Always
use -j1 while building these RPMs to avoid this make bug.
This only impacts the speed of building the rpms.
- Stopped removing %{_buildroot} at the beginning of install
as this, acording to a number of sources, was asking for trouble.
- Clean removes tmp, BUILD, SPEC, and BUILDROOT dirs under topdir.
- Fixed the building of the calc-debuginfo rpm.
- Eliminated rpmbuild "bogus date" warnings due to inconsistent weekday,
by assuming the date is correct and changing the weekday via BogusDateBot.
Sun May 20 2006 --> Sun May 14 2006
Sun Sep 01 2007 --> Sun Aug 26 2007
Sat May 05 2013 --> Sat May 04 2013
* Sun Sep 01 2013 Landon Curt Noll http://www.isthe.com/chongo
- Release: 11
- only list %{_datadir}/%{name}/set8700.line not *.line
* Sun May 05 2013 Landon Curt Noll http://www.isthe.com/chongo
- Release: 10 - Release: 10
- Major bug rpm build process bug fix - Major bug rpm build process bug fix
- Source: is a URL as per rpm requirements - Source: is a URL as per rpm requirements
@@ -150,37 +199,46 @@ rm -rf %{_buildroot}
- Fixed use of %{_buildroot} - Fixed use of %{_buildroot}
- Fixed permissions so that rpm build services can modify libraries - Fixed permissions so that rpm build services can modify libraries
- Added missing files to files section - Added missing files to files section
* Mon Mar 25 2013 Landon Curt Noll http://www.isthe.com/chongo * Mon Mar 25 2013 Landon Curt Noll http://www.isthe.com/chongo
- Release: 9 (was 1.1) - Release: 9 (was 1.1)
- Removed deprecated PreReq for calc-devel, using Requires - Removed deprecated PreReq for calc-devel, using Requires
* Sun Sep 01 2007 Landon Curt Noll http://www.isthe.com/chongo
* Sat Sep 01 2007 Landon Curt Noll http://www.isthe.com/chongo
- Release: 8 - Release: 8
- Release of calc-2.12.2 - Release of calc-2.12.2
- Calc builds with shared libraries - Calc builds with shared libraries
* Sun Jun 25 2006 Landon Curt Noll http://www.isthe.com/chongo * Sun Jun 25 2006 Landon Curt Noll http://www.isthe.com/chongo
- Release: 7 - Release: 7
- Changed Copyright to License as per new rpm v4.4 syntax - Changed Copyright to License as per new rpm v4.4 syntax
* Sun May 20 2006 Landon Curt Noll http://www.isthe.com/chongo
* Sat May 20 2006 Landon Curt Noll http://www.isthe.com/chongo
- Release: 6 - Release: 6
- Release of calc-2.12.0 - Release of calc-2.12.0
- Added *.line set files to the list of packaged files - Added *.line set files to the list of packaged files
* Sun Dec 11 2005 Landon Curt Noll http://www.isthe.com/chongo * Sun Dec 11 2005 Landon Curt Noll http://www.isthe.com/chongo
- Release: 5 - Release: 5
- Release of calc-2.11.11 - Release of calc-2.11.11
- Fixed description in spec file - Fixed description in spec file
* Wed Feb 26 2003 Landon Curt Noll http://www.isthe.com/chongo * Wed Feb 26 2003 Landon Curt Noll http://www.isthe.com/chongo
- Release: 4 - Release: 4
- Release of calc-2.11.7-2 - Release of calc-2.11.7-2
- Fixed attributes on include and lib calc-devel files - Fixed attributes on include and lib calc-devel files
- Added BUGS to calc-devel as well as calc - Added BUGS to calc-devel as well as calc
* Tue Feb 25 2003 Landon Curt Noll http://www.isthe.com/chongo * Tue Feb 25 2003 Landon Curt Noll http://www.isthe.com/chongo
- Release: 3 - Release: 3
- Release of calc-2.11.7-1 - Release of calc-2.11.7-1
- Require ncurses, readline and less to install. - Require ncurses, readline and less to install.
- Require ncurses-devel and readline-devel to build. - Require ncurses-devel and readline-devel to build.
* Tue Feb 18 2003 Landon Curt Noll http://www.isthe.com/chongo * Tue Feb 18 2003 Landon Curt Noll http://www.isthe.com/chongo
- Release: 2 - Release: 2
- Misc changes to fit local directory setup - Misc changes to fit local directory setup
* Sun Feb 16 2003 Petteri Kettunen <petterik@users.sourceforge.net> * Sun Feb 16 2003 Petteri Kettunen <petterik@users.sourceforge.net>
- Release: 1 - Release: 1
- initial RPM build - initial RPM build

View File

@@ -17,8 +17,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# @(#) $Revision: 30.1 $ # @(#) $Revision: 30.4 $
# @(#) $Id: calcerr.tbl,v 30.1 2007/03/16 11:09:46 chongo Exp $ # @(#) $Id: calcerr.tbl,v 30.4 2013/09/02 01:38:08 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/calcerr.tbl,v $ # @(#) $Source: /usr/local/src/bin/calc/RCS/calcerr.tbl,v $
# #
# Under source code control: 1996/05/23 17:38:44 # Under source code control: 1996/05/23 17:38:44
@@ -32,6 +32,16 @@
# #
# SYMBOL meaning # SYMBOL meaning
######################################################################
# WARNING: The order of the lines below is critical! If you change #
# the order, you will break code that depends on the return #
# value of the errno() builtin function. #
# #
# If you need to add values to this table, ONLY add then #
# to the bottom of the file! #
######################################################################
E_1OVER0 Division by zero E_1OVER0 Division by zero
E_0OVER0 Indeterminate (0/0) E_0OVER0 Indeterminate (0/0)
E_ADD Bad arguments for + E_ADD Bad arguments for +
@@ -449,3 +459,19 @@ E_FGETFILE1 Non-file argument for fgetfile
E_FGETFILE2 File argument for fgetfile not open for reading E_FGETFILE2 File argument for fgetfile not open for reading
E_FGETFILE3 Unable to set file position in fgetfile E_FGETFILE3 Unable to set file position in fgetfile
E_ESTR Non-representable type for estr E_ESTR Non-representable type for estr
E_STRCASECMP Non-string argument for strcasecmp
E_STRNCASECMP Bad argument type for strncasecmp
E_ISUPPER Bad argument for isupper
E_ISLOWER Bad argument for islower
E_ISALNUM Bad argument for isalnum
E_ISALPHA Bad argument for isalpha
E_ISASCII Bad argument for isascii
E_ISCNTRL Bad argument for iscntrl
E_ISDIGIT Bad argument for isdigit
E_ISGRAPH Bad argument for isgraph
E_ISPRINT Bad argument for isprint
E_ISPUNCT Bad argument for ispunct
E_ISSPACE Bad argument for isspace
E_ISXDIGIT Bad argument for isxdigit
E_STRTOUPPER Bad argument type for strtoupper
E_STRTOLOWER Bad argument type for strtolower

View File

@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# @(#) $Revision: 30.1 $ # @(#) $Revision: 30.2 $
# @(#) $Id: check.awk,v 30.1 2007/03/16 11:09:46 chongo Exp $ # @(#) $Id: check.awk,v 30.2 2013/08/11 01:08:32 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/check.awk,v $ # @(#) $Source: /usr/local/src/bin/calc/RCS/check.awk,v $
# #
# Under source code control: 1996/05/25 22:07:58 # Under source code control: 1996/05/25 22:07:58
@@ -30,7 +30,7 @@
# #
# This awk script will print 3 lines before and after any non-blank line that # This awk script will print 3 lines before and after any non-blank line that
# does not begin with a number. This allows the 'make debug' rule to remove # does not begin with a number. This allows the 'make debug' rule to remove
# all non-interest lines the the 'make check' regression output while providing # all non-interest lines the 'make check' regression output while providing
# 3 lines of context around unexpected output. # 3 lines of context around unexpected output.
# #
BEGIN { BEGIN {

12
cmath.h
View File

@@ -1,7 +1,7 @@
/* /*
* cmath - data structures for extended precision complex arithmetic * cmath - data structures for extended precision complex arithmetic
* *
* Copyright (C) 1999-2007 David I. Bell * Copyright (C) 1999-2007,2014 David I. Bell
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: cmath.h,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: cmath.h,v 30.3 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/cmath.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/cmath.h,v $
* *
* Under source code control: 1993/07/30 19:42:45 * Under source code control: 1993/07/30 19:42:45
@@ -28,8 +28,8 @@
*/ */
#if !defined(__CMATH_H__) #if !defined(INCLUDE_CMATH_H)
#define __CMATH_H__ #define INCLUDE_CMATH_H
#if defined(CALC_SRC) /* if we are building from the calc source tree */ #if defined(CALC_SRC) /* if we are building from the calc source tree */
@@ -156,4 +156,4 @@ E_FUNC COMPLEX *swap_HALF_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all);
EXTERN COMPLEX _czero_, _cone_, _conei_; EXTERN COMPLEX _czero_, _cone_, _conei_;
#endif /* !__CMATH_H__ */ #endif /* !INCLUDE_CMATH_H */

View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.4 $
* @(#) $Id: codegen.c,v 30.2 2007/07/05 13:30:38 chongo Exp $ * @(#) $Id: codegen.c,v 30.4 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/codegen.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/codegen.c,v $
* *
* Under source code control: 1990/02/15 01:48:13 * Under source code control: 1990/02/15 01:48:13
@@ -453,7 +453,8 @@ getsimplebody(void)
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
S_FUNC void S_FUNC void
getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel) getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel,
LABEL *defaultlabel)
{ {
int oldmode; int oldmode;
@@ -617,7 +618,8 @@ getonevariable(int symtype)
* defaultlabel label for default case * defaultlabel label for default case
*/ */
S_FUNC void S_FUNC void
getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel) getstatement(LABEL *contlabel, LABEL *breaklabel,
LABEL *nextcaselabel, LABEL *defaultlabel)
{ {
LABEL label; LABEL label;
LABEL label1, label2, label3, label4; /* locations for jumps */ LABEL label1, label2, label3, label4; /* locations for jumps */
@@ -1104,7 +1106,8 @@ getobjdeclaration(int symtype)
newindices = (int *) malloc(maxindices * newindices = (int *) malloc(maxindices *
sizeof(int)); sizeof(int));
if (newindices == NULL) { if (newindices == NULL) {
scanerror(T_SEMICOLON, "Out of memory for indices malloc"); scanerror(T_SEMICOLON,
"Out of memory for indices malloc");
(void) tokenmode(oldmode); (void) tokenmode(oldmode);
return; return;
} }
@@ -1117,7 +1120,8 @@ getobjdeclaration(int symtype)
maxindices * sizeof(int)); maxindices * sizeof(int));
if (newindices == NULL) { if (newindices == NULL) {
free(indices); free(indices);
scanerror(T_SEMICOLON, "Out of memory for indices realloc"); scanerror(T_SEMICOLON,
"Out of memory for indices realloc");
(void) tokenmode(oldmode); (void) tokenmode(oldmode);
return; return;
} }
@@ -1129,7 +1133,9 @@ getobjdeclaration(int symtype)
if (indices[i] == index) { if (indices[i] == index) {
if (indices != quickindices) if (indices != quickindices)
free(indices); free(indices);
scanerror(T_SEMICOLON, "Duplicate element name \"%s\"", tokensymbol()); scanerror(T_SEMICOLON,
"Duplicate element name \"%s\"",
tokensymbol());
(void) tokenmode(oldmode); (void) tokenmode(oldmode);
return; return;
} }
@@ -1141,7 +1147,8 @@ getobjdeclaration(int symtype)
if (gettoken() != T_RIGHTBRACE) { if (gettoken() != T_RIGHTBRACE) {
if (indices != quickindices) if (indices != quickindices)
free(indices); free(indices);
scanerror(T_SEMICOLON, "Bad object type definition"); scanerror(T_SEMICOLON,
"Bad object type definition");
(void) tokenmode(oldmode); (void) tokenmode(oldmode);
return; return;
} }
@@ -1415,7 +1422,8 @@ getinitlist(void)
oldmode = tokenmode(TM_DEFAULT); oldmode = tokenmode(TM_DEFAULT);
if (gettoken() != T_LEFTBRACE) { if (gettoken() != T_LEFTBRACE) {
scanerror(T_SEMICOLON, "Missing left brace for initialization list"); scanerror(T_SEMICOLON,
"Missing left brace for initialization list");
(void) tokenmode(oldmode); (void) tokenmode(oldmode);
return -1; return -1;
} }
@@ -1450,7 +1458,7 @@ getinitlist(void)
default: default:
scanerror(T_SEMICOLON, scanerror(T_SEMICOLON,
"Missing right brace for initialization list"); "Missing right brace for initialization list");
(void) tokenmode(oldmode); (void) tokenmode(oldmode);
return -1; return -1;
} }
@@ -2364,11 +2372,13 @@ getfilename(char *name, size_t namelen, BOOL *once)
/* use symbol VALUE string */ /* use symbol VALUE string */
symstr = val.v_str->s_str; symstr = val.v_str->s_str;
if (symstr == NULL) { if (symstr == NULL) {
math_error("string value pointer is NULL!!"); math_error(
"string value pointer is NULL!!");
/*NOTREACHED*/ /*NOTREACHED*/
} }
} else { } else {
math_error("a filename variable must be a string"); math_error(
"a filename variable must be a string");
/*NOTREACHED*/ /*NOTREACHED*/
} }
} else { } else {
@@ -2605,7 +2615,7 @@ definesymbol(char *name, int symtype)
break; break;
case SYM_GLOBAL: case SYM_GLOBAL:
if (symtype == SYM_GLOBAL && conf->redecl_warn) { if (symtype == SYM_GLOBAL && conf->redecl_warn) {
warning("redeclaraion of global \"%s\"", warning("redeclaration of global \"%s\"",
name); name);
return; return;
} }
@@ -2613,7 +2623,7 @@ definesymbol(char *name, int symtype)
case SYM_LOCAL: case SYM_LOCAL:
if (symtype == SYM_LOCAL && conf->redecl_warn) { if (symtype == SYM_LOCAL && conf->redecl_warn) {
warning("redeclaraion of local \"%s\"", warning("redeclaration of local \"%s\"",
name); name);
return; return;
} }
@@ -2637,7 +2647,8 @@ definesymbol(char *name, int symtype)
break; break;
} }
if (conf->dupvar_warn) { if (conf->dupvar_warn) {
warning("both static and parameter \"%s\" defined", name); warning("both static and parameter \"%s\" defined",
name);
} }
} }
if (symtype == SYM_LOCAL) if (symtype == SYM_LOCAL)

View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.3 $
* @(#) $Id: config.c,v 30.2 2007/07/05 13:30:38 chongo Exp $ * @(#) $Id: config.c,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/config.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/config.c,v $
* *
* Under source code control: 1991/07/20 00:21:56 * Under source code control: 1991/07/20 00:21:56
@@ -948,7 +948,8 @@ setconfig(int type, VALUE *vp)
} else if (vp->v_type == V_STR) { } else if (vp->v_type == V_STR) {
temp = lookup_long(truth, vp->v_str->s_str); temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) { if (temp < 0) {
math_error("Illegal truth value for redecl_warn"); math_error("Illegal truth value for "
"redecl_warn");
/*NOTREACHED*/ /*NOTREACHED*/
} }
conf->redecl_warn = (int)temp; conf->redecl_warn = (int)temp;
@@ -962,7 +963,8 @@ setconfig(int type, VALUE *vp)
} else if (vp->v_type == V_STR) { } else if (vp->v_type == V_STR) {
temp = lookup_long(truth, vp->v_str->s_str); temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) { if (temp < 0) {
math_error("Illegal truth value for dupvar_warn"); math_error("Illegal truth value for "
"dupvar_warn");
/*NOTREACHED*/ /*NOTREACHED*/
} }
conf->dupvar_warn = (int)temp; conf->dupvar_warn = (int)temp;
@@ -1153,7 +1155,8 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
vp->v_type = V_STR; vp->v_type = V_STR;
p = lookup_name(modes, cfg->outmode2); p = lookup_name(modes, cfg->outmode2);
if (p == NULL) { if (p == NULL) {
math_error("invalid secondary output mode: %d", cfg->outmode2); math_error("invalid secondary output mode: %d",
cfg->outmode2);
/*NOTREACHED*/ /*NOTREACHED*/
} }
vp->v_str = makenewstring(p); vp->v_str = makenewstring(p);

View File

@@ -1,7 +1,7 @@
/* /*
* config - configuration routines * config - configuration routines
* *
* Copyright (C) 1999-2007 Landon Curt Noll and David I. Bell * Copyright (C) 1999-2007,2014 Landon Curt Noll and David I. Bell
* *
* Primary author: Landon Curt Noll * Primary author: Landon Curt Noll
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.4 $
* @(#) $Id: config.h,v 30.2 2007/09/21 01:27:27 chongo Exp $ * @(#) $Id: config.h,v 30.4 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/config.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/config.h,v $
* *
* Under source code control: 1995/11/01 22:20:17 * Under source code control: 1995/11/01 22:20:17
@@ -31,8 +31,8 @@
*/ */
#if !defined(__CONFIG_H__) #if !defined(INCLUDE_CONFIG_H)
#define __CONFIG_H__ #define INCLUDE_CONFIG_H
#if defined(CALC_SRC) /* if we are building from the calc source tree */ #if defined(CALC_SRC) /* if we are building from the calc source tree */
@@ -226,4 +226,4 @@ E_FUNC void config_print(CONFIG*);
E_FUNC BOOL config_cmp(CONFIG*, CONFIG*); E_FUNC BOOL config_cmp(CONFIG*, CONFIG*);
#endif /* !__CONFIG_H__ */ #endif /* !INCLUDE_CONFIG_H */

View File

@@ -1,4 +1,4 @@
#!/usr/local/src/cmd/calc/calc -q -s -f #!/usr/local/src/bin/calc/calc -q -s -f
/* /*
* 4dsphere - determine if 6 points lie on the surface of a sphere in R^4 * 4dsphere - determine if 6 points lie on the surface of a sphere in R^4
* *
@@ -10,7 +10,7 @@
* ... ... * ... ...
* x5 y5 z5 w5 point 5 in R^4 * x5 y5 z5 w5 point 5 in R^4
* *
* Copyright (C) 2001 Landon Curt Noll * Copyright (C) 2001,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -26,8 +26,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: 4dsphere.calc,v 30.1 2007/03/16 11:12:11 chongo Exp $ * @(#) $Id: 4dsphere.calc,v 30.3 2014/08/24 22:04:32 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/4dsphere.calc,v $ * @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/4dsphere.calc,v $
* *
* Under source code control: 2001/05/03 19:02:03 * Under source code control: 2001/05/03 19:02:03

View File

@@ -1,7 +1,7 @@
# #
# cscript - makefile for calc shell script files # cscript - makefile for calc shell script files
# #
# Copyright (C) 1999-2006 Landon Curt Noll # Copyright (C) 1999-2006,2014 Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# @(#) $Revision: 30.3 $ # @(#) $Revision: 30.9 $
# @(#) $Id: Makefile,v 30.3 2007/09/21 01:27:27 chongo Exp $ # @(#) $Id: Makefile,v 30.9 2014/09/02 07:14:49 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/Makefile,v $
# #
# Under source code control: 1999/11/29 11:10:26 # Under source code control: 1999/11/29 11:10:26
@@ -227,7 +227,7 @@ all: ${TARGETS} .all
README: README.src README: README.src
@${RM} -f $@ @${RM} -f $@
@${SED} -e "s:#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "s:#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
# used by the upper level Makefile to determine if we have done all # used by the upper level Makefile to determine if we have done all
# #
@@ -315,7 +315,8 @@ depend:
if [ X"$$i" != X"/dev/null" ]; then \ if [ X"$$i" != X"/dev/null" ]; then \
echo "$$i: $$i.calc"; \ echo "$$i: $$i.calc"; \
echo ' @$${RM} -f $$@'; \ echo ' @$${RM} -f $$@'; \
echo ' @$${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!$${BINDIR}/calc:" $$?>$$@'; \ echo -n ' @$${SED} -e "1s:^#!/usr/local/src/bin/'; \
echo 'calc/calc:#!$${BINDIR}/calc:" $$?>$$@'; \
echo ' @$${CHMOD} +x $$@'; \ echo ' @$${CHMOD} +x $$@'; \
fi; \ fi; \
done >> makedep.out done >> makedep.out
@@ -323,7 +324,8 @@ depend:
${Q} echo forming new cscript/${MAKE_FILE} ${Q} echo forming new cscript/${MAKE_FILE}
${Q} ${RM} -f ${MAKE_FILE}.bak ${Q} ${RM} -f ${MAKE_FILE}.bak
${Q} ${MV} ${MAKE_FILE} ${MAKE_FILE}.bak ${Q} ${MV} ${MAKE_FILE} ${MAKE_FILE}.bak
${Q} ${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' ${MAKE_FILE}.bak > ${MAKE_FILE} ${Q} ${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' \
${MAKE_FILE}.bak > ${MAKE_FILE}
${Q} echo "" >> ${MAKE_FILE} ${Q} echo "" >> ${MAKE_FILE}
${Q} ${CAT} makedep.out >> ${MAKE_FILE} ${Q} ${CAT} makedep.out >> ${MAKE_FILE}
${Q} ${RM} -f makedep.out ${Q} ${RM} -f makedep.out
@@ -338,9 +340,9 @@ depend:
fi; \ fi; \
${MV} ${MAKE_FILE}.tmp ${MAKE_FILE}; \ ${MV} ${MAKE_FILE}.tmp ${MAKE_FILE}; \
if [ -d RCS ]; then \ if [ -d RCS ]; then \
echo '*****************************************************'; \ echo '******************************************************'; \
echo 'new sample ${MAKE_FILE} formed -- need to check it in'; \ echo 'new cscript ${MAKE_FILE} formed -- need to check it in'; \
echo '*****************************************************'; \ echo '******************************************************'; \
fi; \ fi; \
fi fi
@@ -376,8 +378,8 @@ clobber: clean
# #
install: all install: all
-${Q} if [ ! -d ${T}${BINDIR} ]; then \ -${Q} if [ ! -d ${T}${BINDIR} ]; then \
echo ${MKDIR} ${T}${BINDIR}; \ echo ${MKDIR} -p ${T}${BINDIR}; \
${MKDIR} ${T}${BINDIR}; \ ${MKDIR} -p ${T}${BINDIR}; \
if [ ! -d "${T}${BINDIR}" ]; then \ if [ ! -d "${T}${BINDIR}" ]; then \
echo ${MKDIR} -p "${T}${BINDIR}"; \ echo ${MKDIR} -p "${T}${BINDIR}"; \
${MKDIR} -p "${T}${BINDIR}"; \ ${MKDIR} -p "${T}${BINDIR}"; \
@@ -388,8 +390,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${SCRIPTDIR} ]; then \ -${Q} if [ ! -d ${T}${SCRIPTDIR} ]; then \
echo ${MKDIR} ${T}${SCRIPTDIR}; \ echo ${MKDIR} -p ${T}${SCRIPTDIR}; \
${MKDIR} ${T}${SCRIPTDIR}; \ ${MKDIR} -p ${T}${SCRIPTDIR}; \
if [ ! -d "${T}${SCRIPTDIR}" ]; then \ if [ ! -d "${T}${SCRIPTDIR}" ]; then \
echo ${MKDIR} -p "${T}${SCRIPTDIR}"; \ echo ${MKDIR} -p "${T}${SCRIPTDIR}"; \
${MKDIR} -p "${T}${SCRIPTDIR}"; \ ${MKDIR} -p "${T}${SCRIPTDIR}"; \
@@ -443,33 +445,33 @@ uninstall:
4dsphere: 4dsphere.calc 4dsphere: 4dsphere.calc
@${RM} -f $@ @${RM} -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@ @${CHMOD} +x $@
fproduct: fproduct.calc fproduct: fproduct.calc
@${RM} -f $@ @${RM} -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@ @${CHMOD} +x $@
mersenne: mersenne.calc mersenne: mersenne.calc
@${RM} -f $@ @${RM} -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@ @${CHMOD} +x $@
piforever: piforever.calc piforever: piforever.calc
@${RM} -f $@ @${RM} -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@ @${CHMOD} +x $@
plus: plus.calc plus: plus.calc
@${RM} -f $@ @${RM} -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@ @${CHMOD} +x $@
powerterm: powerterm.calc powerterm: powerterm.calc
@${RM} -f $@ @${RM} -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@ @${CHMOD} +x $@
simple: simple.calc simple: simple.calc
@${RM} -f $@ @${RM} -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@ @${CHMOD} +x $@
square: square.calc square: square.calc
@${RM} -f $@ @${RM} -f $@
@${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!${BINDIR}/calc:" $?>$@ @${SED} -e "1s:^#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
@${CHMOD} +x $@ @${CHMOD} +x $@

View File

@@ -7,7 +7,7 @@ be useful!
Please note that calc shell scripts must start with the line: Please note that calc shell scripts must start with the line:
#!/usr/local/src/cmd/calc/calc -q -f #!/usr/local/src/bin/calc/calc -q -f
The above line MUST start in column 1 of the first line. The first line The above line MUST start in column 1 of the first line. The first line
must also end in -f. The -q is optional, but is recommended to disable must also end in -f. The -q is optional, but is recommended to disable
@@ -18,7 +18,7 @@ Comments must be /* c-like comment */ or start with a double ## symbol.
This is the correct way to form a calc shell script: This is the correct way to form a calc shell script:
#!/usr/local/src/cmd/calc/calc -q -f #!/usr/local/src/bin/calc/calc -q -f
/* a correct comment */ /* a correct comment */
## another correct comment ## another correct comment
@@ -36,27 +36,51 @@ For more informaton about calc command lines, see "help usage".
This next example WRONG: This next example WRONG:
#!/usr/local/src/cmd/calc/calc -q #!/usr/local/src/bin/calc/calc -q
# This is not a calc calc comment because it has only a single # # This is not a calc calc comment because it has only a single #
# You must to start comments with ## or /* # You must to start comments with ## or /*
# is is also wrong because the first line does not end in -f # is is also wrong because the first line does not end in -f
print "This example has invalid comments" print "This example has invalid comments"
##### =-=
If you write something that you think is useful, please send it to:
calc-contrib 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' ]]
For more info, see: For more info, see:
help script help script
help cscript help cscript
#####
If you write something that you think is useful, please join the
low volume calc mailing list calc-tester. Then send your contribution
to the calc-tester mailing list.
To subscribe to the calc-tester mailing list, visit the following URL:
http://www.isthe.com/chongo/tech/comp/calc/calc-tester.html
This is a low volume moderated mailing list.
This mailing list replaces calc-tester at asthe dot com list.
If you need a human to help you with your mailing list subscription,
please send EMail to our special:
calc-tester-maillist-help at asthe dot com
NOTE: Remove spaces and replace 'at' with @, 'dot' with .
address. To be sure we see your EMail asking for help with your
mailing list subscription, please use the following phase in your
EMail Subject line:
calc tester mailing list help
That phrase in your subject line will help ensure your
request will get past our anti-spam filters. You may have
additional words in your subject line.
=-= =-=
4dsphere 4dsphere
@@ -101,7 +125,7 @@ simple
A trivial example of a calc shell script. A trivial example of a calc shell script.
## Copyright (C) 1999 Landon Curt Noll ## Copyright (C) 1999,2014 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -117,8 +141,8 @@ simple
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.5 $
## @(#) $Id: README.src,v 30.1 2007/03/16 11:12:11 chongo Exp $ ## @(#) $Id: README.src,v 30.5 2014/10/12 12:23:43 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/README.src,v $ ## @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/README.src,v $
## ##
## Under source code control: 1999/12/17 10:23:40 ## Under source code control: 1999/12/17 10:23:40

View File

@@ -1,4 +1,4 @@
#!/usr/local/src/cmd/calc/calc -q -s -f #!/usr/local/src/bin/calc/calc -q -s -f
/* /*
* fproduct - write the big Endian product of terms to a file * fproduct - write the big Endian product of terms to a file
* *
@@ -8,7 +8,7 @@
* filename where to write the product, use - for stdout * filename where to write the product, use - for stdout
* term ... terms to multiply * term ... terms to multiply
* *
* Copyright (C) 2001 Landon Curt Noll * Copyright (C) 2001,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -24,8 +24,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: fproduct.calc,v 30.1 2007/03/16 11:12:11 chongo Exp $ * @(#) $Id: fproduct.calc,v 30.3 2014/08/24 22:04:32 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/fproduct.calc,v $ * @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/fproduct.calc,v $
* *
* Under source code control: 2001/04/07 20:13:11 * Under source code control: 2001/04/07 20:13:11

View File

@@ -1,8 +1,8 @@
#!/usr/local/src/cmd/calc/calc -q -s -f #!/usr/local/src/bin/calc/calc -q -s -f
/* /*
* mersenne - print the value of a mersenne number * mersenne - print the value of a mersenne number
* *
* Copyright (C) 1999-2007 Landon Curt Noll * Copyright (C) 1999-2007,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: mersenne.calc,v 30.1 2007/03/16 11:12:11 chongo Exp $ * @(#) $Id: mersenne.calc,v 30.3 2014/08/24 22:04:32 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/mersenne.calc,v $ * @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/mersenne.calc,v $
* *
* Under source code control: 1999/11/30 00:09:01; * Under source code control: 1999/11/30 00:09:01;

View File

@@ -1,8 +1,8 @@
#!/usr/local/src/cmd/calc/calc -q -f #!/usr/local/src/bin/calc/calc -q -f
/* /*
* piforever - print digits of pi forever (or as long as your mem/cpu allow) * piforever - print digits of pi forever (or as long as your mem/cpu allow)
* *
* Copyright (C) 1999-2007 Landon Curt Noll * Copyright (C) 1999-2007,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: piforever.calc,v 30.1 2007/03/16 11:12:11 chongo Exp $ * @(#) $Id: piforever.calc,v 30.3 2014/08/24 22:04:32 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/piforever.calc,v $ * @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/piforever.calc,v $
* *
* Under source code control: 1999/11/30 00:11:36 * Under source code control: 1999/11/30 00:11:36

View File

@@ -1,8 +1,8 @@
#!/usr/local/src/cmd/calc/calc -q -f #!/usr/local/src/bin/calc/calc -q -f
/* /*
* plus - add two or more arguments together * plus - add two or more arguments together
* *
* Copyright (C) 1999-2007 Landon Curt Noll * Copyright (C) 1999-2007,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: plus.calc,v 30.1 2007/03/16 11:12:11 chongo Exp $ * @(#) $Id: plus.calc,v 30.3 2014/08/24 22:04:32 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/plus.calc,v $ * @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/plus.calc,v $
* *
* Under source code control: 1999/11/29 10:22:37 * Under source code control: 1999/11/29 10:22:37

View File

@@ -1,4 +1,4 @@
#!/usr/local/src/cmd/calc/calc -q -s -f #!/usr/local/src/bin/calc/calc -q -s -f
/* /*
* powerterm - print the argument as a sum of powers of integers * powerterm - print the argument as a sum of powers of integers
* *
@@ -8,7 +8,7 @@
* base_limit largest base we will consider (def: 10000) * base_limit largest base we will consider (def: 10000)
* value value to convert into sums of powers of integers * value value to convert into sums of powers of integers
* *
* Copyright (C) 2001 Landon Curt Noll * Copyright (C) 2001,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the powerterm of the version 2.1 of the GNU Lesser General Public License * the powerterm of the version 2.1 of the GNU Lesser General Public License
@@ -24,8 +24,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: powerterm.calc,v 30.1 2007/03/16 11:12:11 chongo Exp $ * @(#) $Id: powerterm.calc,v 30.3 2014/08/24 22:04:32 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/powerterm.calc,v $ * @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/powerterm.calc,v $
* *
* Under source code control: 2001/04/24 23:49:11 * Under source code control: 2001/04/24 23:49:11

View File

@@ -1,8 +1,8 @@
#!/usr/local/src/cmd/calc/calc -q -f #!/usr/local/src/bin/calc/calc -q -f
/* /*
* simple - an example of a simple calc shell script * simple - an example of a simple calc shell script
* *
* Copyright (C) 1999-2007 Landon Curt Noll * Copyright (C) 1999-2007,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: simple.calc,v 30.1 2007/03/16 11:12:11 chongo Exp $ * @(#) $Id: simple.calc,v 30.3 2014/08/24 22:04:32 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/simple.calc,v $ * @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/simple.calc,v $
* *
* Under source code control: 1999/11/29 10:22:37 * Under source code control: 1999/11/29 10:22:37

View File

@@ -1,8 +1,8 @@
#!/usr/local/src/cmd/calc/calc -q -f #!/usr/local/src/bin/calc/calc -q -f
/* /*
* sqaure - print the squares of input values * sqaure - print the squares of input values
* *
* Copyright (C) 2000-2007 Ernest Bowen * Copyright (C) 2000-2007,2014 Ernest Bowen
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: square.calc,v 30.1 2007/03/16 11:12:11 chongo Exp $ * @(#) $Id: square.calc,v 30.3 2014/08/24 22:04:32 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/square.calc,v $ * @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/square.calc,v $
* *
* Under source code control: 2000/12/15 06:52:01 * Under source code control: 2000/12/15 06:52:01

View File

@@ -2,7 +2,7 @@
# #
# custom - makefile for calc custom routines # custom - makefile for calc custom routines
# #
# Copyright (C) 1999-2006 Landon Curt Noll # Copyright (C) 1999-2006,2014 Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# @(#) $Revision: 30.26 $ # @(#) $Revision: 30.39 $
# @(#) $Id: Makefile.head,v 30.26 2013/05/05 13:52:40 chongo Exp $ # @(#) $Id: Makefile.head,v 30.39 2016/01/17 09:02:17 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/custom/RCS/Makefile.head,v $ # @(#) $Source: /usr/local/src/bin/calc/custom/RCS/Makefile.head,v $
# #
# Under source code control: 1997/03/09 02:28:54 # Under source code control: 1997/03/09 02:28:54
@@ -337,20 +337,6 @@ CALC_ENV= CALCPATH=./cal
ALLOW_CUSTOM= -DCUSTOM ALLOW_CUSTOM= -DCUSTOM
#ALLOW_CUSTOM= #ALLOW_CUSTOM=
# The install rule uses:
#
# ${MKDIR} ${MKDIR_ARG}
#
# to create directorties. Normall this amounts to usins mkdir -p dir ...
# Some older systems may not have mkdir -p. If you system does not
# make mkdir -p, then set MKDIR_ARG to empty.
#
# MKDIR_ARG= -p # use mkdir -p when creating paths
# MKDIR_ARG= # use if system does not understand mkdir -p
#
MKDIR_ARG= -p
#MKDIR_ARG=
# Some out of date operating systems require / want an executable to # Some out of date operating systems require / want an executable to
# end with a certain file extension. Some compile systems such as # end with a certain file extension. Some compile systems such as
# Cygwin build calc as calc.exe. The EXT variable is used to denote # Cygwin build calc as calc.exe. The EXT variable is used to denote
@@ -366,18 +352,12 @@ EXT=
# The default calc versions # The default calc versions
# #
VERSION= 2.12.4.8 VERSION= 2.12.5.2
VERS= 2.12.4
VER= 2.12
VE= 2
# Names of shared libraries with versions # Names of shared libraries with versions
# #
LIB_EXT= .so LIB_EXT= .so
LIB_EXT_VERSION= ${LIB_EXT}.${VERSION} LIB_EXT_VERSION= ${LIB_EXT}.${VERSION}
LIB_EXT_VERS= ${LIB_EXT}.${VERS}
LIB_EXT_VER= ${LIB_EXT}.${VER}
LIB_EXT_VE= ${LIB_EXT}.${VE}
# standard tools # standard tools
# #
@@ -473,30 +453,41 @@ LDFLAGS= ${LD_DEBUG} ${ILDFLAGS}
# BLD_TYPE= calc-static-only # BLD_TYPE= calc-static-only
# #
# CC_SHARE are flags given to ${CC} to build .o files suitable for shared libs # CC_SHARE are flags given to ${CC} to build .o files suitable for shared libs
# DEFAULT_LIB_INSTALL_PATH is where calc progs look for calc shared libs # DEFAULT_LIB_INSTALL_PATH is where calc programs look for calc shared libs
# LD_SHARE are common flags given to ${CC} to link with shared libraries # LD_SHARE are common flags given to ${CC} to link with shared libraries
# LIBCALC_SHLIB are flags given to ${CC} to build libcalc shared lib # LIBCALC_SHLIB are flags given to ${CC} to build libcalc shared libraries
# LIBCUSTCALC_SHLIB are flags given to ${CC} to build libcustcalc shared lib # LIBCUSTCALC_SHLIB are flags given to ${CC} to build libcustcalc shared lib
# #
# NOTE: The above 4 values are unused if BLD_TYPE= calc-static-only # NOTE: The above 4 values are unused if BLD_TYPE= calc-static-only
# #
# CC_STATIC are flags given to ${CC} to build .o files suitable for static libs # CC_STATIC are flags given to ${CC} to build .o files suitable for static libs
# LD_STATIC are common flags given to ${CC} to link with static libraries # LD_STATIC are common flags given to ${CC} to link with static libraries
# LIBCALC_STATIC are flags given to ${CC} to build libcalc static lib # LIBCALC_STATIC are flags given to ${CC} to build libcalc static libraries
# LIBCUSTCALC_STATIC are flags given to ${CC} to build libcustcalc static lib # LIBCUSTCALC_STATIC are flags given to ${CC} to build libcustcalc static lib
# #
# NOTE: The above 4 values are unused if BLD_TYPE= calc-dynamic-only # NOTE: The above 4 values are unused if BLD_TYPE= calc-dynamic-only
# #
# CCOPT are flags given to ${CC} for optimization # CCOPT are flags given to ${CC} for optimization
# CCWARN are flags given to ${CC} for warning message control # CCWARN are flags given to ${CC} for warning message control
#
# WNO_IMPLICT, WNO_ERROR_LONG_LONG and WNO_LONG_LONG are given to ${CC}
# when compiling special .o files that may need special compile options
# NOTE: These flags simply turn off certain compiler warnings,
# which is useful only when CCWERR is set to -Werror.
# NOTE: If your compiler does not have these -Wno files, just
# set these variables to nothing as in:
# WNO_IMPLICT=
# WNO_ERROR_LONG_LONG=
# WNO_LONG_LONG=
#
# CCWERR are flags given to ${CC} to make warnings fatal errors # CCWERR are flags given to ${CC} to make warnings fatal errors
# NOTE: CCWERR is only set in development Makefiles and must only be # NOTE: CCWERR is only set in development Makefiles and must only be
# used with ${CC}, not ${LCC}. If you do not want the compiler # used with ${CC}, not ${LCC}. If you do not want the compiler
# to abort on warnings, then leave CCWERR blank. # to abort on warnings, then leave CCWERR blank.
# CCMISC are misc flags given to ${CC} # CCMISC are misc flags given to ${CC}
# #
# LCC how the the C compiler is invoked on locally executed intermediate progs # LCC is how the C compiler is invoked on locally executed intermediate programs
# CC is how the the C compiler is invoked (with an optional Purify) # CC is how the C compiler is invoked (with an optional Purify)
# #
# Specific target overrides or modifications to default values # Specific target overrides or modifications to default values
@@ -535,7 +526,10 @@ LD_STATIC=
LIBCALC_STATIC= LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
# #
CCWARN= -Wall -W -Wno-comment CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= CCMISC=
@@ -545,9 +539,9 @@ CC= ${PURIFY} ${LCC} ${CCWERR}
# #
endif endif
################################# ##############################
# Apple MacOS X / Darwin target # # Apple OS X / Darwin target #
################################# ##############################
ifeq ($(target),Darwin) ifeq ($(target),Darwin)
# #
@@ -556,9 +550,23 @@ BLD_TYPE= calc-dynamic-only
CC_SHARE= -fPIC CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:${LIBDIR}:/usr/local/lib DEFAULT_LIB_INSTALL_PATH= ${PWD}:${LIBDIR}:/usr/local/lib
LD_SHARE= ${DARWIN_ARCH} LD_SHARE= ${DARWIN_ARCH}
LIBCALC_SHLIB= -single_module -undefined dynamic_lookup -dynamiclib #SET_INSTALL_NAME= no
SET_INSTALL_NAME= yes
ifeq ($(SET_INSTALL_NAME),yes)
LIBCALC_SHLIB= -single_module -undefined dynamic_lookup -dynamiclib \
-install_name ${LIBDIR}/libcalc${LIB_EXT_VERSION} ${DARWIN_ARCH}
else
LIBCALC_SHLIB= -single_module -undefined dynamic_lookup -dynamiclib \
${DARWIN_ARCH}
endif
ifdef ALLOW_CUSTOM ifdef ALLOW_CUSTOM
LIBCUSTCALC_SHLIB= -single_module -undefined dynamic_lookup -dynamiclib ifeq ($(SET_INSTALL_NAME),yes)
LIBCUSTCALC_SHLIB= -single_module -undefined dynamic_lookup -dynamiclib \
-install_name ${LIBDIR}/libcustcalc${LIB_EXT_VERSION} ${DARWIN_ARCH}
else
LIBCUSTCALC_SHLIB= -single_module -undefined dynamic_lookup -dynamiclib \
${DARWIN_ARCH}
endif
else else
LIBCUSTCALC_SHLIB= LIBCUSTCALC_SHLIB=
endif endif
@@ -568,28 +576,37 @@ LD_STATIC= ${DARWIN_ARCH}
LIBCALC_STATIC= LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
# #
CCWARN= -Wall -W -Wno-comment CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= ${DARWIN_ARCH} CCMISC= ${DARWIN_ARCH}
# #
LCC= MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} gcc LCC= clang
CC= ${PURIFY} ${LCC} ${CCWERR} CC= ${PURIFY} ${LCC} ${CCWERR}
# #
# Darmin dynamic shared lib filenames # Darwin dynamic shared lib filenames
LIB_EXT:= .dylib LIB_EXT:= .dylib
LIB_EXT_VERSION:= .${VERSION}${LIB_EXT} LIB_EXT_VERSION:= .${VERSION}${LIB_EXT}
LIB_EXT_VERS:= .${VERS}${LIB_EXT}
LIB_EXT_VER:= .${VER}${LIB_EXT}
LIB_EXT_VE:= .${VE}${LIB_EXT}
# LDCONFIG not required on this platform, so we redefine it to an empty string # LDCONFIG not required on this platform, so we redefine it to an empty string
LDCONFIG:= LDCONFIG:=
# DARWIN_ARCH= -arch i386 -arch ppc # Universal binary # DARWIN_ARCH= -arch i386 -arch ppc # Universal binary
# DARWIN_ARCH= -arch i386 # Intel binary # DARWIN_ARCH= -arch i386 # Intel binary
# DARWIN_ARCH= -arch ppc # PPC binary # DARWIN_ARCH= -arch ppc # PPC binary
# DARWIN_ARCH= -arch x86_64 # native 64-bit binary
DARWIN_ARCH= # native binary DARWIN_ARCH= # native binary
MACOSX_DEPLOYMENT_TARGET=10.8
# #
# Starting with El Capitan OS X 10.11, root by default could not
# mkdir under system locations, so we now use the /opt/calc tree.
#
OPTDIR:= /opt/calc
BINDIR:= /${OPTDIR}/bin
LIBDIR:= /${OPTDIR}/lib
CALC_SHAREDIR:= /${OPTDIR}/share
CALC_INCDIR:= /${OPTDIR}/include
SCRIPTDIR:= ${BINDIR}/cscript
endif endif
################## ##################
@@ -622,7 +639,10 @@ LD_STATIC=
LIBCALC_STATIC= LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
# #
CCWARN= -Wall -W -Wno-comment CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= CCMISC=
@@ -665,6 +685,9 @@ LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
# #
CCWARN= -Wall CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= CCMISC=
@@ -680,7 +703,6 @@ endif
# SunOS target # # SunOS target #
################ ################
# XXX - this needs to be tested
ifeq ($(target),SunOS) ifeq ($(target),SunOS)
# #
BLD_TYPE= calc-dynamic-only BLD_TYPE= calc-dynamic-only
@@ -701,7 +723,10 @@ LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
LD_STATIC= LD_STATIC=
# #
CCWARN= -Wall -W -Wno-comment CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= CCMISC=
@@ -735,7 +760,10 @@ LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
LD_STATIC= LD_STATIC=
# #
CCWARN= -Wall -W -Wno-comment CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= CCMISC=
@@ -769,7 +797,10 @@ LD_STATIC=
LIBCALC_STATIC= LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
# #
CCWARN= -Wall -W -Wno-comment CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= CCMISC=
@@ -779,10 +810,10 @@ CC= ${PURIFY} ${LCC} ${CCWERR}
# #
# The simple makefile forces the use of static ${CC} flags # The simple makefile forces the use of static ${CC} flags
# #
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc # ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs # CFLAGS are given to ${CC} for calc programs other than intermediate programs
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc # ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs # LDFLAGS for ${CC} in linking calc programs other than intermediate programs
# #
ICFLAGS= ${COMMON_CFLAGS} ${CC_STATIC} ICFLAGS= ${COMMON_CFLAGS} ${CC_STATIC}
CFLAGS= ${ICFLAGS} ${CCOPT} CFLAGS= ${ICFLAGS} ${CCOPT}
@@ -829,7 +860,10 @@ LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
LD_STATIC= LD_STATIC=
# #
CCWARN= -Wall -W -Wno-comment CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= -DNOTCYGWIN CCMISC= -DNOTCYGWIN
@@ -866,7 +900,10 @@ LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
LD_STATIC= LD_STATIC=
# #
CCWARN= -Wall -W -Wno-comment CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= CCMISC=
@@ -882,8 +919,8 @@ endif
# Required flags to compile C files for calc # Required flags to compile C files for calc
# #
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc # ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs # CFLAGS are given to ${CC} for calc programs other than intermediate programs
# #
# NOTE: This does not work for: make-XYZ-only and BLD_TYPE != make-XYZ-only # NOTE: This does not work for: make-XYZ-only and BLD_TYPE != make-XYZ-only
# #
@@ -896,8 +933,8 @@ CFLAGS= ${ICFLAGS} ${CCOPT}
# Required flags to link files for calc # Required flags to link files for calc
# #
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc # ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs # LDFLAGS for ${CC} in linking calc programs other than intermediate programs
# #
ILDFLAGS= ${COMMON_LDFLAGS} ILDFLAGS= ${COMMON_LDFLAGS}
LDFLAGS= ${LD_DEBUG} ${ILDFLAGS} LDFLAGS= ${LD_DEBUG} ${ILDFLAGS}
@@ -1086,8 +1123,8 @@ depend:
fi fi
${Q} echo forming custom/skel ${Q} echo forming custom/skel
${Q} ${RM} -rf skel ${Q} ${RM} -rf skel
${Q} ${MKDIR} skel ${Q} ${MKDIR} -p skel
${Q} ${MKDIR} skel/custom ${Q} ${MKDIR} -p skel/custom
-${Q} for i in ${C_SRC} /dev/null; do \ -${Q} for i in ${C_SRC} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \ if [ X"$$i" != X"/dev/null" ]; then \
${SED} -n '/^#[ ]*include[ ]*"/p' \ ${SED} -n '/^#[ ]*include[ ]*"/p' \
@@ -1136,7 +1173,8 @@ depend:
${Q} echo forming new custom/${MAKE_FILE} ${Q} echo forming new custom/${MAKE_FILE}
${Q} ${RM} -f ${MAKE_FILE}.bak ${Q} ${RM} -f ${MAKE_FILE}.bak
${Q} ${MV} ${MAKE_FILE} ${MAKE_FILE}.bak ${Q} ${MV} ${MAKE_FILE} ${MAKE_FILE}.bak
${Q} ${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' ${MAKE_FILE}.bak > ${MAKE_FILE} ${Q} ${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' \
${MAKE_FILE}.bak > ${MAKE_FILE}
${Q} ${GREP} -v '^#' skel/custom/makedep.out >> ${MAKE_FILE} ${Q} ${GREP} -v '^#' skel/custom/makedep.out >> ${MAKE_FILE}
${Q} ${RM} -rf skel ${Q} ${RM} -rf skel
-${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \ -${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \
@@ -1197,11 +1235,10 @@ clobber: clean
${RM} -f ${BLD_TYPE} ${RM} -f ${BLD_TYPE}
${RM} -f .all ${MAKE_FILE}.tmp ${MAKE_FILE}.bak ${RM} -f .all ${MAKE_FILE}.tmp ${MAKE_FILE}.bak
${RM} -f libcustcalc${LIB_EXT_VERSION} ${RM} -f libcustcalc${LIB_EXT_VERSION}
${RM} -f libcustcalc${LIB_EXT_VERS}
${RM} -f libcustcalc${LIB_EXT_VER}
${RM} -f libcustcalc${LIB_EXT_VE}
${RM} -f libcustcalc${LIB_EXT} ${RM} -f libcustcalc${LIB_EXT}
${RM} -f libcustcalc.*.dylib
${RM} -f libcustcalc.a ${RM} -f libcustcalc.a
${V} echo remove files that are obsolete
#if 0 /* start of skip for non-Gnu makefiles */ #if 0 /* start of skip for non-Gnu makefiles */
${RM} -f Makefile.simple ${RM} -f Makefile.simple
#endif /* end of skip for non-Gnu makefiles */ #endif /* end of skip for non-Gnu makefiles */
@@ -1211,9 +1248,21 @@ clobber: clean
# NOTE: Keep the uninstall rule in reverse order to the install rule # NOTE: Keep the uninstall rule in reverse order to the install rule
# #
install: all install: all
-${Q} if [ ! -d ${T}${LIBDIR} ]; then \
echo ${MKDIR} -p ${T}${LIBDIR}; \
${MKDIR} -p ${T}${LIBDIR}; \
if [ ! -d "${T}${LIBDIR}" ]; then \
echo ${MKDIR} -p "${T}${LIBDIR}"; \
${MKDIR} -p "${T}${LIBDIR}"; \
fi; \
echo ${CHMOD} 0755 ${T}${LIBDIR}; \
${CHMOD} 0755 ${T}${LIBDIR}; \
else \
${TRUE}; \
fi
-${Q} if [ ! -d ${T}${INCDIR} ]; then \ -${Q} if [ ! -d ${T}${INCDIR} ]; then \
echo ${MKDIR} ${T}${INCDIR}; \ echo ${MKDIR} -p ${T}${INCDIR}; \
${MKDIR} ${T}${INCDIR}; \ ${MKDIR} -p ${T}${INCDIR}; \
if [ ! -d "${T}${INCDIR}" ]; then \ if [ ! -d "${T}${INCDIR}" ]; then \
echo ${MKDIR} -p "${T}${INCDIR}"; \ echo ${MKDIR} -p "${T}${INCDIR}"; \
${MKDIR} -p "${T}${INCDIR}"; \ ${MKDIR} -p "${T}${INCDIR}"; \
@@ -1224,8 +1273,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \ -${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \
echo ${MKDIR} ${T}${CALC_SHAREDIR}; \ echo ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
${MKDIR} ${T}${CALC_SHAREDIR}; \ ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \ if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \
echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
@@ -1236,8 +1285,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CALC_INCDIR} ]; then \ -${Q} if [ ! -d ${T}${CALC_INCDIR} ]; then \
echo ${MKDIR} ${T}${CALC_INCDIR}; \ echo ${MKDIR} -p ${T}${CALC_INCDIR}; \
${MKDIR} ${T}${CALC_INCDIR}; \ ${MKDIR} -p ${T}${CALC_INCDIR}; \
if [ ! -d "${T}${CALC_INCDIR}" ]; then \ if [ ! -d "${T}${CALC_INCDIR}" ]; then \
echo ${MKDIR} -p "${T}${CALC_INCDIR}"; \ echo ${MKDIR} -p "${T}${CALC_INCDIR}"; \
${MKDIR} -p "${T}${CALC_INCDIR}"; \ ${MKDIR} -p "${T}${CALC_INCDIR}"; \
@@ -1248,8 +1297,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${HELPDIR} ]; then \ -${Q} if [ ! -d ${T}${HELPDIR} ]; then \
echo ${MKDIR} ${T}${HELPDIR}; \ echo ${MKDIR} -p ${T}${HELPDIR}; \
${MKDIR} ${T}${HELPDIR}; \ ${MKDIR} -p ${T}${HELPDIR}; \
if [ ! -d "${T}${HELPDIR}" ]; then \ if [ ! -d "${T}${HELPDIR}" ]; then \
echo ${MKDIR} -p "${T}${HELPDIR}"; \ echo ${MKDIR} -p "${T}${HELPDIR}"; \
${MKDIR} -p "${T}${HELPDIR}"; \ ${MKDIR} -p "${T}${HELPDIR}"; \
@@ -1260,8 +1309,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CUSTOMCALDIR} ]; then \ -${Q} if [ ! -d ${T}${CUSTOMCALDIR} ]; then \
echo ${MKDIR} ${T}${CUSTOMCALDIR}; \ echo ${MKDIR} -p ${T}${CUSTOMCALDIR}; \
${MKDIR} ${T}${CUSTOMCALDIR}; \ ${MKDIR} -p ${T}${CUSTOMCALDIR}; \
if [ ! -d "${T}${CUSTOMCALDIR}" ]; then \ if [ ! -d "${T}${CUSTOMCALDIR}" ]; then \
echo ${MKDIR} -p "${T}${CUSTOMCALDIR}"; \ echo ${MKDIR} -p "${T}${CUSTOMCALDIR}"; \
${MKDIR} -p "${T}${CUSTOMCALDIR}"; \ ${MKDIR} -p "${T}${CUSTOMCALDIR}"; \
@@ -1272,8 +1321,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CUSTOMHELPDIR} ]; then \ -${Q} if [ ! -d ${T}${CUSTOMHELPDIR} ]; then \
echo ${MKDIR} ${T}${CUSTOMHELPDIR}; \ echo ${MKDIR} -p ${T}${CUSTOMHELPDIR}; \
${MKDIR} ${T}${CUSTOMHELPDIR}; \ ${MKDIR} -p ${T}${CUSTOMHELPDIR}; \
if [ ! -d "${T}${CUSTOMHELPDIR}" ]; then \ if [ ! -d "${T}${CUSTOMHELPDIR}" ]; then \
echo ${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \ echo ${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \
${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \ ${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \
@@ -1284,8 +1333,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CUSTOMINCDIR} ]; then \ -${Q} if [ ! -d ${T}${CUSTOMINCDIR} ]; then \
echo ${MKDIR} ${T}${CUSTOMINCDIR}; \ echo ${MKDIR} -p ${T}${CUSTOMINCDIR}; \
${MKDIR} ${T}${CUSTOMINCDIR}; \ ${MKDIR} -p ${T}${CUSTOMINCDIR}; \
if [ ! -d "${T}${CUSTOMINCDIR}" ]; then \ if [ ! -d "${T}${CUSTOMINCDIR}" ]; then \
echo ${MKDIR} -p "${T}${CUSTOMINCDIR}"; \ echo ${MKDIR} -p "${T}${CUSTOMINCDIR}"; \
${MKDIR} -p "${T}${CUSTOMINCDIR}"; \ ${MKDIR} -p "${T}${CUSTOMINCDIR}"; \
@@ -1333,7 +1382,8 @@ install: all
${RM} -f ${T}${CUSTOMHELPDIR}/$$i.new; \ ${RM} -f ${T}${CUSTOMHELPDIR}/$$i.new; \
${CP} -f $$i ${T}${CUSTOMHELPDIR}/$$i.new; \ ${CP} -f $$i ${T}${CUSTOMHELPDIR}/$$i.new; \
${CHMOD} 0444 ${T}${CUSTOMHELPDIR}/$$i.new; \ ${CHMOD} 0444 ${T}${CUSTOMHELPDIR}/$$i.new; \
${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new ${T}${CUSTOMHELPDIR}/$$i; \ ${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new \
${T}${CUSTOMHELPDIR}/$$i; \
echo "installed ${T}${CUSTOMHELPDIR}/$$i"; \ echo "installed ${T}${CUSTOMHELPDIR}/$$i"; \
fi; \ fi; \
done done

View File

@@ -2,7 +2,7 @@
# #
# custom - makefile for calc custom routines # custom - makefile for calc custom routines
# #
# Copyright (C) 1999-2006 Landon Curt Noll # Copyright (C) 1999-2006,2014 Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# @(#) $Revision: 30.26 $ # @(#) $Revision: 30.39 $
# @(#) $Id: Makefile.head,v 30.26 2013/05/05 13:52:40 chongo Exp $ # @(#) $Id: Makefile.head,v 30.39 2016/01/17 09:02:17 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/custom/RCS/Makefile.head,v $ # @(#) $Source: /usr/local/src/bin/calc/custom/RCS/Makefile.head,v $
# #
# Under source code control: 1997/03/09 02:28:54 # Under source code control: 1997/03/09 02:28:54
@@ -337,20 +337,6 @@ CALC_ENV= CALCPATH=./cal
ALLOW_CUSTOM= -DCUSTOM ALLOW_CUSTOM= -DCUSTOM
#ALLOW_CUSTOM= #ALLOW_CUSTOM=
# The install rule uses:
#
# ${MKDIR} ${MKDIR_ARG}
#
# to create directorties. Normall this amounts to usins mkdir -p dir ...
# Some older systems may not have mkdir -p. If you system does not
# make mkdir -p, then set MKDIR_ARG to empty.
#
# MKDIR_ARG= -p # use mkdir -p when creating paths
# MKDIR_ARG= # use if system does not understand mkdir -p
#
MKDIR_ARG= -p
#MKDIR_ARG=
# Some out of date operating systems require / want an executable to # Some out of date operating systems require / want an executable to
# end with a certain file extension. Some compile systems such as # end with a certain file extension. Some compile systems such as
# Cygwin build calc as calc.exe. The EXT variable is used to denote # Cygwin build calc as calc.exe. The EXT variable is used to denote
@@ -366,18 +352,12 @@ EXT=
# The default calc versions # The default calc versions
# #
VERSION= 2.12.4.8 VERSION= 2.12.5.2
VERS= 2.12.4
VER= 2.12
VE= 2
# Names of shared libraries with versions # Names of shared libraries with versions
# #
LIB_EXT= .so LIB_EXT= .so
LIB_EXT_VERSION= ${LIB_EXT}.${VERSION} LIB_EXT_VERSION= ${LIB_EXT}.${VERSION}
LIB_EXT_VERS= ${LIB_EXT}.${VERS}
LIB_EXT_VER= ${LIB_EXT}.${VER}
LIB_EXT_VE= ${LIB_EXT}.${VE}
# standard tools # standard tools
# #

View File

@@ -2,7 +2,7 @@
# #
# custom - makefile for calc custom routines # custom - makefile for calc custom routines
# #
# Copyright (C) 1999-2006 Landon Curt Noll # Copyright (C) 1999-2006,2014 Landon Curt Noll
# #
# Calc is open software; you can redistribute it and/or modify it under # Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License # the terms of the version 2.1 of the GNU Lesser General Public License
@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# @(#) $Revision: 30.26 $ # @(#) $Revision: 30.39 $
# @(#) $Id: Makefile.head,v 30.26 2013/05/05 13:52:40 chongo Exp $ # @(#) $Id: Makefile.head,v 30.39 2016/01/17 09:02:17 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/custom/RCS/Makefile.head,v $ # @(#) $Source: /usr/local/src/bin/calc/custom/RCS/Makefile.head,v $
# #
# Under source code control: 1997/03/09 02:28:54 # Under source code control: 1997/03/09 02:28:54
@@ -322,20 +322,6 @@ CALC_ENV= CALCPATH=./cal
ALLOW_CUSTOM= -DCUSTOM ALLOW_CUSTOM= -DCUSTOM
#ALLOW_CUSTOM= #ALLOW_CUSTOM=
# The install rule uses:
#
# ${MKDIR} ${MKDIR_ARG}
#
# to create directorties. Normall this amounts to usins mkdir -p dir ...
# Some older systems may not have mkdir -p. If you system does not
# make mkdir -p, then set MKDIR_ARG to empty.
#
# MKDIR_ARG= -p # use mkdir -p when creating paths
# MKDIR_ARG= # use if system does not understand mkdir -p
#
MKDIR_ARG= -p
#MKDIR_ARG=
# Some out of date operating systems require / want an executable to # Some out of date operating systems require / want an executable to
# end with a certain file extension. Some compile systems such as # end with a certain file extension. Some compile systems such as
# Cygwin build calc as calc.exe. The EXT variable is used to denote # Cygwin build calc as calc.exe. The EXT variable is used to denote
@@ -351,18 +337,12 @@ EXT=
# The default calc versions # The default calc versions
# #
VERSION= 2.12.4.8 VERSION= 2.12.5.2
VERS= 2.12.4
VER= 2.12
VE= 2
# Names of shared libraries with versions # Names of shared libraries with versions
# #
LIB_EXT= .so LIB_EXT= .so
LIB_EXT_VERSION= ${LIB_EXT}.${VERSION} LIB_EXT_VERSION= ${LIB_EXT}.${VERSION}
LIB_EXT_VERS= ${LIB_EXT}.${VERS}
LIB_EXT_VER= ${LIB_EXT}.${VER}
LIB_EXT_VE= ${LIB_EXT}.${VE}
# standard tools # standard tools
# #
@@ -433,30 +413,41 @@ COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
# BLD_TYPE= calc-static-only # BLD_TYPE= calc-static-only
# #
# CC_SHARE are flags given to ${CC} to build .o files suitable for shared libs # CC_SHARE are flags given to ${CC} to build .o files suitable for shared libs
# DEFAULT_LIB_INSTALL_PATH is where calc progs look for calc shared libs # DEFAULT_LIB_INSTALL_PATH is where calc programs look for calc shared libs
# LD_SHARE are common flags given to ${CC} to link with shared libraries # LD_SHARE are common flags given to ${CC} to link with shared libraries
# LIBCALC_SHLIB are flags given to ${CC} to build libcalc shared lib # LIBCALC_SHLIB are flags given to ${CC} to build libcalc shared libraries
# LIBCUSTCALC_SHLIB are flags given to ${CC} to build libcustcalc shared lib # LIBCUSTCALC_SHLIB are flags given to ${CC} to build libcustcalc shared lib
# #
# NOTE: The above 4 values are unused if BLD_TYPE= calc-static-only # NOTE: The above 4 values are unused if BLD_TYPE= calc-static-only
# #
# CC_STATIC are flags given to ${CC} to build .o files suitable for static libs # CC_STATIC are flags given to ${CC} to build .o files suitable for static libs
# LD_STATIC are common flags given to ${CC} to link with static libraries # LD_STATIC are common flags given to ${CC} to link with static libraries
# LIBCALC_STATIC are flags given to ${CC} to build libcalc static lib # LIBCALC_STATIC are flags given to ${CC} to build libcalc static libraries
# LIBCUSTCALC_STATIC are flags given to ${CC} to build libcustcalc static lib # LIBCUSTCALC_STATIC are flags given to ${CC} to build libcustcalc static lib
# #
# NOTE: The above 4 values are unused if BLD_TYPE= calc-dynamic-only # NOTE: The above 4 values are unused if BLD_TYPE= calc-dynamic-only
# #
# CCOPT are flags given to ${CC} for optimization # CCOPT are flags given to ${CC} for optimization
# CCWARN are flags given to ${CC} for warning message control # CCWARN are flags given to ${CC} for warning message control
#
# WNO_IMPLICT, WNO_ERROR_LONG_LONG and WNO_LONG_LONG are given to ${CC}
# when compiling special .o files that may need special compile options
# NOTE: These flags simply turn off certain compiler warnings,
# which is useful only when CCWERR is set to -Werror.
# NOTE: If your compiler does not have these -Wno files, just
# set these variables to nothing as in:
# WNO_IMPLICT=
# WNO_ERROR_LONG_LONG=
# WNO_LONG_LONG=
#
# CCWERR are flags given to ${CC} to make warnings fatal errors # CCWERR are flags given to ${CC} to make warnings fatal errors
# NOTE: CCWERR is only set in development Makefiles and must only be # NOTE: CCWERR is only set in development Makefiles and must only be
# used with ${CC}, not ${LCC}. If you do not want the compiler # used with ${CC}, not ${LCC}. If you do not want the compiler
# to abort on warnings, then leave CCWERR blank. # to abort on warnings, then leave CCWERR blank.
# CCMISC are misc flags given to ${CC} # CCMISC are misc flags given to ${CC}
# #
# LCC how the the C compiler is invoked on locally executed intermediate progs # LCC is how the C compiler is invoked on locally executed intermediate programs
# CC is how the the C compiler is invoked (with an optional Purify) # CC is how the C compiler is invoked (with an optional Purify)
# #
# Specific target overrides or modifications to default values # Specific target overrides or modifications to default values
@@ -485,7 +476,10 @@ LD_STATIC=
LIBCALC_STATIC= LIBCALC_STATIC=
LIBCUSTCALC_STATIC= LIBCUSTCALC_STATIC=
# #
CCWARN= -Wall -W -Wno-comment CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR= CCWERR=
CCOPT= ${DEBUG} CCOPT= ${DEBUG}
CCMISC= CCMISC=
@@ -495,10 +489,10 @@ CC= ${PURIFY} ${LCC} ${CCWERR}
# #
# The simple makefile forces the use of static ${CC} flags # The simple makefile forces the use of static ${CC} flags
# #
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc # ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs # CFLAGS are given to ${CC} for calc programs other than intermediate programs
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc # ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs # LDFLAGS for ${CC} in linking calc programs other than intermediate programs
# #
ICFLAGS= ${COMMON_CFLAGS} ${CC_STATIC} ICFLAGS= ${COMMON_CFLAGS} ${CC_STATIC}
CFLAGS= ${ICFLAGS} ${CCOPT} CFLAGS= ${ICFLAGS} ${CCOPT}
@@ -679,8 +673,8 @@ depend:
fi fi
${Q} echo forming custom/skel ${Q} echo forming custom/skel
${Q} ${RM} -rf skel ${Q} ${RM} -rf skel
${Q} ${MKDIR} skel ${Q} ${MKDIR} -p skel
${Q} ${MKDIR} skel/custom ${Q} ${MKDIR} -p skel/custom
-${Q} for i in ${C_SRC} /dev/null; do \ -${Q} for i in ${C_SRC} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \ if [ X"$$i" != X"/dev/null" ]; then \
${SED} -n '/^#[ ]*include[ ]*"/p' \ ${SED} -n '/^#[ ]*include[ ]*"/p' \
@@ -729,7 +723,8 @@ depend:
${Q} echo forming new custom/${MAKE_FILE} ${Q} echo forming new custom/${MAKE_FILE}
${Q} ${RM} -f ${MAKE_FILE}.bak ${Q} ${RM} -f ${MAKE_FILE}.bak
${Q} ${MV} ${MAKE_FILE} ${MAKE_FILE}.bak ${Q} ${MV} ${MAKE_FILE} ${MAKE_FILE}.bak
${Q} ${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' ${MAKE_FILE}.bak > ${MAKE_FILE} ${Q} ${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' \
${MAKE_FILE}.bak > ${MAKE_FILE}
${Q} ${GREP} -v '^#' skel/custom/makedep.out >> ${MAKE_FILE} ${Q} ${GREP} -v '^#' skel/custom/makedep.out >> ${MAKE_FILE}
${Q} ${RM} -rf skel ${Q} ${RM} -rf skel
-${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \ -${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \
@@ -790,20 +785,31 @@ clobber: clean
${RM} -f ${BLD_TYPE} ${RM} -f ${BLD_TYPE}
${RM} -f .all ${MAKE_FILE}.tmp ${MAKE_FILE}.bak ${RM} -f .all ${MAKE_FILE}.tmp ${MAKE_FILE}.bak
${RM} -f libcustcalc${LIB_EXT_VERSION} ${RM} -f libcustcalc${LIB_EXT_VERSION}
${RM} -f libcustcalc${LIB_EXT_VERS}
${RM} -f libcustcalc${LIB_EXT_VER}
${RM} -f libcustcalc${LIB_EXT_VE}
${RM} -f libcustcalc${LIB_EXT} ${RM} -f libcustcalc${LIB_EXT}
${RM} -f libcustcalc.*.dylib
${RM} -f libcustcalc.a ${RM} -f libcustcalc.a
${V} echo remove files that are obsolete
# install everything # install everything
# #
# NOTE: Keep the uninstall rule in reverse order to the install rule # NOTE: Keep the uninstall rule in reverse order to the install rule
# #
install: all install: all
-${Q} if [ ! -d ${T}${LIBDIR} ]; then \
echo ${MKDIR} -p ${T}${LIBDIR}; \
${MKDIR} -p ${T}${LIBDIR}; \
if [ ! -d "${T}${LIBDIR}" ]; then \
echo ${MKDIR} -p "${T}${LIBDIR}"; \
${MKDIR} -p "${T}${LIBDIR}"; \
fi; \
echo ${CHMOD} 0755 ${T}${LIBDIR}; \
${CHMOD} 0755 ${T}${LIBDIR}; \
else \
${TRUE}; \
fi
-${Q} if [ ! -d ${T}${INCDIR} ]; then \ -${Q} if [ ! -d ${T}${INCDIR} ]; then \
echo ${MKDIR} ${T}${INCDIR}; \ echo ${MKDIR} -p ${T}${INCDIR}; \
${MKDIR} ${T}${INCDIR}; \ ${MKDIR} -p ${T}${INCDIR}; \
if [ ! -d "${T}${INCDIR}" ]; then \ if [ ! -d "${T}${INCDIR}" ]; then \
echo ${MKDIR} -p "${T}${INCDIR}"; \ echo ${MKDIR} -p "${T}${INCDIR}"; \
${MKDIR} -p "${T}${INCDIR}"; \ ${MKDIR} -p "${T}${INCDIR}"; \
@@ -814,8 +820,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \ -${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \
echo ${MKDIR} ${T}${CALC_SHAREDIR}; \ echo ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
${MKDIR} ${T}${CALC_SHAREDIR}; \ ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \ if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \
echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
@@ -826,8 +832,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CALC_INCDIR} ]; then \ -${Q} if [ ! -d ${T}${CALC_INCDIR} ]; then \
echo ${MKDIR} ${T}${CALC_INCDIR}; \ echo ${MKDIR} -p ${T}${CALC_INCDIR}; \
${MKDIR} ${T}${CALC_INCDIR}; \ ${MKDIR} -p ${T}${CALC_INCDIR}; \
if [ ! -d "${T}${CALC_INCDIR}" ]; then \ if [ ! -d "${T}${CALC_INCDIR}" ]; then \
echo ${MKDIR} -p "${T}${CALC_INCDIR}"; \ echo ${MKDIR} -p "${T}${CALC_INCDIR}"; \
${MKDIR} -p "${T}${CALC_INCDIR}"; \ ${MKDIR} -p "${T}${CALC_INCDIR}"; \
@@ -838,8 +844,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${HELPDIR} ]; then \ -${Q} if [ ! -d ${T}${HELPDIR} ]; then \
echo ${MKDIR} ${T}${HELPDIR}; \ echo ${MKDIR} -p ${T}${HELPDIR}; \
${MKDIR} ${T}${HELPDIR}; \ ${MKDIR} -p ${T}${HELPDIR}; \
if [ ! -d "${T}${HELPDIR}" ]; then \ if [ ! -d "${T}${HELPDIR}" ]; then \
echo ${MKDIR} -p "${T}${HELPDIR}"; \ echo ${MKDIR} -p "${T}${HELPDIR}"; \
${MKDIR} -p "${T}${HELPDIR}"; \ ${MKDIR} -p "${T}${HELPDIR}"; \
@@ -850,8 +856,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CUSTOMCALDIR} ]; then \ -${Q} if [ ! -d ${T}${CUSTOMCALDIR} ]; then \
echo ${MKDIR} ${T}${CUSTOMCALDIR}; \ echo ${MKDIR} -p ${T}${CUSTOMCALDIR}; \
${MKDIR} ${T}${CUSTOMCALDIR}; \ ${MKDIR} -p ${T}${CUSTOMCALDIR}; \
if [ ! -d "${T}${CUSTOMCALDIR}" ]; then \ if [ ! -d "${T}${CUSTOMCALDIR}" ]; then \
echo ${MKDIR} -p "${T}${CUSTOMCALDIR}"; \ echo ${MKDIR} -p "${T}${CUSTOMCALDIR}"; \
${MKDIR} -p "${T}${CUSTOMCALDIR}"; \ ${MKDIR} -p "${T}${CUSTOMCALDIR}"; \
@@ -862,8 +868,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CUSTOMHELPDIR} ]; then \ -${Q} if [ ! -d ${T}${CUSTOMHELPDIR} ]; then \
echo ${MKDIR} ${T}${CUSTOMHELPDIR}; \ echo ${MKDIR} -p ${T}${CUSTOMHELPDIR}; \
${MKDIR} ${T}${CUSTOMHELPDIR}; \ ${MKDIR} -p ${T}${CUSTOMHELPDIR}; \
if [ ! -d "${T}${CUSTOMHELPDIR}" ]; then \ if [ ! -d "${T}${CUSTOMHELPDIR}" ]; then \
echo ${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \ echo ${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \
${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \ ${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \
@@ -874,8 +880,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CUSTOMINCDIR} ]; then \ -${Q} if [ ! -d ${T}${CUSTOMINCDIR} ]; then \
echo ${MKDIR} ${T}${CUSTOMINCDIR}; \ echo ${MKDIR} -p ${T}${CUSTOMINCDIR}; \
${MKDIR} ${T}${CUSTOMINCDIR}; \ ${MKDIR} -p ${T}${CUSTOMINCDIR}; \
if [ ! -d "${T}${CUSTOMINCDIR}" ]; then \ if [ ! -d "${T}${CUSTOMINCDIR}" ]; then \
echo ${MKDIR} -p "${T}${CUSTOMINCDIR}"; \ echo ${MKDIR} -p "${T}${CUSTOMINCDIR}"; \
${MKDIR} -p "${T}${CUSTOMINCDIR}"; \ ${MKDIR} -p "${T}${CUSTOMINCDIR}"; \
@@ -923,7 +929,8 @@ install: all
${RM} -f ${T}${CUSTOMHELPDIR}/$$i.new; \ ${RM} -f ${T}${CUSTOMHELPDIR}/$$i.new; \
${CP} -f $$i ${T}${CUSTOMHELPDIR}/$$i.new; \ ${CP} -f $$i ${T}${CUSTOMHELPDIR}/$$i.new; \
${CHMOD} 0444 ${T}${CUSTOMHELPDIR}/$$i.new; \ ${CHMOD} 0444 ${T}${CUSTOMHELPDIR}/$$i.new; \
${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new ${T}${CUSTOMHELPDIR}/$$i; \ ${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new \
${T}${CUSTOMHELPDIR}/$$i; \
echo "installed ${T}${CUSTOMHELPDIR}/$$i"; \ echo "installed ${T}${CUSTOMHELPDIR}/$$i"; \
fi; \ fi; \
done done

View File

@@ -177,8 +177,8 @@ depend:
fi fi
${Q} echo forming custom/skel ${Q} echo forming custom/skel
${Q} ${RM} -rf skel ${Q} ${RM} -rf skel
${Q} ${MKDIR} skel ${Q} ${MKDIR} -p skel
${Q} ${MKDIR} skel/custom ${Q} ${MKDIR} -p skel/custom
-${Q} for i in ${C_SRC} /dev/null; do \ -${Q} for i in ${C_SRC} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \ if [ X"$$i" != X"/dev/null" ]; then \
${SED} -n '/^#[ ]*include[ ]*"/p' \ ${SED} -n '/^#[ ]*include[ ]*"/p' \
@@ -227,7 +227,8 @@ depend:
${Q} echo forming new custom/${MAKE_FILE} ${Q} echo forming new custom/${MAKE_FILE}
${Q} ${RM} -f ${MAKE_FILE}.bak ${Q} ${RM} -f ${MAKE_FILE}.bak
${Q} ${MV} ${MAKE_FILE} ${MAKE_FILE}.bak ${Q} ${MV} ${MAKE_FILE} ${MAKE_FILE}.bak
${Q} ${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' ${MAKE_FILE}.bak > ${MAKE_FILE} ${Q} ${SED} -n '1,/^# DO NOT DELETE THIS LINE/p' \
${MAKE_FILE}.bak > ${MAKE_FILE}
${Q} ${GREP} -v '^#' skel/custom/makedep.out >> ${MAKE_FILE} ${Q} ${GREP} -v '^#' skel/custom/makedep.out >> ${MAKE_FILE}
${Q} ${RM} -rf skel ${Q} ${RM} -rf skel
-${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \ -${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \
@@ -288,11 +289,10 @@ clobber: clean
${RM} -f ${BLD_TYPE} ${RM} -f ${BLD_TYPE}
${RM} -f .all ${MAKE_FILE}.tmp ${MAKE_FILE}.bak ${RM} -f .all ${MAKE_FILE}.tmp ${MAKE_FILE}.bak
${RM} -f libcustcalc${LIB_EXT_VERSION} ${RM} -f libcustcalc${LIB_EXT_VERSION}
${RM} -f libcustcalc${LIB_EXT_VERS}
${RM} -f libcustcalc${LIB_EXT_VER}
${RM} -f libcustcalc${LIB_EXT_VE}
${RM} -f libcustcalc${LIB_EXT} ${RM} -f libcustcalc${LIB_EXT}
${RM} -f libcustcalc.*.dylib
${RM} -f libcustcalc.a ${RM} -f libcustcalc.a
${V} echo remove files that are obsolete
#if 0 /* start of skip for non-Gnu makefiles */ #if 0 /* start of skip for non-Gnu makefiles */
${RM} -f Makefile.simple ${RM} -f Makefile.simple
#endif /* end of skip for non-Gnu makefiles */ #endif /* end of skip for non-Gnu makefiles */
@@ -302,9 +302,21 @@ clobber: clean
# NOTE: Keep the uninstall rule in reverse order to the install rule # NOTE: Keep the uninstall rule in reverse order to the install rule
# #
install: all install: all
-${Q} if [ ! -d ${T}${LIBDIR} ]; then \
echo ${MKDIR} -p ${T}${LIBDIR}; \
${MKDIR} -p ${T}${LIBDIR}; \
if [ ! -d "${T}${LIBDIR}" ]; then \
echo ${MKDIR} -p "${T}${LIBDIR}"; \
${MKDIR} -p "${T}${LIBDIR}"; \
fi; \
echo ${CHMOD} 0755 ${T}${LIBDIR}; \
${CHMOD} 0755 ${T}${LIBDIR}; \
else \
${TRUE}; \
fi
-${Q} if [ ! -d ${T}${INCDIR} ]; then \ -${Q} if [ ! -d ${T}${INCDIR} ]; then \
echo ${MKDIR} ${T}${INCDIR}; \ echo ${MKDIR} -p ${T}${INCDIR}; \
${MKDIR} ${T}${INCDIR}; \ ${MKDIR} -p ${T}${INCDIR}; \
if [ ! -d "${T}${INCDIR}" ]; then \ if [ ! -d "${T}${INCDIR}" ]; then \
echo ${MKDIR} -p "${T}${INCDIR}"; \ echo ${MKDIR} -p "${T}${INCDIR}"; \
${MKDIR} -p "${T}${INCDIR}"; \ ${MKDIR} -p "${T}${INCDIR}"; \
@@ -315,8 +327,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \ -${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \
echo ${MKDIR} ${T}${CALC_SHAREDIR}; \ echo ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
${MKDIR} ${T}${CALC_SHAREDIR}; \ ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \ if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \
echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
@@ -327,8 +339,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CALC_INCDIR} ]; then \ -${Q} if [ ! -d ${T}${CALC_INCDIR} ]; then \
echo ${MKDIR} ${T}${CALC_INCDIR}; \ echo ${MKDIR} -p ${T}${CALC_INCDIR}; \
${MKDIR} ${T}${CALC_INCDIR}; \ ${MKDIR} -p ${T}${CALC_INCDIR}; \
if [ ! -d "${T}${CALC_INCDIR}" ]; then \ if [ ! -d "${T}${CALC_INCDIR}" ]; then \
echo ${MKDIR} -p "${T}${CALC_INCDIR}"; \ echo ${MKDIR} -p "${T}${CALC_INCDIR}"; \
${MKDIR} -p "${T}${CALC_INCDIR}"; \ ${MKDIR} -p "${T}${CALC_INCDIR}"; \
@@ -339,8 +351,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${HELPDIR} ]; then \ -${Q} if [ ! -d ${T}${HELPDIR} ]; then \
echo ${MKDIR} ${T}${HELPDIR}; \ echo ${MKDIR} -p ${T}${HELPDIR}; \
${MKDIR} ${T}${HELPDIR}; \ ${MKDIR} -p ${T}${HELPDIR}; \
if [ ! -d "${T}${HELPDIR}" ]; then \ if [ ! -d "${T}${HELPDIR}" ]; then \
echo ${MKDIR} -p "${T}${HELPDIR}"; \ echo ${MKDIR} -p "${T}${HELPDIR}"; \
${MKDIR} -p "${T}${HELPDIR}"; \ ${MKDIR} -p "${T}${HELPDIR}"; \
@@ -351,8 +363,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CUSTOMCALDIR} ]; then \ -${Q} if [ ! -d ${T}${CUSTOMCALDIR} ]; then \
echo ${MKDIR} ${T}${CUSTOMCALDIR}; \ echo ${MKDIR} -p ${T}${CUSTOMCALDIR}; \
${MKDIR} ${T}${CUSTOMCALDIR}; \ ${MKDIR} -p ${T}${CUSTOMCALDIR}; \
if [ ! -d "${T}${CUSTOMCALDIR}" ]; then \ if [ ! -d "${T}${CUSTOMCALDIR}" ]; then \
echo ${MKDIR} -p "${T}${CUSTOMCALDIR}"; \ echo ${MKDIR} -p "${T}${CUSTOMCALDIR}"; \
${MKDIR} -p "${T}${CUSTOMCALDIR}"; \ ${MKDIR} -p "${T}${CUSTOMCALDIR}"; \
@@ -363,8 +375,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CUSTOMHELPDIR} ]; then \ -${Q} if [ ! -d ${T}${CUSTOMHELPDIR} ]; then \
echo ${MKDIR} ${T}${CUSTOMHELPDIR}; \ echo ${MKDIR} -p ${T}${CUSTOMHELPDIR}; \
${MKDIR} ${T}${CUSTOMHELPDIR}; \ ${MKDIR} -p ${T}${CUSTOMHELPDIR}; \
if [ ! -d "${T}${CUSTOMHELPDIR}" ]; then \ if [ ! -d "${T}${CUSTOMHELPDIR}" ]; then \
echo ${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \ echo ${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \
${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \ ${MKDIR} -p "${T}${CUSTOMHELPDIR}"; \
@@ -375,8 +387,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${CUSTOMINCDIR} ]; then \ -${Q} if [ ! -d ${T}${CUSTOMINCDIR} ]; then \
echo ${MKDIR} ${T}${CUSTOMINCDIR}; \ echo ${MKDIR} -p ${T}${CUSTOMINCDIR}; \
${MKDIR} ${T}${CUSTOMINCDIR}; \ ${MKDIR} -p ${T}${CUSTOMINCDIR}; \
if [ ! -d "${T}${CUSTOMINCDIR}" ]; then \ if [ ! -d "${T}${CUSTOMINCDIR}" ]; then \
echo ${MKDIR} -p "${T}${CUSTOMINCDIR}"; \ echo ${MKDIR} -p "${T}${CUSTOMINCDIR}"; \
${MKDIR} -p "${T}${CUSTOMINCDIR}"; \ ${MKDIR} -p "${T}${CUSTOMINCDIR}"; \
@@ -424,7 +436,8 @@ install: all
${RM} -f ${T}${CUSTOMHELPDIR}/$$i.new; \ ${RM} -f ${T}${CUSTOMHELPDIR}/$$i.new; \
${CP} -f $$i ${T}${CUSTOMHELPDIR}/$$i.new; \ ${CP} -f $$i ${T}${CUSTOMHELPDIR}/$$i.new; \
${CHMOD} 0444 ${T}${CUSTOMHELPDIR}/$$i.new; \ ${CHMOD} 0444 ${T}${CUSTOMHELPDIR}/$$i.new; \
${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new ${T}${CUSTOMHELPDIR}/$$i; \ ${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new \
${T}${CUSTOMHELPDIR}/$$i; \
echo "installed ${T}${CUSTOMHELPDIR}/$$i"; \ echo "installed ${T}${CUSTOMHELPDIR}/$$i"; \
fi; \ fi; \
done done

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.4 $
* @(#) $Id: c_sysinfo.c,v 30.2 2007/07/05 19:35:20 chongo Exp $ * @(#) $Id: c_sysinfo.c,v 30.4 2013/09/01 22:16:21 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/custom/RCS/c_sysinfo.c,v $ * @(#) $Source: /usr/local/src/bin/calc/custom/RCS/c_sysinfo.c,v $
* *
* Under source code control: 1997/03/09 23:14:40 * Under source code control: 1997/03/09 23:14:40
@@ -71,93 +71,180 @@ struct infoname {
FULL nmbr; /* if str==NULL ==> value fo #define as a FULL */ FULL nmbr; /* if str==NULL ==> value fo #define as a FULL */
}; };
STATIC struct infoname sys_info[] = { STATIC struct infoname sys_info[] = {
{"S100", "slots in an subtractive 100 table", NULL, (FULL)S100}, {"S100", "slots in an subtractive 100 table", NULL,
{"BASE", "base for calculations", NULL, (FULL)BASE}, (FULL)S100},
{"BASE1", "one less than base", NULL, (FULL)BASE}, {"BASE", "base for calculations", NULL,
{"BASEB", "bits in the calculation base", NULL, (FULL)BASEB}, (FULL)BASE},
{"BASEDIG", "number of digits in base", NULL, (FULL)BASEDIG}, {"BASE1", "one less than base", NULL,
{"BIG_ENDIAN", "Most Significant Byte first symbol", NULL, (FULL)BIG_ENDIAN}, (FULL)BASE},
{"BLK_CHUNKSIZE", "default allocation chunk size for blocks", NULL, (FULL)BLK_CHUNKSIZE}, {"BASEB", "bits in the calculation base", NULL,
{"BLK_DEF_MAXPRINT", "default block octets to print", NULL, (FULL)BLK_DEF_MAXPRINT}, (FULL)BASEB},
{"BLUM_PREGEN", "non-default predefined Blum generators", NULL, (FULL)BLUM_PREGEN}, {"BASEDIG", "number of digits in base", NULL,
{"CALCEXT", "extension for files read in", CALCEXT, (FULL)0}, (FULL)BASEDIG},
{"CALC_BYTE_ORDER", "Byte order (LITTLE_ENDIAN or BIG_ENDIAN)", NULL, (FULL)CALC_BYTE_ORDER}, {"BIG_ENDIAN", "Most Significant Byte first symbol", NULL,
{"CUSTOMHELPDIR", "location of the custom help directory", CUSTOMHELPDIR, (FULL)0}, (FULL)BIG_ENDIAN},
{"DEFAULTCALCBINDINGS", "default key bindings file", DEFAULTCALCBINDINGS, (FULL)0}, {"BLK_CHUNKSIZE", "default allocation chunk size for blocks", NULL,
{"DEFAULTCALCHELP", "help file that -h prints", DEFAULTCALCHELP, (FULL)0}, (FULL)BLK_CHUNKSIZE},
{"DEFAULTCALCPAGER", "default pager", DEFAULTCALCPAGER, (FULL)0}, {"BLK_DEF_MAXPRINT", "default block octets to print", NULL,
{"DEFAULTCALCPATH", "default :-separated search path", DEFAULTCALCPATH, (FULL)0}, (FULL)BLK_DEF_MAXPRINT},
{"DEFAULTCALCRC", "default :-separated startup file list", DEFAULTCALCRC, (FULL)0}, {"BLUM_PREGEN", "non-default predefined Blum generators", NULL,
{"DEFAULTSHELL", "default shell to use", DEFAULTSHELL, (FULL)0}, (FULL)BLUM_PREGEN},
{"DEV_BITS", "device number size in bits", NULL, (FULL)DEV_BITS}, {"CALCEXT", "extension for files read in", CALCEXT,
{"DISPLAY_DEFAULT", "default digits for float display", NULL, (FULL)DISPLAY_DEFAULT}, (FULL)0},
{"EPSILONPREC_DEFAULT", "2^-EPSILON_DEFAULT <= EPSILON_DEFAULT", NULL, (FULL)EPSILONPREC_DEFAULT}, {"CALC_BYTE_ORDER", "Byte order (LITTLE_ENDIAN or BIG_ENDIAN)", NULL,
{"EPSILON_DEFAULT", "allowed error for float calculations", EPSILON_DEFAULT, (FULL)0}, (FULL)CALC_BYTE_ORDER},
{"ERRMAX", "default errmax value", NULL, (FULL)ERRMAX}, {"CUSTOMHELPDIR", "location of the custom help directory", CUSTOMHELPDIR,
{"E_USERDEF", "base of user defined errors", NULL, (FULL)E_USERDEF}, (FULL)0},
{"E__BASE", "calc errors start above here", NULL, (FULL)E__BASE}, {"DEFAULTCALCBINDINGS", "default key bindings file", DEFAULTCALCBINDINGS,
{"E__COUNT", "number of calc errors", NULL, (FULL)E__COUNT}, (FULL)0},
{"E__HIGHEST", "highest calc error", NULL, (FULL)E__HIGHEST}, {"DEFAULTCALCHELP", "help file that -h prints", DEFAULTCALCHELP,
{"FALSE", "boolean false", NULL, (FULL)FALSE}, (FULL)0},
{"FILEPOS_BITS", "file position size in bits", NULL, (FULL)FILEPOS_BITS}, {"DEFAULTCALCPAGER", "default pager", DEFAULTCALCPAGER,
{"FULL_BITS", "bits in a FULL", NULL, (FULL)FULL_BITS}, (FULL)0},
{"HELPDIR", "location of the help directory", HELPDIR, (FULL)0}, {"DEFAULTCALCPATH", "default :-separated search path", DEFAULTCALCPATH,
{"HIST_BINDING_FILE", "Default binding file", HIST_BINDING_FILE, (FULL)0}, (FULL)0},
{"HIST_SIZE", "Default history size", NULL, (FULL)HIST_SIZE}, {"DEFAULTCALCRC", "default :-separated startup file list", DEFAULTCALCRC,
{"INIT_J", "initial 1st walking a55 table index", NULL, (FULL)INIT_J}, (FULL)0},
{"INIT_K", "initial 2nd walking a55 table index", NULL, (FULL)INIT_K}, {"DEFAULTSHELL", "default shell to use", DEFAULTSHELL,
{"INODE_BITS", "inode number size in bits", NULL, (FULL)INODE_BITS}, (FULL)0},
{"LITTLE_ENDIAN", "Least Significant Byte first symbol", NULL, (FULL)LITTLE_ENDIAN}, {"DEV_BITS", "device number size in bits", NULL,
{"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS}, (FULL)DEV_BITS},
{"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT}, {"DISPLAY_DEFAULT", "default digits for float display", NULL,
{"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL, (FULL)MAX_CALCRC}, (FULL)DISPLAY_DEFAULT},
{"MAXCMD", "max length of command invocation", NULL, (FULL)MAXCMD}, {"EPSILONPREC_DEFAULT", "2^-EPSILON_DEFAULT <= EPSILON_DEFAULT", NULL,
{"MAXDIM", "max number of dimensions in matrices", NULL, (FULL)MAXDIM}, (FULL)EPSILONPREC_DEFAULT},
{"MAXERROR", "max length of error message string", NULL, (FULL)MAXERROR}, {"EPSILON_DEFAULT", "allowed error for float calculations",
{"MAXFILES", "max number of opened files", NULL, (FULL)MAXFILES}, EPSILON_DEFAULT, (FULL)0},
{"MAXFULL", "largest SFULL value", NULL, (FULL)MAXFULL}, {"ERRMAX", "default errmax value", NULL,
{"MAXHALF", "largest SHALF value", NULL, (FULL)MAXHALF}, (FULL)ERRMAX},
{"MAXLABELS", "max number of user labels in function", NULL, (FULL)MAXLABELS}, {"E_USERDEF", "base of user defined errors", NULL,
{"MAXLEN", "longest storage size allowed", NULL, (FULL)MAXLEN}, (FULL)E_USERDEF},
{"MAXLONG", "largest long val", NULL, (FULL)MAXLONG}, {"E__BASE", "calc errors start above here", NULL,
{"MAXPRINT_DEFAULT", "default number of elements printed", NULL, (FULL)MAXPRINT_DEFAULT}, (FULL)E__BASE},
{"MAXREDC", "number of entries in REDC cache", NULL, (FULL)MAXREDC}, {"E__COUNT", "number of calc errors", NULL,
{"MAXSCANCOUNT", "default max scan errors before an abort", NULL, (FULL)MAXSCANCOUNT}, (FULL)E__COUNT},
{"MAXSTACK", "max depth of evaluation stack", NULL, (FULL)MAXSTACK}, {"E__HIGHEST", "highest calc error", NULL,
{"MAXSTRING", "max size of string constant", NULL, (FULL)MAXSTRING}, (FULL)E__HIGHEST},
{"MAXUFULL", "largest FULL value", NULL, (FULL)MAXUFULL}, {"FALSE", "boolean false", NULL,
{"MAXULONG", "largest unsigned long val", NULL, (FULL)MAXULONG}, (FULL)FALSE},
{"MAX_MAP_PRIME", "larest prime in pr_map", NULL, (FULL)MAX_MAP_PRIME}, {"FILEPOS_BITS", "file position size in bits", NULL,
{"MAX_MAP_VAL", "larest bit in pr_map", NULL, (FULL)MAX_MAP_VAL}, (FULL)FILEPOS_BITS},
{"MAX_PFACT_VAL", "max x, for which pfact(x) is a long", NULL, (FULL)MAX_PFACT_VAL}, {"FULL_BITS", "bits in a FULL", NULL,
{"MAX_SM_PRIME", "larest 32 bit prime", NULL, (FULL)MAX_SM_PRIME}, (FULL)FULL_BITS},
{"MAX_SM_VAL", "larest 32 bit value", NULL, (FULL)MAX_SM_VAL}, {"HELPDIR", "location of the help directory", HELPDIR,
{"MUL_ALG2", "default size for alternative multiply", NULL, (FULL)MUL_ALG2}, (FULL)0},
{"NXT_MAP_PRIME", "smallest odd prime not in pr_map", NULL, (FULL)NXT_MAP_PRIME}, {"HIST_BINDING_FILE", "Default binding file", HIST_BINDING_FILE,
{"NXT_PFACT_VAL", "next prime for higher pfact values", NULL, (FULL)NXT_PFACT_VAL}, (FULL)0},
{"OFF_T_BITS", "file offset size in bits", NULL, (FULL)OFF_T_BITS}, {"HIST_SIZE", "Default history size", NULL,
{"PIX_32B", "max pix() value", NULL, (FULL)PIX_32B}, (FULL)HIST_SIZE},
{"POW_ALG2", "default size for using REDC for powers", NULL, (FULL)POW_ALG2}, {"INIT_J", "initial 1st walking a55 table index", NULL,
{"REDC_ALG2", "default size using alternative REDC alg", NULL, (FULL)REDC_ALG2}, (FULL)INIT_J},
{"SBITS", "size of additive or shuffle entry in bits", NULL, (FULL)SBITS}, {"INIT_K", "initial 2nd walking a55 table index", NULL,
{"SBYTES", "size of additive or shuffle entry in bytes", NULL, (FULL)SBYTES}, (FULL)INIT_K},
{"SCNT", "length of additive 55 table in FULLs", NULL, (FULL)SCNT}, {"INODE_BITS", "inode number size in bits", NULL,
{"SEEDXORBITS", "low bits of a55 seed devoted to xor", NULL, (FULL)SEEDXORBITS}, (FULL)INODE_BITS},
{"SHALFS", "size of additive or shuffle entry in HALFs", NULL, (FULL)SHALFS}, {"LITTLE_ENDIAN", "Least Significant Byte first symbol",
{"SHUFCNT", "size of shuffle table in entries", NULL, (FULL)SHUFCNT}, NULL, (FULL)LITTLE_ENDIAN},
{"SHUFLEN", "length of shuffle table in FULLs", NULL, (FULL)SHUFLEN}, {"LONG_BITS", "bit length of a long", NULL,
{"SHUFMASK", "mask for shuffle table entry selection", NULL, (FULL)SHUFMASK}, (FULL)LONG_BITS},
{"SHUFPOW", "power of 2 size of the shuffle table", NULL, (FULL)SHUFPOW}, {"MAP_POPCNT", "number of odd primes in pr_map", NULL,
{"SLEN", "number of FULLs in a shuffle table entry", NULL, (FULL)SLEN}, (FULL)MAP_POPCNT},
{"SQ_ALG2", "default size for alternative squaring", NULL, (FULL)SQ_ALG2}, {"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL,
{"SYMBOLSIZE", "max symbol name size", NULL, (FULL)SYMBOLSIZE}, (FULL)MAX_CALCRC},
{"TEN_MAX", "10^(2^TEN_MAX): largest base10 conversion const", NULL, (FULL)TEN_MAX}, {"MAXCMD", "max length of command invocation", NULL,
{"TOPFULL", "highest bit in FULL", NULL, (FULL)TOPFULL}, (FULL)MAXCMD},
{"TOPHALF", "highest bit in a HALF", NULL, (FULL)TOPHALF}, {"MAXDIM", "max number of dimensions in matrices", NULL,
{"TOPLONG", "top long bit", NULL, (FULL)TOPLONG}, (FULL)MAXDIM},
{"TRUE", "boolean true", NULL, (FULL)TRUE}, {"MAXERROR", "max length of error message string", NULL,
{"USUAL_ELEMENTS", "usual number of elements for objects", NULL, (FULL)USUAL_ELEMENTS}, (FULL)MAXERROR},
{"REGNUM_MAX", "highest custom register number", NULL, (FULL)CUSTOM_REG_MAX}, {"MAXFILES", "max number of opened files", NULL,
(FULL)MAXFILES},
{"MAXFULL", "largest SFULL value", NULL,
(FULL)MAXFULL},
{"MAXHALF", "largest SHALF value", NULL,
(FULL)MAXHALF},
{"MAXLABELS", "max number of user labels in function", NULL,
(FULL)MAXLABELS},
{"MAXLEN", "longest storage size allowed", NULL,
(FULL)MAXLEN},
{"MAXLONG", "largest long val", NULL,
(FULL)MAXLONG},
{"MAXPRINT_DEFAULT", "default number of elements printed", NULL,
(FULL)MAXPRINT_DEFAULT},
{"MAXREDC", "number of entries in REDC cache", NULL,
(FULL)MAXREDC},
{"MAXSCANCOUNT", "default max scan errors before an abort", NULL,
(FULL)MAXSCANCOUNT},
{"MAXSTACK", "max depth of evaluation stack", NULL,
(FULL)MAXSTACK},
{"MAXSTRING", "max size of string constant", NULL,
(FULL)MAXSTRING},
{"MAXUFULL", "largest FULL value", NULL,
(FULL)MAXUFULL},
{"MAXULONG", "largest unsigned long val", NULL,
(FULL)MAXULONG},
{"MAX_MAP_PRIME", "larest prime in pr_map", NULL,
(FULL)MAX_MAP_PRIME},
{"MAX_MAP_VAL", "larest bit in pr_map", NULL,
(FULL)MAX_MAP_VAL},
{"MAX_PFACT_VAL", "max x, for which pfact(x) is a long", NULL,
(FULL)MAX_PFACT_VAL},
{"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},
{"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},
{"PIX_32B", "max pix() value", NULL,
(FULL)PIX_32B},
{"POW_ALG2", "default size for using REDC for powers", NULL,
(FULL)POW_ALG2},
{"REDC_ALG2", "default size using alternative REDC alg", NULL,
(FULL)REDC_ALG2},
{"SBITS", "size of additive or shuffle entry in bits", NULL,
(FULL)SBITS},
{"SBYTES", "size of additive or shuffle entry in bytes", NULL,
(FULL)SBYTES},
{"SCNT", "length of additive 55 table in FULLs", NULL,
(FULL)SCNT},
{"SEEDXORBITS", "low bits of a55 seed devoted to xor", NULL,
(FULL)SEEDXORBITS},
{"SHALFS", "size of additive or shuffle entry in HALFs", NULL,
(FULL)SHALFS},
{"SHUFCNT", "size of shuffle table in entries", NULL,
(FULL)SHUFCNT},
{"SHUFLEN", "length of shuffle table in FULLs", NULL,
(FULL)SHUFLEN},
{"SHUFMASK", "mask for shuffle table entry selection", NULL,
(FULL)SHUFMASK},
{"SHUFPOW", "power of 2 size of the shuffle table", NULL,
(FULL)SHUFPOW},
{"SLEN", "number of FULLs in a shuffle table entry", NULL,
(FULL)SLEN},
{"SQ_ALG2", "default size for alternative squaring", NULL,
(FULL)SQ_ALG2},
{"SYMBOLSIZE", "max symbol name size", NULL,
(FULL)SYMBOLSIZE},
{"TEN_MAX", "10^(2^TEN_MAX): largest base10 conversion const", NULL,
(FULL)TEN_MAX},
{"TOPFULL", "highest bit in FULL", NULL,
(FULL)TOPFULL},
{"TOPHALF", "highest bit in a HALF", NULL,
(FULL)TOPHALF},
{"TOPLONG", "top long bit", NULL,
(FULL)TOPLONG},
{"TRUE", "boolean true", NULL,
(FULL)TRUE},
{"USUAL_ELEMENTS", "usual number of elements for objects", NULL,
(FULL)USUAL_ELEMENTS},
{"REGNUM_MAX", "highest custom register number", NULL,
(FULL)CUSTOM_REG_MAX},
/* must be last */ /* must be last */
{NULL, NULL, NULL, (FULL)0} {NULL, NULL, NULL, (FULL)0}

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.2 $
* @(#) $Id: pmodm127.cal,v 30.1 2007/03/16 11:10:04 chongo Exp $ * @(#) $Id: pmodm127.cal,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/custom/RCS/pmodm127.cal,v $ * @(#) $Source: /usr/local/src/bin/calc/custom/RCS/pmodm127.cal,v $
* *
* Under source code control: 2004/02/25 14:25:32 * Under source code control: 2004/02/25 14:25:32
@@ -120,7 +120,8 @@ define pmodm127_test2(testcnt, seed)
/* compare custom function with its pmod() equivalent */ /* compare custom function with its pmod() equivalent */
if (pmod(2, m127, q) != custom("pmodm127", q)) { if (pmod(2, m127, q) != custom("pmodm127", q)) {
print "ERROR: pmodm127 failed for ", str(q); print "ERROR: pmodm127 failed for ", str(q);
print "ERROR: ", pmod(2,m127,q), " != ", custom("pmodm127", q); print "ERROR: ", pmod(2,m127,q), " != ",
custom("pmodm127", q);
return newerror("pmodm127 failed for " + str(q)); return newerror("pmodm127 failed for " + str(q));
} }
} }
@@ -133,5 +134,6 @@ define pmodm127_test2(testcnt, seed)
} }
if ((config("resource_debug") & 3) && !(config("resource_debug") & 8)) { if ((config("resource_debug") & 3) && !(config("resource_debug") & 8)) {
print "DEBUG: use config('resource_debug',", config("resource_debug")|8:") to enable more debugging"; print "DEBUG: use config('resource_debug',",
config("resource_debug")|8 : ") to enable more debugging";
} }

View File

@@ -11,7 +11,7 @@ TYPES
DESCRIPTION DESCRIPTION
This custom function will return the value certain selected #defile This custom function will return the value certain selected #define
values. The infoname arg must be a string that matches the given values. The infoname arg must be a string that matches the given
#define name. For conveience, the case infoname does not matter, #define name. For conveience, the case infoname does not matter,
so "baseb" and "BASEB" refer to the same #define value. so "baseb" and "BASEB" refer to the same #define value.
@@ -69,8 +69,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.2 $
## @(#) $Id: sysinfo,v 30.1 2007/03/16 11:10:04 chongo Exp $ ## @(#) $Id: sysinfo,v 30.2 2013/08/17 01:57:37 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/custom/RCS/sysinfo,v $ ## @(#) $Source: /usr/local/src/bin/calc/custom/RCS/sysinfo,v $
## ##
## Under source code control: 1997/03/09 23:14:40 ## Under source code control: 1997/03/09 23:14:40

15
decl.h
View File

@@ -1,7 +1,7 @@
/* /*
* decl - variable and function declaration macros * decl - variable and function declaration macros
* *
* Copyright (C) 2007 Landon Curt Noll * Copyright (C) 2007,2014 Landon Curt Noll
* *
* Primary author: Landon Curt Noll * Primary author: Landon Curt Noll
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.3 $ * @(#) $Revision: 30.6 $
* @(#) $Id: decl.h,v 30.3 2008/04/15 21:17:57 chongo Exp $ * @(#) $Id: decl.h,v 30.6 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/decl.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/decl.h,v $
* *
* Under source code control: 2007/02/09 05:24:25 * Under source code control: 2007/02/09 05:24:25
@@ -33,8 +33,8 @@
#include "have_const.h" #include "have_const.h"
#if !defined(__DECL_H__) #if !defined(INCLUDE_DECL_H)
#define __DECL_H__ #define INCLUDE_DECL_H
/* /*
@@ -100,9 +100,10 @@
/* Perform printf-style argument type checking for known compilers */ /* Perform printf-style argument type checking for known compilers */
#ifdef __GNUC__ #ifdef __GNUC__
# define PRINTF_FORMAT(fmt_idx, arg_idx) __attribute__ ((format (printf, fmt_idx, arg_idx))) # define PRINTF_FORMAT(fmt_idx, arg_idx) __attribute__ \
((format (printf, fmt_idx, arg_idx)))
#else #else
# define PRINTF_FORMAT(fmt_idx, arg_idx) # define PRINTF_FORMAT(fmt_idx, arg_idx)
#endif #endif
#endif /* !__DECL_H__ */ #endif /* !INCLUDE_DECL_H */

13
file.c
View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.3 $
* @(#) $Id: file.c,v 30.2 2007/07/05 13:30:38 chongo Exp $ * @(#) $Id: file.c,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/file.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/file.c,v $
* *
* Under source code control: 1991/07/20 00:21:56 * Under source code control: 1991/07/20 00:21:56
@@ -367,7 +367,8 @@ openid(char *name, char *mode)
/* /*
* openpathid - open the specified abse filename, or relative filename along a search path * openpathid - open the specified abse filename, or
* relative filename along a search path
* *
* given: * given:
* name file name * name file name
@@ -2026,7 +2027,8 @@ showfiles(void)
* strptr pointer to where the new field pointer may be found * strptr pointer to where the new field pointer may be found
*/ */
S_FUNC void S_FUNC void
getscanfield(FILE *fp, BOOL skip, unsigned int width, int scannum, char *scanptr, char **strptr) getscanfield(FILE *fp, BOOL skip, unsigned int width, int scannum,
char *scanptr, char **strptr)
{ {
char *str; /* current string */ char *str; /* current string */
unsigned long len; /* current length of string */ unsigned long len; /* current length of string */
@@ -2104,7 +2106,8 @@ getscanfield(FILE *fp, BOOL skip, unsigned int width, int scannum, char *scanptr
* strptr pointer to where the new field pointer may be found * strptr pointer to where the new field pointer may be found
*/ */
S_FUNC void S_FUNC void
getscanwhite(FILE *fp, BOOL skip, unsigned int width, int scannum, char **strptr) getscanwhite(FILE *fp, BOOL skip, unsigned int width, int scannum,
char **strptr)
{ {
char *str; /* current string */ char *str; /* current string */
unsigned long len; /* current length of string */ unsigned long len; /* current length of string */

15
file.h
View File

@@ -1,7 +1,7 @@
/* /*
* file - file I/O routines callable by users * file - file I/O routines callable by users
* *
* Copyright (C) 1999-2007 David I. Bell and Landon Curt Noll * Copyright (C) 1999-2007,2014 David I. Bell and Landon Curt Noll
* *
* Primary author: David I. Bell * Primary author: David I. Bell
* *
@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.5 $
* @(#) $Id: file.h,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: file.h,v 30.5 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/file.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/file.h,v $
* *
* Under source code control: 1996/05/24 05:55:58 * Under source code control: 1996/05/24 05:55:58
@@ -31,8 +31,8 @@
*/ */
#if !defined(__FILE_H__) #if !defined(INCLUDE_FILE_H)
#define __FILE_H__ #define INCLUDE_FILE_H
#if defined(CALC_SRC) /* if we are building from the calc source tree */ #if defined(CALC_SRC) /* if we are building from the calc source tree */
@@ -96,7 +96,8 @@ E_FUNC int fgetposid(FILEID id, FILEPOS *ptr);
E_FUNC int fsetposid(FILEID id, FILEPOS *ptr); E_FUNC int fsetposid(FILEID id, FILEPOS *ptr);
E_FUNC int get_open_siz(FILE *fp, ZVALUE *res); E_FUNC int get_open_siz(FILE *fp, ZVALUE *res);
E_FUNC char* findfname(FILEID); E_FUNC char* findfname(FILEID);
E_FUNC FILE *f_pathopen(char *name, char *mode, char *pathlist, char **openpath); E_FUNC FILE *f_pathopen(char *name, char *mode, char *pathlist,
char **openpath);
#endif /* !__FILE_H__ */ #endif /* !INCLUDE_FILE_H */

489
func.c
View File

@@ -19,8 +19,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.3 $ * @(#) $Revision: 30.11 $
* @(#) $Id: func.c,v 30.3 2008/04/15 21:17:57 chongo Exp $ * @(#) $Id: func.c,v 30.11 2014/09/30 00:55:11 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/func.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/func.c,v $
* *
* Under source code control: 1990/02/15 01:48:15 * Under source code control: 1990/02/15 01:48:15
@@ -1241,10 +1241,11 @@ f_primetest(int count, NUMBER **vals)
{ {
/* parse args */ /* parse args */
switch (count) { switch (count) {
case 1: return itoq((long) qprimetest(vals[0], case 1: qlink(&_qone_);
qlink(&_qone_), qlink(&_qone_))); qlink(&_qone_);
case 2: return itoq((long) qprimetest(vals[0], return itoq((long) qprimetest(vals[0], &_qone_, &_qone_));
vals[1], qlink(&_qone_))); case 2: qlink(&_qone_);
return itoq((long) qprimetest(vals[0], vals[1], &_qone_));
default: return itoq((long) qprimetest(vals[0], vals[1], vals[2])); default: return itoq((long) qprimetest(vals[0], vals[1], vals[2]));
} }
} }
@@ -1675,7 +1676,7 @@ f_hash(int count, VALUE **vals)
result.v_type = V_NUM; result.v_type = V_NUM;
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
hash = FNV1_32_BASIS; hash = QUICKHASH_BASIS;
while (count-- > 0) while (count-- > 0)
hash = hashvalue(*vals++, hash); hash = hashvalue(*vals++, hash);
result.v_num = utoq((FULL) hash); result.v_num = utoq((FULL) hash);
@@ -2062,7 +2063,8 @@ f_ln(int count, VALUE **vals)
} }
switch (vals[0]->v_type) { switch (vals[0]->v_type) {
case V_NUM: case V_NUM:
if (!qisneg(vals[0]->v_num) && !qiszero(vals[0]->v_num)) { if (!qisneg(vals[0]->v_num) &&
!qiszero(vals[0]->v_num)) {
result.v_num = qln(vals[0]->v_num, err); result.v_num = qln(vals[0]->v_num, err);
result.v_type = V_NUM; result.v_type = V_NUM;
return result; return result;
@@ -2107,7 +2109,8 @@ f_log(int count, VALUE **vals)
} }
switch (vals[0]->v_type) { switch (vals[0]->v_type) {
case V_NUM: case V_NUM:
if (!qisneg(vals[0]->v_num) && !qiszero(vals[0]->v_num)) { if (!qisneg(vals[0]->v_num) &&
!qiszero(vals[0]->v_num)) {
result.v_num = qlog(vals[0]->v_num, err); result.v_num = qlog(vals[0]->v_num, err);
result.v_type = V_NUM; result.v_type = V_NUM;
return result; return result;
@@ -4175,6 +4178,24 @@ f_strcmp(VALUE *v1, VALUE *v2)
return result; return result;
} }
S_FUNC VALUE
f_strcasecmp(VALUE *v1, VALUE *v2)
{
VALUE result;
FLAG flag;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
if (v1->v_type != V_STR || v2->v_type != V_STR)
return error_value(E_STRCASECMP);
flag = stringcaserel(v1->v_str, v2->v_str);
result.v_type = V_NUM;
result.v_num = itoq((long) flag);
return result;
}
S_FUNC VALUE S_FUNC VALUE
f_strncmp(VALUE *v1, VALUE *v2, VALUE *v3) f_strncmp(VALUE *v1, VALUE *v2, VALUE *v3)
@@ -4207,6 +4228,69 @@ f_strncmp(VALUE *v1, VALUE *v2, VALUE *v3)
result.v_num = itoq((long) flag); result.v_num = itoq((long) flag);
return result; return result;
} }
S_FUNC VALUE
f_strncasecmp(VALUE *v1, VALUE *v2, VALUE *v3)
{
long n1, n2, n;
FLAG flag;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
if (v1->v_type != V_STR || v2->v_type != V_STR ||
v3->v_type != V_NUM || qisneg(v3->v_num) ||
qisfrac(v3->v_num) || zge31b(v3->v_num->num))
return error_value(E_STRNCASECMP);
n1 = v1->v_str->s_len;
n2 = v2->v_str->s_len;
n = qtoi(v3->v_num);
if (n < n1)
v1->v_str->s_len = n;
if (n < n2)
v2->v_str->s_len = n;
flag = stringcaserel(v1->v_str, v2->v_str);
v1->v_str->s_len = n1;
v2->v_str->s_len = n2;
result.v_type = V_NUM;
result.v_num = itoq((long) flag);
return result;
}
S_FUNC VALUE
f_strtoupper(VALUE *vp)
{
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
if (vp->v_type != V_STR)
return error_value(E_STRTOUPPER);
result.v_str = stringtoupper(vp->v_str);
result.v_type = V_STR;
return result;
}
S_FUNC VALUE
f_strtolower(VALUE *vp)
{
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
if (vp->v_type != V_STR)
return error_value(E_STRTOLOWER);
result.v_str = stringtolower(vp->v_str);
result.v_type = V_STR;
return result;
}
S_FUNC VALUE S_FUNC VALUE
@@ -4394,6 +4478,307 @@ f_ord(VALUE *vp)
return result; return result;
} }
S_FUNC VALUE
f_isupper(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISUPPER);
}
result.v_type = V_NUM;
result.v_num = itoq( (isupper( c ))?1l:0l);
return result;
}
S_FUNC VALUE
f_islower(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISLOWER);
}
result.v_type = V_NUM;
result.v_num = itoq( (islower( c ))?1l:0l);
return result;
}
S_FUNC VALUE
f_isalnum(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISALNUM);
}
result.v_type = V_NUM;
result.v_num = itoq( (isalnum( c ))?1l:0l);
return result;
}
S_FUNC VALUE
f_isalpha(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISALPHA);
}
result.v_type = V_NUM;
result.v_num = itoq( (isalpha( c ))?1l:0l);
return result;
}
#if 0
/* Not in C-standard, marked as obsolete in POSIX.1-2008 */
S_FUNC VALUE
f_isascii(VALUE *vp)
{
char c;
VALUE result;
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISASCII);
}
result.v_type = V_NUM;
result.v_num = itoq( (isascii( c ))?1l:0l);
return result;
}
#endif /* 0 */
S_FUNC VALUE
f_iscntrl(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISCNTRL);
}
result.v_type = V_NUM;
result.v_num = itoq( (iscntrl( c ))?1l:0l);
return result;
}
S_FUNC VALUE
f_isdigit(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISDIGIT);
}
result.v_type = V_NUM;
result.v_num = itoq( (isdigit( c ))?1l:0l);
return result;
}
S_FUNC VALUE
f_isgraph(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISGRAPH);
}
result.v_type = V_NUM;
result.v_num = itoq( (isgraph( c ))?1l:0l);
return result;
}
S_FUNC VALUE
f_isprint(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISPRINT);
}
result.v_type = V_NUM;
result.v_num = itoq( (isprint( c ))?1l:0l);
return result;
}
S_FUNC VALUE
f_ispunct(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISPUNCT);
}
result.v_type = V_NUM;
result.v_num = itoq( (ispunct( c ))?1l:0l);
return result;
}
S_FUNC VALUE
f_isspace(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISSPACE);
}
result.v_type = V_NUM;
result.v_num = itoq( (isspace( c ))?1l:0l);
return result;
}
S_FUNC VALUE
f_isxdigit(VALUE *vp)
{
char c;
VALUE result;
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
switch(vp->v_type) {
case V_STR:
c = *vp->v_str->s_str;
break;
case V_OCTET:
c = *vp->v_octet;
break;
default:
return error_value(E_ISXDIGIT);
}
result.v_type = V_NUM;
result.v_num = itoq( (isxdigit( c ))?1l:0l);
return result;
}
S_FUNC VALUE S_FUNC VALUE
f_protect(int count, VALUE **vals) f_protect(int count, VALUE **vals)
@@ -4842,7 +5227,8 @@ f_rsearch(int count, VALUE **vals)
i = listrsearch(v1->v_list, v2, l_start, l_end, &indx); i = listrsearch(v1->v_list, v2, l_start, l_end, &indx);
break; break;
case V_ASSOC: case V_ASSOC:
i = assocrsearch(v1->v_assoc, v2, l_start, l_end, &indx); i = assocrsearch(v1->v_assoc, v2, l_start,
l_end, &indx);
break; break;
case V_STR: case V_STR:
i = stringrsearch(v1->v_str, v2->v_str, l_start, i = stringrsearch(v1->v_str, v2->v_str, l_start,
@@ -7863,6 +8249,10 @@ f_blkcpy(int count, VALUE **vals)
*/ */
args[0] = vals[1]; args[0] = vals[1];
args[1] = vals[0]; args[1] = vals[0];
null_value.v_type = V_NULL;
args[2] = &null_value;
args[3] = &null_value;
args[4] = &null_value;
switch(count) { switch(count) {
case 5: case 5:
args[2] = vals[4]; args[2] = vals[4];
@@ -7873,14 +8263,10 @@ f_blkcpy(int count, VALUE **vals)
count = 5; count = 5;
args[4] = vals[3]; args[4] = vals[3];
args[3] = vals[2]; args[3] = vals[2];
null_value.v_type = V_NULL;
args[2] = &null_value;
break; break;
case 3: case 3:
count = 4; count = 4;
args[3] = vals[2]; args[3] = vals[2];
null_value.v_type = V_NULL;
args[2] = &null_value;
break; break;
} }
@@ -8130,7 +8516,8 @@ STATIC CONST struct builtin builtins[] = {
{"ceil", 1, 1, 0, OP_NOP, 0, f_ceil, {"ceil", 1, 1, 0, OP_NOP, 0, f_ceil,
"smallest integer greater than or equal to number"}, "smallest integer greater than or equal to number"},
{"cfappr", 1, 3, 0, OP_NOP, f_cfappr, 0, {"cfappr", 1, 3, 0, OP_NOP, f_cfappr, 0,
"approximate a within accuracy b using\n\t\t\tcontinued fractions"}, "approximate a within accuracy b using\n"
"\t\t\tcontinued fractions"},
{"cfsim", 1, 2, 0, OP_NOP, f_cfsim, 0, {"cfsim", 1, 2, 0, OP_NOP, f_cfsim, 0,
"simplify number using continued fractions"}, "simplify number using continued fractions"},
{"char", 1, 1, 0, OP_NOP, 0, f_char, {"char", 1, 1, 0, OP_NOP, 0, f_char,
@@ -8230,7 +8617,8 @@ STATIC CONST struct builtin builtins[] = {
{"fgets", 1, 1, 0, OP_NOP, 0, f_fgets, {"fgets", 1, 1, 0, OP_NOP, 0, f_fgets,
"read next line from file, newline is kept"}, "read next line from file, newline is kept"},
{"fgetstr", 1, 1, 0, OP_NOP, 0, f_fgetstr, {"fgetstr", 1, 1, 0, OP_NOP, 0, f_fgetstr,
"read next null-terminated string from file, null\n\t\t\tcharacter is kept"}, "read next null-terminated string from file, null\n"
"\t\t\tcharacter is kept"},
{"files", 0, 1, 0, OP_NOP, 0, f_files, {"files", 0, 1, 0, OP_NOP, 0, f_files,
"return opened file or max number of opened files"}, "return opened file or max number of opened files"},
{"floor", 1, 1, 0, OP_NOP, 0, f_floor, {"floor", 1, 1, 0, OP_NOP, 0, f_floor,
@@ -8238,7 +8626,8 @@ STATIC CONST struct builtin builtins[] = {
{"fopen", 2, 2, 0, OP_NOP, 0, f_fopen, {"fopen", 2, 2, 0, OP_NOP, 0, f_fopen,
"open file name a in mode b"}, "open file name a in mode b"},
{"fpathopen", 2, 3, 0, OP_NOP, 0, f_fpathopen, {"fpathopen", 2, 3, 0, OP_NOP, 0, f_fpathopen,
"open file name a in mode b, search for a along\n\t\t\tCALCPATH or path c"}, "open file name a in mode b, search for a along\n"
"\t\t\tCALCPATH or path c"},
{"fprintf", 2, IN, 0, OP_NOP, 0, f_fprintf, {"fprintf", 2, IN, 0, OP_NOP, 0, f_fprintf,
"print formatted output to opened file"}, "print formatted output to opened file"},
{"fputc", 2, 2, 0, OP_NOP, 0, f_fputc, {"fputc", 2, 2, 0, OP_NOP, 0, f_fputc,
@@ -8262,9 +8651,11 @@ STATIC CONST struct builtin builtins[] = {
{"freopen", 2, 3, 0, OP_NOP, 0, f_freopen, {"freopen", 2, 3, 0, OP_NOP, 0, f_freopen,
"reopen a file stream to a named file"}, "reopen a file stream to a named file"},
{"fscan", 2, IN, FA, OP_NOP, 0, f_fscan, {"fscan", 2, IN, FA, OP_NOP, 0, f_fscan,
"scan a file for assignments to one or\n\t\t\tmore variables"}, "scan a file for assignments to one or\n"
"\t\t\tmore variables"},
{"fscanf", 2, IN, FA, OP_NOP, 0, f_fscanf, {"fscanf", 2, IN, FA, OP_NOP, 0, f_fscanf,
"formatted scan of a file for assignment to one\n\t\t\tor more variables"}, "formatted scan of a file for assignment to one\n"
"\t\t\tor more variables"},
{"fseek", 2, 3, 0, OP_NOP, 0, f_fseek, {"fseek", 2, 3, 0, OP_NOP, 0, f_fseek,
"seek to position b (offset from c) in file a"}, "seek to position b (offset from c) in file a"},
{"fsize", 1, 1, 0, OP_NOP, 0, f_fsize, {"fsize", 1, 1, 0, OP_NOP, 0, f_fsize,
@@ -8282,7 +8673,8 @@ STATIC CONST struct builtin builtins[] = {
{"getenv", 1, 1, 0, OP_NOP, 0, f_getenv, {"getenv", 1, 1, 0, OP_NOP, 0, f_getenv,
"value of environment variable (or NULL)"}, "value of environment variable (or NULL)"},
{"hash", 1, IN, 0, OP_NOP, 0, f_hash, {"hash", 1, IN, 0, OP_NOP, 0, f_hash,
"return non-negative hash value for one or\n\t\t\tmore values"}, "return non-negative hash value for one or\n"
"\t\t\tmore values"},
{"head", 2, 2, 0, OP_NOP, 0, f_head, {"head", 2, 2, 0, OP_NOP, 0, f_head,
"return list of specified number at head of a list"}, "return list of specified number at head of a list"},
{"highbit", 1, 1, 0, OP_HIGHBIT, 0, 0, {"highbit", 1, 1, 0, OP_HIGHBIT, 0, 0,
@@ -8376,7 +8768,8 @@ STATIC CONST struct builtin builtins[] = {
{"istype", 2, 2, 0, OP_ISTYPE, 0, 0, {"istype", 2, 2, 0, OP_ISTYPE, 0, 0,
"whether the type of a is same as the type of b"}, "whether the type of a is same as the type of b"},
{"jacobi", 2, 2, 0, OP_NOP, qjacobi, 0, {"jacobi", 2, 2, 0, OP_NOP, qjacobi, 0,
"-1 => a is not quadratic residue mod b\n\t\t\t1 => b is composite, or a is quad residue of b"}, "-1 => a is not quadratic residue mod b\n"
"\t\t\t1 => b is composite, or a is quad residue of b"},
{"join", 1, IN, 0, OP_NOP, 0, f_join, {"join", 1, IN, 0, OP_NOP, 0, f_join,
"join one or more lists into one list"}, "join one or more lists into one list"},
{"lcm", 1, IN, 0, OP_NOP, f_lcm, 0, {"lcm", 1, IN, 0, OP_NOP, f_lcm, 0,
@@ -8449,8 +8842,31 @@ STATIC CONST struct builtin builtins[] = {
"numerator of fraction"}, "numerator of fraction"},
{"ord", 1, 1, 0, OP_NOP, 0, f_ord, {"ord", 1, 1, 0, OP_NOP, 0, f_ord,
"integer corresponding to character value"}, "integer corresponding to character value"},
{"isupper", 1, 1, 0, OP_NOP, 0, f_isupper,
"whether character is upper case"},
{"islower", 1, 1, 0, OP_NOP, 0, f_islower,
"whether character is lower case"},
{"isalnum", 1, 1, 0, OP_NOP, 0, f_isalnum,
"whether character is alpha-numeric"},
{"isalpha", 1, 1, 0, OP_NOP, 0, f_isalpha,
"whether character is alphabetic"},
{"iscntrl", 1, 1, 0, OP_NOP, 0, f_iscntrl,
"whether character is a control character"},
{"isdigit", 1, 1, 0, OP_NOP, 0, f_isdigit,
"whether character is a digit"},
{"isgraph", 1, 1, 0, OP_NOP, 0, f_isgraph,
"whether character is a graphical character"},
{"isprint", 1, 1, 0, OP_NOP, 0, f_isprint,
"whether character is printable"},
{"ispunct", 1, 1, 0, OP_NOP, 0, f_ispunct,
"whether character is a punctuation"},
{"isspace", 1, 1, 0, OP_NOP, 0, f_isspace,
"whether character is a space character"},
{"isxdigit", 1, 1, 0, OP_NOP, 0, f_isxdigit,
"whether character is a hexadecimal digit"},
{"param", 1, 1, 0, OP_ARGVALUE, 0, 0, {"param", 1, 1, 0, OP_ARGVALUE, 0, 0,
"value of parameter n (or parameter count if n\n\t\t\tis zero)"}, "value of parameter n (or parameter count if n\n"
"\t\t\tis zero)"},
{"perm", 2, 2, 0, OP_NOP, qperm, 0, {"perm", 2, 2, 0, OP_NOP, qperm, 0,
"permutation number a!/(a-b)!"}, "permutation number a!/(a-b)!"},
{"prevcand", 1, 5, 0, OP_NOP, f_prevcand, 0, {"prevcand", 1, 5, 0, OP_NOP, f_prevcand, 0,
@@ -8470,7 +8886,8 @@ STATIC CONST struct builtin builtins[] = {
{"polar", 2, 3, 0, OP_NOP, 0, f_polar, {"polar", 2, 3, 0, OP_NOP, 0, f_polar,
"complex value of polar coordinate (a * exp(b*1i))"}, "complex value of polar coordinate (a * exp(b*1i))"},
{"poly", 1, IN, 0, OP_NOP, 0, f_poly, {"poly", 1, IN, 0, OP_NOP, 0, f_poly,
"evaluates a polynomial given its coefficients\n\t\t\tor coefficient-list"}, "evaluates a polynomial given its coefficients\n"
"\t\t\tor coefficient-list"},
{"pop", 1, 1, FA, OP_NOP, 0, f_listpop, {"pop", 1, 1, FA, OP_NOP, 0, f_listpop,
"pop value from front of list"}, "pop value from front of list"},
{"popcnt", 1, 2, 0, OP_NOP, f_popcnt, 0, {"popcnt", 1, 2, 0, OP_NOP, f_popcnt, 0,
@@ -8492,7 +8909,8 @@ STATIC CONST struct builtin builtins[] = {
{"quo", 2, 3, 0, OP_NOP, 0, f_quo, {"quo", 2, 3, 0, OP_NOP, 0, f_quo,
"integer quotient of a by b, rounding type c"}, "integer quotient of a by b, rounding type c"},
{"quomod", 4, 5, FA, OP_NOP, 0, f_quomod, {"quomod", 4, 5, FA, OP_NOP, 0, f_quomod,
"set c and d to quotient and remainder of a\n\t\t\tdivided by b"}, "set c and d to quotient and remainder of a\n"
"\t\t\tdivided by b"},
{"rand", 0, 2, 0, OP_NOP, f_rand, 0, {"rand", 0, 2, 0, OP_NOP, f_rand, 0,
"additive 55 random number [0,2^64), [0,a), or [a,b)"}, "additive 55 random number [0,2^64), [0,a), or [a,b)"},
{"randbit", 0, 1, 0, OP_NOP, f_randbit, 0, {"randbit", 0, 1, 0, OP_NOP, f_randbit, 0,
@@ -8528,7 +8946,8 @@ STATIC CONST struct builtin builtins[] = {
{"round", 1, 3, 0, OP_NOP, 0, f_round, {"round", 1, 3, 0, OP_NOP, 0, f_round,
"round value a to b number of decimal places"}, "round value a to b number of decimal places"},
{"rsearch", 2, 4, 0, OP_NOP, 0, f_rsearch, {"rsearch", 2, 4, 0, OP_NOP, 0, f_rsearch,
"reverse search matrix or list for value b\n\t\t\tstarting at index c"}, "reverse search matrix or list for value b\n"
"\t\t\tstarting at index c"},
{"runtime", 0, 0, 0, OP_NOP, f_runtime, 0, {"runtime", 0, 0, 0, OP_NOP, f_runtime, 0,
"user and kernel mode cpu time in seconds"}, "user and kernel mode cpu time in seconds"},
{"saveval", 1, 1, 0, OP_SAVEVAL, 0, 0, {"saveval", 1, 1, 0, OP_SAVEVAL, 0, 0,
@@ -8536,11 +8955,14 @@ STATIC CONST struct builtin builtins[] = {
{"scale", 2, 2, 0, OP_SCALE, 0, 0, {"scale", 2, 2, 0, OP_SCALE, 0, 0,
"scale value up or down by a power of two"}, "scale value up or down by a power of two"},
{"scan", 1, IN, FA, OP_NOP, 0, f_scan, {"scan", 1, IN, FA, OP_NOP, 0, f_scan,
"scan standard input for assignment to one\n\t\t\tor more variables"}, "scan standard input for assignment to one\n"
"\t\t\tor more variables"},
{"scanf", 2, IN, FA, OP_NOP, 0, f_scanf, {"scanf", 2, IN, FA, OP_NOP, 0, f_scanf,
"formatted scan of standard input for assignment\n\t\t\tto variables"}, "formatted scan of standard input for assignment\n"
"\t\t\tto variables"},
{"search", 2, 4, 0, OP_NOP, 0, f_search, {"search", 2, 4, 0, OP_NOP, 0, f_search,
"search matrix or list for value b starting\n\t\t\tat index c"}, "search matrix or list for value b starting\n"
"\t\t\tat index c"},
{"sec", 1, 2, 0, OP_NOP, 0, f_sec, {"sec", 1, 2, 0, OP_NOP, 0, f_sec,
"sec of a within accuracy b"}, "sec of a within accuracy b"},
{"sech", 1, 2, 0, OP_NOP, 0, f_sech, {"sech", 1, 2, 0, OP_NOP, 0, f_sech,
@@ -8581,10 +9003,16 @@ STATIC CONST struct builtin builtins[] = {
"assign value to stoponerror flag"}, "assign value to stoponerror flag"},
{"str", 1, 1, 0, OP_NOP, 0, f_str, {"str", 1, 1, 0, OP_NOP, 0, f_str,
"simple value converted to string"}, "simple value converted to string"},
{"strtoupper", 1, 1, 0, OP_NOP, 0, f_strtoupper,
"Make string upper case"},
{"strtolower", 1, 1, 0, OP_NOP, 0, f_strtolower,
"Make string lower case"},
{"strcat", 1,IN, 0, OP_NOP, 0, f_strcat, {"strcat", 1,IN, 0, OP_NOP, 0, f_strcat,
"concatenate strings together"}, "concatenate strings together"},
{"strcmp", 2, 2, 0, OP_NOP, 0, f_strcmp, {"strcmp", 2, 2, 0, OP_NOP, 0, f_strcmp,
"compare two strings"}, "compare two strings"},
{"strcasecmp", 2, 2, 0, OP_NOP, 0, f_strcasecmp,
"compare two strings case independent"},
{"strcpy", 2, 2, 0, OP_NOP, 0, f_strcpy, {"strcpy", 2, 2, 0, OP_NOP, 0, f_strcpy,
"copy string to string"}, "copy string to string"},
{"strerror", 0, 1, 0, OP_NOP, 0, f_strerror, {"strerror", 0, 1, 0, OP_NOP, 0, f_strerror,
@@ -8593,6 +9021,8 @@ STATIC CONST struct builtin builtins[] = {
"length of string"}, "length of string"},
{"strncmp", 3, 3, 0, OP_NOP, 0, f_strncmp, {"strncmp", 3, 3, 0, OP_NOP, 0, f_strncmp,
"compare strings a, b to c characters"}, "compare strings a, b to c characters"},
{"strncasecmp", 3, 3, 0, OP_NOP, 0, f_strncasecmp,
"compare strings a, b to c characters case independent"},
{"strncpy", 3, 3, 0, OP_NOP, 0, f_strncpy, {"strncpy", 3, 3, 0, OP_NOP, 0, f_strncpy,
"copy up to c characters from string to string"}, "copy up to c characters from string to string"},
{"strpos", 2, 2, 0, OP_NOP, 0, f_strpos, {"strpos", 2, 2, 0, OP_NOP, 0, f_strpos,
@@ -8775,7 +9205,8 @@ builtinfunc(long index, int argcount, VALUE *stck)
vpp = valargs; vpp = valargs;
for (i = 0; i < argcount; i++) { for (i = 0; i < argcount; i++) {
if ((*vpp)->v_type != V_NUM) { if ((*vpp)->v_type != V_NUM) {
math_error("Non-real argument for builtin function %s", bp->b_name); math_error("Non-real argument for builtin function %s",
bp->b_name);
/*NOTREACHED*/ /*NOTREACHED*/
} }
numargs[i] = (*vpp)->v_num; numargs[i] = (*vpp)->v_num;

12
func.h
View File

@@ -1,7 +1,7 @@
/* /*
* func - built-in function interface definitions * func - built-in function interface definitions
* *
* Copyright (C) 1999-2007 David I. Bell * Copyright (C) 1999-2007,2014 David I. Bell
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.3 $
* @(#) $Id: func.h,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: func.h,v 30.3 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/func.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/func.h,v $
* *
* Under source code control: 1990/02/15 01:48:33 * Under source code control: 1990/02/15 01:48:33
@@ -28,8 +28,8 @@
*/ */
#if !defined(__FUNC_H__) #if !defined(INCLUDE_FUNC_H)
#define __FUNC_H__ #define INCLUDE_FUNC_H
#if defined(CALC_SRC) /* if we are building from the calc source tree */ #if defined(CALC_SRC) /* if we are building from the calc source tree */
@@ -110,4 +110,4 @@ E_FUNC void freenumbers(FUNC *);
E_FUNC void freefunc(FUNC *); E_FUNC void freefunc(FUNC *);
#endif /* !__FUNC_H__ */ #endif /* !INCLUDE_FUNC_H */

7
hash.c
View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.3 $
* @(#) $Id: hash.c,v 30.2 2007/07/05 17:37:41 chongo Exp $ * @(#) $Id: hash.c,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/hash.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/hash.c,v $
* *
* Under source code control: 1995/11/23 05:13:11 * Under source code control: 1995/11/23 05:13:11
@@ -848,7 +848,8 @@ hash_value(int type, void *v, HASH *state)
value->v_obj->o_actions->oa_index), state); value->v_obj->o_actions->oa_index), state);
(state->chkpt)(state); (state->chkpt)(state);
for (i=value->v_obj->o_actions->oa_count, vp=value->v_obj->o_table; for (i=value->v_obj->o_actions->oa_count,
vp=value->v_obj->o_table;
i-- > 0; i-- > 0;
vp++) { vp++) {

12
hash.h
View File

@@ -1,7 +1,7 @@
/* /*
* hash - one-way hash routines * hash - one-way hash routines
* *
* Copyright (C) 1999-2007 Landon Curt Noll * Copyright (C) 1999-2007,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.4 $
* @(#) $Id: hash.h,v 30.2 2007/07/05 17:37:41 chongo Exp $ * @(#) $Id: hash.h,v 30.4 2014/08/24 21:56:51 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/hash.h,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/hash.h,v $
* *
* Under source code control: 1995/11/14 23:57:45 * Under source code control: 1995/11/14 23:57:45
@@ -29,8 +29,8 @@
*/ */
#if !defined(__HASH_H__) #if !defined(INCLUDE_HASH_H)
#define __HASH_H__ #define INCLUDE_HASH_H
#if defined(CALC_SRC) /* if we are building from the calc source tree */ #if defined(CALC_SRC) /* if we are building from the calc source tree */
@@ -132,4 +132,4 @@ E_FUNC HASH* hash_usb8(int, USB8*, int, HASH*);
E_FUNC HASH* hash_value(int, void*, HASH*); E_FUNC HASH* hash_value(int, void*, HASH*);
#endif /* !__HASH_H__ */ #endif /* !INCLUDE_HASH_H */

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.3 $
* @(#) $Id: have_posscl.c,v 30.2 2008/04/15 21:17:57 chongo Exp $ * @(#) $Id: have_posscl.c,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/have_posscl.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/have_posscl.c,v $
* *
* Under source code control: 1996/07/13 12:57:22 * Under source code control: 1996/07/13 12:57:22
@@ -85,7 +85,8 @@ main(void)
printf("#undef HAVE_FILEPOS_SCALAR\n"); printf("#undef HAVE_FILEPOS_SCALAR\n");
printf("#define HAVE_FILEPOS_SCALAR /* FILEPOS is a simple value */\n"); printf("#define HAVE_FILEPOS_SCALAR /* FILEPOS is a simple value */\n");
#else #else
printf("#undef HAVE_FILEPOS_SCALAR /* FILEPOS is not a simple value */\n"); printf("#undef HAVE_FILEPOS_SCALAR "
"/* FILEPOS is not a simple value */\n");
#endif #endif
/* exit(0); */ /* exit(0); */
return 0; return 0;

View File

@@ -1,7 +1,7 @@
/* /*
* have_stdvs - try <stdarg.h> to see if it really works with vsprintf() * have_stdvs - try <stdarg.h> to see if it really works with vsprintf()
* *
* Copyright (C) 1999 Landon Curt Noll * Copyright (C) 1999,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.4 $
* @(#) $Id: have_stdvs.c,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: have_stdvs.c,v 30.4 2014/08/24 21:57:31 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/have_stdvs.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/have_stdvs.c,v $
* *
* Under source code control: 1995/09/09 22:41:10 * Under source code control: 1995/09/09 22:41:10
@@ -56,8 +56,14 @@
# include <string.h> # include <string.h>
#endif #endif
#include "have_stdlib.h"
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
#undef VSPRINTF_SIZE_T #undef VSPRINTF_SIZE_T
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) #if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || \
defined(__cplusplus)
# define VSPRINTF_SIZE_T size_t # define VSPRINTF_SIZE_T size_t
#else #else
# define VSPRINTF_SIZE_T long # define VSPRINTF_SIZE_T long
@@ -86,7 +92,7 @@ try_nthis(char *fmt, VSPRINTF_SIZE_T size, ...)
{ {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, size);
#if !defined(DONT_HAVE_VSPRINTF) #if !defined(DONT_HAVE_VSPRINTF)
vsnprintf(buf, size, fmt, ap); vsnprintf(buf, size, fmt, ap);
#else #else
@@ -160,8 +166,10 @@ main(void)
puts("/*"); puts("/*");
puts(" * SIMULATE_STDARG"); puts(" * SIMULATE_STDARG");
puts(" *"); puts(" *");
puts(" * WARNING: This type of stdarg makes assumptions about the stack"); puts(" * WARNING: This type of stdarg makes assumptions "
puts(" * that may not be true on your system. You may want to"); "about the stack");
puts(" * that may not be true on your system. "
"You may want to");
puts(" * define STDARG (if using ANSI C) or VARARGS."); puts(" * define STDARG (if using ANSI C) or VARARGS.");
puts(" */"); puts(" */");
puts("typedef char *va_list;"); puts("typedef char *va_list;");
@@ -169,7 +177,8 @@ main(void)
puts("#define va_end(ap) (void)((ap) = 0)"); puts("#define va_end(ap) (void)((ap) = 0)");
puts("#define va_arg(ap, type) \\"); puts("#define va_arg(ap, type) \\");
puts(" (((type*)((ap) = ((ap) + sizeof(type))))[-1])"); puts(" (((type*)((ap) = ((ap) + sizeof(type))))[-1])");
puts("#define SIMULATE_STDARG /* use std_arg.h to simulate <stdarg.h> */"); puts("#define SIMULATE_STDARG "
"/* use std_arg.h to simulate <stdarg.h> */");
#else #else
puts("#define STDARG /* use <stdarg.h> */"); puts("#define STDARG /* use <stdarg.h> */");
puts("#include <stdarg.h>"); puts("#include <stdarg.h>");

View File

@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.1 $ * @(#) $Revision: 30.2 $
* @(#) $Id: have_varvs.c,v 30.1 2007/03/16 11:09:46 chongo Exp $ * @(#) $Id: have_varvs.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/have_varvs.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/have_varvs.c,v $
* *
* Under source code control: 1995/09/09 22:41:10 * Under source code control: 1995/09/09 22:41:10
@@ -53,7 +53,8 @@
#endif #endif
#undef VSPRINTF_SIZE_T #undef VSPRINTF_SIZE_T
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) #if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || \
defined(__cplusplus)
# define VSPRINTF_SIZE_T size_t # define VSPRINTF_SIZE_T size_t
#else #else
# define VSPRINTF_SIZE_T long # define VSPRINTF_SIZE_T long

8
help.c
View File

@@ -1,7 +1,7 @@
/* /*
* help - display help for calc * help - display help for calc
* *
* Copyright (C) 1999-2007 Landon Curt Noll * Copyright (C) 1999-2007,2014 Landon Curt Noll
* *
* Calc is open software; you can redistribute it and/or modify it under * Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License * the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc. * received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @(#) $Revision: 30.2 $ * @(#) $Revision: 30.4 $
* @(#) $Id: help.c,v 30.2 2007/09/21 01:27:27 chongo Exp $ * @(#) $Id: help.c,v 30.4 2014/08/24 21:57:31 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/help.c,v $ * @(#) $Source: /usr/local/src/bin/calc/RCS/help.c,v $
* *
* Under source code control: 1997/09/14 10:58:30 * Under source code control: 1997/09/14 10:58:30
@@ -274,7 +274,7 @@ givehelp(char *type)
#if defined(CUSTOM) #if defined(CUSTOM)
/* /*
* open the the helpfile (looking in CUSTOMHELPDIR last) * open the helpfile (looking in CUSTOMHELPDIR last)
*/ */
} else { } else {

View File

@@ -18,8 +18,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc. # received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# @(#) $Revision: 30.5 $ # @(#) $Revision: 30.10 $
# @(#) $Id: Makefile,v 30.5 2007/09/21 01:27:27 chongo Exp $ # @(#) $Id: Makefile,v 30.10 2014/09/02 07:15:58 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/help/RCS/Makefile,v $ # @(#) $Source: /usr/local/src/bin/calc/help/RCS/Makefile,v $
# #
# Under source code control: 1991/07/23 06:47:57 # Under source code control: 1991/07/23 06:47:57
@@ -272,43 +272,47 @@ BLT_HELP_FILES= ${BLT_HELP_FILES_3} ${BLT_HELP_FILES_5} \
${BLT_HELP_FILES_11} ${BLT_HELP_FILES_13} \ ${BLT_HELP_FILES_11} ${BLT_HELP_FILES_13} \
${BLT_HELP_FILES_14} ${BLT_HELP_FILES_14}
# The detailed list of help files to install
#
# This list is prodiced by the detaillist rule when no WARNINGS are detected. # This list is prodiced by the detaillist rule when no WARNINGS are detected.
# #
# Please use: # Please use:
# #
# make detaillist # make detail_help_list
# #
# to keep this list in nice sorted order and to check that these # to keep this list in nice sorted order and to check that these
# non-special help files are under RCS control. # non-special help files are under RCS control.
# #
DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \ DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address \
appr arg argv arrow asec asech asin asinh assign atan atan2 atanh \ agd append appr arg argv arrow asec asech asin asinh assign atan \
avg base base2 bernoulli bit blk blkcpy blkfree blocks bround btrunc \ atan2 atanh avg base base2 bernoulli bit blk blkcpy blkfree blocks \
calc_tty calclevel calcpath catalan ceil cfappr cfsim char cmdbuf \ bround btrunc calc_tty calclevel calcpath catalan ceil cfappr cfsim \
cmp comb conj cos cosh cot coth count cp csc csch ctime delete den \ char cmdbuf cmp comb conj cos cosh cot coth count cp csc csch ctime \
dereference det digit digits display dp epsilon errcount errmax \ delete den dereference det digit digits display dp epsilon errcount \
errno error estr euler eval exp fact factor fclose fcnt feof ferror \ errmax errno error estr euler eval exp fact factor fclose fcnt \
fflush fgetc fgetfield fgetfile fgetline fgets fgetstr fib files \ feof ferror fflush fgetc fgetfield fgetfile fgetline fgets fgetstr \
floor fopen forall fpathopen fprintf fputc fputs fputstr frac free \ fib files floor fopen forall fpathopen fprintf fputc fputs fputstr \
freebernoulli freeeuler freeglobals freeredc freestatics frem freopen \ frac free freebernoulli freeeuler freeglobals freeredc freestatics \
fscan fscanf fseek fsize ftell gcd gcdrem gd getenv hash head highbit \ frem freopen fscan fscanf fseek fsize ftell gcd gcdrem gd getenv \
hmean hnrmod hypot ilog ilog10 ilog2 im indices inputlevel insert int \ hash head highbit hmean hnrmod hypot ilog ilog10 ilog2 im indices \
inverse iroot isassoc isatty isblk isconfig isdefined iserror iseven \ inputlevel insert int inverse iroot isalnum isalpha isassoc isatty \
isfile ishash isident isint islist ismat ismult isnull isnum isobj \ isblk iscntrl isconfig isdefined isdigit iserror iseven isfile \
isobjtype isodd isprime isptr isqrt isrand israndom isreal isrel \ isgraph ishash isident isint islist islower ismat ismult isnull \
issimple issq isstr istype jacobi join lcm lcmfact lfactor ln log \ isnum isobj isobjtype isodd isprime isprint isptr ispunct isqrt \
lowbit ltol makelist matdim matfill matmax matmin matsum mattrace \ isrand israndom isreal isrel issimple isspace issq isstr istype \
mattrans max memsize meq min minv mmin mne mod modify name near \ isupper isxdigit jacobi join lcm lcmfact lfactor ln log lowbit ltol \
newerror nextcand nextprime norm null num oldvalue ord param perm \ makelist matdim matfill matmax matmin matsum mattrace mattrans max \
pfact pi pix places pmod polar poly pop popcnt pound power prevcand \ memsize meq min minv mmin mne mod modify name near newerror nextcand \
prevprime printf prompt protect ptest push putenv quo quomod rand \ nextprime norm null num oldvalue ord param perm pfact pi pix places \
randbit random randombit randperm rcin rcmul rcout rcpow rcsq re \ pmod polar poly pop popcnt pound power prevcand prevprime printf \
remove reverse rewind rm root round rsearch runtime saveval scale \ prompt protect ptest push putenv quo quomod rand randbit random \
scan scanf search sec sech seed segment select sgn sha1 sin \ randombit randperm rcin rcmul rcout rcpow rcsq re remove reverse \
sinh size sizeof sleep sort sqrt srand srandom ssq stoponerror \ rewind rm root round rsearch runtime saveval scale scan scanf \
str strcat strcmp strcpy strerror strlen strncmp strncpy strpos \ search sec sech seed segment select sgn sha1 sin sinh size sizeof \
strprintf strscan strscanf substr sum swap system systime tail tan \ sleep sort sqrt srand srandom ssq stoponerror str strcasecmp strcat \
tanh test time trunc usertime version xor strcmp strcpy strerror strlen strncasecmp strncmp strncpy strpos \
strprintf strscan strscanf strtolower strtoupper substr sum swap \
system systime tail tan tanh test time trunc usertime version xor
# This list is of files that are clones of DETAIL_HELP files. They are # This list is of files that are clones of DETAIL_HELP files. They are
# built from DETAIL_HELP files. # built from DETAIL_HELP files.
@@ -633,11 +637,26 @@ bsdi: all
${RM} -f obj ${RM} -f obj
${CP} obj.file obj ${CP} obj.file obj
# These next rule help me form the ${DETAIL_HELP} makefile variables above. # These next rule help form the ${DETAIL_HELP} makefile variables above.
# #
detaillist: # NOTE: The ${DETAIL_HELP} list does not include special help files.
${Q} -(echo "xxxxx"; \ #
for i in ${DETAIL_HELP} /dev/null; do \ detail_help_list:
${Q} -(find . -mindepth 1 -maxdepth 1 -type f \
! -name Makefile ! -name '.Makefile.swp' \
! -name archive ! -name assoc ! -name builtin.end \
! -name builtin.top ! -name command ! -name config \
! -name contrib ! -name credit ! -name custom ! -name define \
! -name environment ! -name errorcodes.hdr \
! -name errorcodes.sed ! -name expression ! -name file \
! -name funclist.c ! -name funclist.sed ! -name help \
! -name history ! -name interrupt ! -name intro ! -name list \
! -name mat ! -name obj.file ! -name operator \
! -name overview ! -name script ! -name statement \
! -name todo ! -name types ! -name unexpected \
! -name variable ! -name wishlist \
-print | \
while read i; do \
if [ X"$$i" != X"/dev/null" ]; then \ if [ X"$$i" != X"/dev/null" ]; then \
if [ ! -f RCS/$$i,v ]; then \ if [ ! -f RCS/$$i,v ]; then \
echo "WARNING: $$i not under RCS control" 1>&2; \ echo "WARNING: $$i not under RCS control" 1>&2; \
@@ -645,8 +664,10 @@ detaillist:
echo $$i; \ echo $$i; \
fi; \ fi; \
fi; \ fi; \
done | LANG=C ${SORT}) | ${FMT} -70 | \ done; \
${SED} -e '1s/xxxxx/DETAIL_HELP=/' -e '2,$$s/^/ /' \ echo '--first_line--') | \
${SED} -e 's:^\./::' | LANG=C ${SORT} | ${FMT} -70 | \
${SED} -e '1s/--first_line--/DETAIL_HELP=/' -e '2,$$s/^/ /' \
-e 's/$$/ \\/' -e '$$s/ \\$$//' -e 's/$$/ \\/' -e '$$s/ \\$$//'
## ##
@@ -684,8 +705,8 @@ clobber: clean
# #
install: all install: all
-${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \ -${Q} if [ ! -d ${T}${CALC_SHAREDIR} ]; then \
echo ${MKDIR} ${T}${CALC_SHAREDIR}; \ echo ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
${MKDIR} ${T}${CALC_SHAREDIR}; \ ${MKDIR} -p ${T}${CALC_SHAREDIR}; \
if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \ if [ ! -d "${T}${CALC_SHAREDIR}" ]; then \
echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ echo ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
${MKDIR} -p "${T}${CALC_SHAREDIR}"; \ ${MKDIR} -p "${T}${CALC_SHAREDIR}"; \
@@ -696,8 +717,8 @@ install: all
${TRUE}; \ ${TRUE}; \
fi fi
-${Q} if [ ! -d ${T}${HELPDIR} ]; then \ -${Q} if [ ! -d ${T}${HELPDIR} ]; then \
echo ${MKDIR} ${T}${HELPDIR}; \ echo ${MKDIR} -p ${T}${HELPDIR}; \
${MKDIR} ${T}${HELPDIR}; \ ${MKDIR} -p ${T}${HELPDIR}; \
if [ ! -d "${T}${HELPDIR}" ]; then \ if [ ! -d "${T}${HELPDIR}" ]; then \
echo ${MKDIR} -p "${T}${HELPDIR}"; \ echo ${MKDIR} -p "${T}${HELPDIR}"; \
${MKDIR} -p "${T}${HELPDIR}"; \ ${MKDIR} -p "${T}${HELPDIR}"; \

View File

@@ -1,4 +1,4 @@
Where to get the the latest versions of calc Where to get the latest versions of calc
Landon Noll maintains the official calc home page at: Landon Noll maintains the official calc home page at:
@@ -31,8 +31,8 @@ chongo <was here> /\../\
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.2 $
## @(#) $Id: archive,v 30.1 2007/03/16 11:10:42 chongo Exp $ ## @(#) $Id: archive,v 30.2 2013/08/11 01:08:32 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/archive,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/archive,v $
## ##
## Under source code control: 1996/06/13 02:51:48 ## Under source code control: 1996/06/13 02:51:48

View File

@@ -86,7 +86,7 @@ DESCRIPTION
; blkcpy(L, M); ; blkcpy(L, M);
For copying from a block B (named or unnamed), the total number of octets For copying from a block B (named or unnamed), the total number of octets
available for copying is taken to the the datalen for that block, available for copying is taken to the datalen for that block,
so that num can be at most size(B) - ssi. so that num can be at most size(B) - ssi.
For copying to a block B (named or unnamed), reallocation will be For copying to a block B (named or unnamed), reallocation will be
@@ -206,8 +206,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.2 $
## @(#) $Id: blkcpy,v 30.1 2007/03/16 11:10:42 chongo Exp $ ## @(#) $Id: blkcpy,v 30.2 2013/08/11 01:08:32 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/blkcpy,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/blkcpy,v $
## ##
## Under source code control: 1997/04/05 14:08:50 ## Under source code control: 1997/04/05 14:08:50

View File

@@ -36,45 +36,73 @@ as a diff -c /dev/null your-file patch, or as a uuencoded and
gziped (or compressed) tar file). gziped (or compressed) tar file).
To contribute code, scripts, resource files and/or to help please To contribute code, scripts, resource files and/or to help please
join the low volume calc mailing list by sending EMail to: join the low volume calc mailing list calc-tester. Then send
your contribution to the calc-tester mailing list.
calc-contrib at asthe dot com To subscribe to the calc-tester mailing list, visit the following URL:
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] https://www.listbox.com/subscribe/?list_id=239342
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
Your subject must contain the words: To help determine you are a human and not just a spam bot,
you will be required to provide the following additional info:
calc mailing list subscription Your Name
Calc Version
Operating System
The date 7 days ago
You may have additional words in your subject line. This is a low volume moderated mailing list.
Feel free to follow the name line with additional EMail text as desired. This mailing list replaces calc-tester at asthe dot com list.
Thanks for considering submitting code to calc. Calc is a collective If you need a human to help you with your mailing list subscription,
work by a number of people. It would not be what it is today without please send EMail to our special:
your efforts and submissions!
calc-tester-maillist-help at asthe dot com
NOTE: Remove spaces and replace 'at' with @, 'dot' with .
address. To be sure we see your EMail asking for help with your
mailing list subscription, please use the following phase in your
EMail Subject line:
calc tester mailing list help
That phrase in your subject line will help ensure your
request will get past our anti-spam filters. You may have
additional words in your subject line.
=-= =-=
Calc bug reports and calc bug fixes should be sent to: Calc bug reports and calc bug fixes should be sent to:
calc-bugs at asthe dot com calc-bug-report at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]] NOTE: Remove spaces and replace 'at' with @, 'dot' with .
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
Your subject must contain the words: This replaces the old calc-bugs at asthe dot com address.
calc bug report To be sure we see your EMail reporting a calc bug, please use the
following phase in your EMail Subject line:
You may have additional words in your subject line. calc bug report
See the BUGS file or try the help command: That phrase in your subject line will help ensure your
request will get past our anti-spam filters. You may have
additional words in your subject line.
help bugs However, you may find it more helpful to simply subscribe
to the calc-tester mailing list (see above) and then to
send your report to that mailing list as a wider set calc
testers may be able to help you.
for details on bug reporting. =-=
The calc web site is located at:
http://www.isthe.com/chongo/tech/comp/calc/
NOTE: The EMail address uses 'asthe', while the web site uses 'isthe'.
=-= =-=
@@ -83,7 +111,7 @@ http://www.isthe.com/chongo/
chongo (share and enjoy) /\../\ chongo (share and enjoy) /\../\
## Copyright (C) 1999 Landon Curt Noll ## Copyright (C) 1999,2014 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -99,8 +127,8 @@ chongo (share and enjoy) /\../\
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.2 $
## @(#) $Id: contrib,v 30.1 2007/03/16 11:10:42 chongo Exp $ ## @(#) $Id: contrib,v 30.2 2014/10/06 08:39:45 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/contrib,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/contrib,v $
## ##
## Under source code control: 1997/03/09 16:33:22 ## Under source code control: 1997/03/09 16:33:22

View File

@@ -30,8 +30,8 @@ DESCRIPTION
If 1 < n < nextprime(limit)^2, then f(n, limit) == 1 <==> n is prime. If 1 < n < nextprime(limit)^2, then f(n, limit) == 1 <==> n is prime.
For example, if 1 < n < 121, n is prime if and only if f(n,7) == 1. For example, if 1 < n < 121, n is prime if and only if f(n,7) == 1.
If limit >= 2^32, factor(n, limit) causes an error and factor(n, If limit >= 2^32, factor(n, limit) causes an error and
limit, err) returns the value of err. factor(n, limit, err) returns the value of err.
EXAMPLE EXAMPLE
; print factor(35,4), factor(35,5), factor(35), factor(-35) ; print factor(35,4), factor(35,5), factor(35), factor(-35)
@@ -66,8 +66,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.2 $
## @(#) $Id: factor,v 30.1 2007/03/16 11:10:42 chongo Exp $ ## @(#) $Id: factor,v 30.2 2013/08/18 20:15:13 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/factor,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/factor,v $
## ##
## Under source code control: 1995/12/18 12:34:57 ## Under source code control: 1995/12/18 12:34:57

View File

@@ -1,5 +1,5 @@
NAME NAME
fpathopen - open an absolute filename, or a relative filename along a search path fpathopen - open an absolute or relative filename along a search path
SYNOPSIS SYNOPSIS
fpathopen(filename, mode [,searchpath]) fpathopen(filename, mode [,searchpath])
@@ -165,7 +165,8 @@ EXAMPLE
FILE 7 "/home/chongo/tmp/output" (writing, pos 0) FILE 7 "/home/chongo/tmp/output" (writing, pos 0)
; badfile = fpathopen("no_such_file", "r") ; badfile = fpathopen("no_such_file", "r")
; if (!isfile(badfile)) print "error #" errno(badfile) : ":" : strerror(badfile); ; if (!isfile(badfile)) print "error #" errno(badfile) : \
":" : strerror(badfile);
error #2: No such file or directory error #2: No such file or directory
LIMITS LIMITS
@@ -195,8 +196,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.2 $
## @(#) $Id: fpathopen,v 30.1 2007/03/16 11:10:42 chongo Exp $ ## @(#) $Id: fpathopen,v 30.2 2013/08/11 08:41:38 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/fpathopen,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/fpathopen,v $
## ##
## Under source code control: 2006/05/07 23:56:04 ## Under source code control: 2006/05/07 23:56:04

View File

@@ -13,11 +13,21 @@ DESCRIPTION
Returns a hash value for one or more values of arbitrary types. Returns a hash value for one or more values of arbitrary types.
The calc hash value is based on the core Fowler/Noll/Vo hash The calc hash value is based on the core Fowler/Noll/Vo hash
known as FNV-1. The return value, however, cannot be used known as FNV-0. The return value, however, cannot be used
as an FNV hash value because calc's internal function also as an FNV hash value because calc's internal function also
takes into account more abstract concepts such as data types. takes into account more abstract concepts such as data types.
See: WARNING: Use of FNV-0 is NOT recommended for general purposes.
Calc uses FNV-0 for internal objects such as associative
arrays as well as other internal processes. Calc
maintains the use of FNV-0 for backwards compatibility.
You should use the FNV-1a hash instead!!!!!
Use the fnv() builtin function for general quick, non-cryptographic
hash purposes.
See also:
http://www.isthe.com/chongo/tech/comp/fnv/ http://www.isthe.com/chongo/tech/comp/fnv/
@@ -35,9 +45,9 @@ LINK LIBRARY
none none
SEE ALSO SEE ALSO
ishash, sha1 ishash, fnv, sha1
## Copyright (C) 1999-2007 Landon Curt Noll ## Copyright (C) 1999-2007,2014 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -53,8 +63,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.2 $ ## @(#) $Revision: 30.3 $
## @(#) $Id: hash,v 30.2 2007/07/05 17:37:41 chongo Exp $ ## @(#) $Id: hash,v 30.3 2014/10/06 08:45:56 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/hash,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/hash,v $
## ##
## Under source code control: 1996/03/12 23:10:01 ## Under source code control: 1996/03/12 23:10:01

View File

@@ -54,7 +54,7 @@ What is calc?
Functions can be used in expressions. There are a great number of Functions can be used in expressions. There are a great number of
pre-defined functions. For example, the following will calculate pre-defined functions. For example, the following will calculate
the factorial of the value of 'old': the factorial of the value of 'whey':
fact(whey) fact(whey)
@@ -185,8 +185,8 @@ What is calc?
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.2 $
## @(#) $Id: intro,v 30.1 2007/03/16 11:10:42 chongo Exp $ ## @(#) $Id: intro,v 30.2 2016/02/06 08:25:30 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/intro,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/intro,v $
## ##
## Under source code control: 1991/07/21 04:37:21 ## Under source code control: 1991/07/21 04:37:21

54
help/isalnum Normal file
View File

@@ -0,0 +1,54 @@
NAME
isalnum - whether character is alpha-numeric
SYNOPSIS
isalnum(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is alpha-numeric. This function will return 1 if c is
alpha-numeric, 0 otherwise.
EXAMPLE
; print isalnum("A"), isalnum("a"), isalnum("2"), isalnum("\t")
1 1 1 0
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isupper, isalpha, iscntrl, isdigit, isgraph, isprint,
ispunct, isspace, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: isalnum,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/isalnum,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/isalpha Normal file
View File

@@ -0,0 +1,54 @@
NAME
isalpha - whether character is alphabetic
SYNOPSIS
isalpha(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is alphabetic. This function will return 1 if c is
alphabetic, 0 otherwise.
EXAMPLE
; print isalpha("A"), isalpha("a"), isalpha("1"), isalpha("\t")
1 1 0 0
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isupper, isalnum, iscntrl, isdigit, isgraph, isprint,
ispunct, isspace, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: isalpha,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/isalpha,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/iscntrl Normal file
View File

@@ -0,0 +1,54 @@
NAME
iscntrl - whether character is a control character
SYNOPSIS
iscntrl(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is a control character. This function will return 1 if c is
alphabetic, 0 otherwise.
EXAMPLE
; print iscntrl("A"), iscntrl("a"), iscntrl("1"), iscntrl("\t")
0 0 0 1
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isupper, isalnum, isalpha, isdigit, isgraph, isprint,
ispunct, isspace, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: iscntrl,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/iscntrl,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/isdigit Normal file
View File

@@ -0,0 +1,54 @@
NAME
isdigit - whether character is a digit character
SYNOPSIS
isdigit(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is a digit character. This function will return 1 if c is
a digit character, 0 otherwise.
EXAMPLE
; print isdigit("A"), isdigit("a"), isdigit("1"), isdigit("\t")
0 0 1 0
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isupper, isalnum, isalpha, iscntrl, isgraph, isprint,
ispunct, isspace, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: isdigit,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/isdigit,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/isgraph Normal file
View File

@@ -0,0 +1,54 @@
NAME
isgraph - whether character is a graphical character
SYNOPSIS
isgraph(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is a graphical character. This function will return 1 if c
is graphical, 0 otherwise.
EXAMPLE
; print isgraph("A"), isgraph("a"), isgraph("1"), isgraph(" ")
1 1 1 0
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isupper, isalnum, isalpha, iscntrl, isdigit, isprint,
ispunct, isspace, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: isgraph,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/isgraph,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/islower Normal file
View File

@@ -0,0 +1,54 @@
NAME
islower - whether character is lower case
SYNOPSIS
islower(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is lower case. This function will return 1 if c is
lower case, 0 otherwise.
EXAMPLE
; print islower("A"), islower("a"), islower("1")
0 1 0
LIMITS
none
LINK LIBRARY
none
SEE ALSO
isupper, isalnum, isalpha, iscntrl, isdigit, isgraph, isprint,
ispunct, isspace, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: islower,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/islower,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/isprint Normal file
View File

@@ -0,0 +1,54 @@
NAME
isprint - whether character is a printable
SYNOPSIS
isprint(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is printable. This function will return 1 if c is
printable, 0 otherwise.
EXAMPLE
; print isprint("A"), ispint("a"), isprint(" "), isprint("\t")
1 1 1 0
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isupper, isalnum, isalpha, iscntrl, isdigit, isgraph,
ispunct, isspace, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: isprint,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/isprint,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/ispunct Normal file
View File

@@ -0,0 +1,54 @@
NAME
ispunct - whether character is a punctuation
SYNOPSIS
ispunct(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is a punctuation. This function will return 1 if c is
a punctuation, 0 otherwise.
EXAMPLE
; print ispunct("A"), ispunct("a"), ispunct(" "), ispunct("?")
0 0 0 1
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isupper, isalnum, isalpha, iscntrl, isdigit, isgraph, isprint
isspace, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: ispunct,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/ispunct,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/isspace Normal file
View File

@@ -0,0 +1,54 @@
NAME
isspace - whether character is a space character
SYNOPSIS
isspace(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is a space character. This function will return 1 if c is
a space character, 0 otherwise.
EXAMPLE
; print isspace("A"), isspace("Kirk"), isspace(" "), isspace("?")
0 0 1 0
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isupper, isalnum, isalpha, iscntrl, isdigit, isgraph, isprint
ispunct, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: isspace,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/isspace,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/isupper Normal file
View File

@@ -0,0 +1,54 @@
NAME
isupper - whether character is upper case
SYNOPSIS
isupper(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is upper case. This function will return 1 if c is
upper case, 0 otherwise.
EXAMPLE
; print isupper("A"), isupper("a"), isupper("1")
1 0 0
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isalnum, isalpha, iscntrl, isdigit, isgraph, isprint,
ispunct, isspace, isxdigit
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: isupper,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/isupper,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

54
help/isxdigit Normal file
View File

@@ -0,0 +1,54 @@
NAME
isxdigit - whether character a hexadecimal digit
SYNOPSIS
isxdigit(c)
TYPES
c string
return int
DESCRIPTION
Determine if c is a hexadecimal digit. This function will return 1 if c is
a hexadecimal digit, 0 otherwise.
EXAMPLE
; print isxdigit("A"), isxdigit("f"), isxdigit("2"), isxdigit("x")
1 1 1 0
LIMITS
none
LINK LIBRARY
none
SEE ALSO
islower, isupper, isalnum, isalpha, iscntrl, isdigit, isgraph, isprint
ispunct, isspace
## Copyright (C) 2013 Christoph Zurnieden
##
## 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: isxdigit,v 30.3 2013/09/01 20:00:20 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/isxdigit,v $
##
## Under source code control: 2013/09/01 18:10:53
## File existed as early as: 2013
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

View File

@@ -134,7 +134,8 @@ Using objects
xx_print 1 print value, default prints elements xx_print 1 print value, default prints elements
xx_one 1 multiplicative identity, default is 1 xx_one 1 multiplicative identity, default is 1
xx_test 1 logical test (false,true => 0,1), default tests elements xx_test 1 logical test (false,true => 0,1),
default tests elements
xx_add 2 xx_add 2
xx_sub 2 xx_sub 2
xx_neg 1 negative xx_neg 1 negative
@@ -144,9 +145,11 @@ Using objects
xx_abs 2 absolute value within given error xx_abs 2 absolute value within given error
xx_norm 1 square of absolute value xx_norm 1 square of absolute value
xx_conj 1 conjugate xx_conj 1 conjugate
xx_pow 2 integer power, default does multiply, square, inverse xx_pow 2 integer power, default does multiply,
square, inverse
xx_sgn 1 sign of value (-1, 0, 1) xx_sgn 1 sign of value (-1, 0, 1)
xx_cmp 2 equality (equal,nonequal => 0,1), default tests elements xx_cmp 2 equality (equal,nonequal => 0,1),
default tests elements
xx_rel 2 relative order, positive for >, etc. xx_rel 2 relative order, positive for >, etc.
xx_quo 3 integer quotient xx_quo 3 integer quotient
xx_mod 3 remainder of division xx_mod 3 remainder of division
@@ -209,8 +212,8 @@ Using objects
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.3 $ ## @(#) $Revision: 30.4 $
## @(#) $Id: obj.file,v 30.3 2010/09/02 06:36:21 chongo Exp $ ## @(#) $Id: obj.file,v 30.4 2013/08/11 08:41:38 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/obj.file,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/obj.file,v $
## ##
## Under source code control: 1991/07/21 04:37:22 ## Under source code control: 1991/07/21 04:37:22

View File

@@ -2,7 +2,7 @@ NAME
# #
SYNOPSIS SYNOPSIS
#!/usr/local/src/cmd/calc/calc -q -f #!/usr/local/src/bin/calc/calc -q -f
# x # x
x # y x # y
## comment ## comment
@@ -52,7 +52,7 @@ DESCRIPTION
For example, of an executable file contains: For example, of an executable file contains:
#!/usr/local/src/cmd/calc/calc -q -f #!/usr/local/src/bin/calc/calc -q -f
/* NOTE: The #! above must start in column 1 of the 1st line */ /* NOTE: The #! above must start in column 1 of the 1st line */
/* The 1st line must end with -f */ /* The 1st line must end with -f */
## Single # shell comments don't work, use two or more ## Single # shell comments don't work, use two or more
@@ -100,7 +100,7 @@ LINK LIBRARY
SEE ALSO SEE ALSO
cscript, unexpected, usage cscript, unexpected, usage
## Copyright (C) 2007 Landon Curt Noll ## Copyright (C) 2007,2014 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -116,8 +116,8 @@ SEE ALSO
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.4 $
## @(#) $Id: pound,v 30.1 2007/03/16 11:10:42 chongo Exp $ ## @(#) $Id: pound,v 30.4 2014/08/24 21:59:45 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/pound,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/pound,v $
## ##
## Under source code control: 2007/02/06 14:09 ## Under source code control: 2007/02/06 14:09

View File

@@ -149,7 +149,7 @@ Calc shell scripts
#!/usr/bin/calc -q -s -f #!/usr/bin/calc -q -s -f
global i, n, s; global i, n, s;
n = argv(); n = argv();
for (i = 1; i <= n; i++) for (i = 1; i < n; i++)
s += eval(argv(i)); s += eval(argv(i));
print "sum =", s; print "sum =", s;
@@ -273,7 +273,7 @@ For more information use the following calc commands:
help config help config
help cscript help cscript
## Copyright (C) 2000 Landon Curt Noll and Ernest Bowen ## Copyright (C) 2000,2014 Landon Curt Noll and Ernest Bowen
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License ## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -289,8 +289,8 @@ For more information use the following calc commands:
## received a copy with calc; if not, write to Free Software Foundation, Inc. ## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
## ##
## @(#) $Revision: 30.1 $ ## @(#) $Revision: 30.2 $
## @(#) $Id: script,v 30.1 2007/03/16 11:10:42 chongo Exp $ ## @(#) $Id: script,v 30.2 2014/08/24 22:38:56 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/script,v $ ## @(#) $Source: /usr/local/src/bin/calc/help/RCS/script,v $
## ##
## Under source code control: 1999/11/30 05:29:48 ## Under source code control: 1999/11/30 05:29:48

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