Compare commits

...

8 Commits

Author SHA1 Message Date
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
Landon Curt Noll
a1c96f95a6 Release calc version 2.12.4.8 2017-05-21 15:38:56 -07:00
111 changed files with 12440 additions and 1293 deletions

8
BUGS
View File

@@ -84,7 +84,7 @@ Problems that have known work-a-rounds:
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
addressed and improved someday.
@@ -129,7 +129,7 @@ mis-features in calc:
will not.
## Copyright (C) 1999-2007 Landon Curt Noll
## Copyright (C) 1999-2013 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
@@ -145,8 +145,8 @@ mis-features in calc:
## 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.1 $
## @(#) $Id: BUGS,v 30.1 2007/03/16 11:09:46 chongo Exp $
## @(#) $Revision: 30.2 $
## @(#) $Id: BUGS,v 30.2 2013/08/11 01:09:27 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/RCS/BUGS,v $
##
## Under source code control: 1994/03/18 14:06:13

155
CHANGES
View File

@@ -1,4 +1,84 @@
The following are the changes from calc version 2.12.4.6 to date:
The following are the changes from calc version 2.12.4.11 to date:
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.
@@ -11,6 +91,56 @@ The following are the changes from calc version 2.12.4.6 to date:
Libraries are chmodded as 0644 to allow for building rpms
without root.
Silenced annoying warning about unused variable 'intp'
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:
@@ -1166,8 +1296,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:
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
dot edu> for pointing this out.
Thanks goes to Michael Somos for pointing this out.
Linux and gcc now compiled with -Wall -W -Wno-comment.
@@ -2122,7 +2251,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
'##' 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
*.a files calc binary link library
@@ -2160,7 +2289,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 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>.
A patch from Klaus Alexander Seistrup <klaus at seistrup dot dk>, when
@@ -2354,7 +2483,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.
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:
#!/usr/local/bin/calc -S -e
@@ -4817,7 +4946,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
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
initialization code) with the same identifier
@@ -4915,7 +5044,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
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.
Optimized opcode generator so that functions defined using '=' do not
@@ -5412,7 +5541,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
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.
@@ -5637,7 +5766,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
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.
The Makefile builds calcerr.h from this file.
@@ -6180,7 +6309,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
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:
@@ -6831,8 +6960,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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.25 $
## @(#) $Id: CHANGES,v 30.25 2013/05/05 10:15:30 chongo Exp $
## @(#) $Revision: 30.38 $
## @(#) $Id: CHANGES,v 30.38 2013/09/27 08:59:43 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/RCS/CHANGES,v $
##
## Under source code control: 1993/06/02 18:12:57

17
COPYING
View File

@@ -12,11 +12,11 @@ This file is Copyrighted
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
# @(#) $Revision: 30.2 $
# @(#) $Id: COPYING,v 30.2 2008/10/24 10:46:52 chongo Exp $
# @(#) $Revision: 30.4 $
# @(#) $Id: COPYING,v 30.4 2013/09/01 20:14:30 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/COPYING,v $
=-=
-=-
Calc is covered by the GNU Lesser General Public License
--------------------------------------------------------
@@ -78,7 +78,7 @@ Calc is covered by the GNU Lesser General Public License
Feel free to follow the name line with additional EMail text as desired.
=-=
-=-
Calc bug reports and calc bug fixes should be sent to:
@@ -93,7 +93,7 @@ Calc is covered by the GNU Lesser General Public License
You may have additional words in your subject line.
=-=
-=-
Calc's relationship to the GNU Lesser General Public License
------------------------------------------------------------
@@ -149,7 +149,7 @@ Calc's relationship to the GNU Lesser General Public License
except for the exception files explicitly listed in the ``Calc
copyrights and exception files'' section below.
=-=
-=-
Calc copyrights and exception files
-----------------------------------
@@ -165,6 +165,7 @@ Calc copyrights and exception files
Copyright (C) year Ernest Bowen and Landon Curt Noll
Copyright (C) year Ernest Bowen
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:
@@ -188,7 +189,7 @@ Calc copyrights and exception files
And because one may freely distribute the LGPL covered files, the
entire calc source may be freely used and distributed.
=-=
-=-
General Copyleft and License info
---------------------------------
@@ -202,7 +203,7 @@ General Copyleft and License info
http://www.gnu.org/copyleft/lesser.html
http://www.gnu.org/copyleft/lesser.txt
=-=
-=-
Why calc did not use the GNU General Public License
---------------------------------------------------

View File

@@ -1,8 +1,8 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
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
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
the version number 2.1.]
Preamble
Preamble
The licenses for most software are designed to take away your
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
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
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
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
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
and reuse of software generally.
NO WARRANTY
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
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
DAMAGES.
END OF TERMS AND CONDITIONS
END OF TERMS AND CONDITIONS
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
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.
@@ -500,5 +501,3 @@ necessary. Here is a sample; alter the names:
Ty Coon, President of Vice
That's all there is to it!

330
Makefile
View File

@@ -4,7 +4,7 @@
#
########################################################################
# Gnu makefile: # This is a Gnu make makefile. If your make does not #
# Gnu makefile: # understand this makefilkke format, then edit and use #
# Gnu makefile: # understand this makefile format, then edit and use #
# Gnu makefile: # Makefile.simple instead of this Makefile. #
########################################################################
#
@@ -12,12 +12,12 @@
#
# NOTE: This is NOT the calc rpm Makefile. This Makefile is a generic
# Makefile for the people who build calc from the bzip2-ed tarball.
# Without modification, it not assume the system has readline, ncurses
# or less. It compiles with gcc -O3 -g3 as well. You can change all
# this by modifying the Makefile variables below.
# Without modification, it does not assume the system has readline,
# ncurses or less. It compiles with gcc -O3 -g3 as well. You can
# change all this by modifying the Makefile variables below.
#
# NOTE: You might want use the READLINE facility if your system
# has the GNU readline headers and libaraies:
# has the GNU readline headers and libraries:
#
# USE_READLINE= -DUSE_READLINE
# READLINE_LIB= -lreadline
@@ -26,7 +26,7 @@
# Copyright (C) 1999-2008 Landon Curt Noll
#
# Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License
# the terms of 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
@@ -39,8 +39,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
#
MAKEFILE_REV= $$Revision: 30.50 $$
# @(#) $Id: Makefile.ship,v 30.50 2013/05/05 10:21:52 chongo Exp $
MAKEFILE_REV= $$Revision: 30.60 $$
# @(#) $Id: Makefile.ship,v 30.60 2013/09/27 08:55:27 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/Makefile.ship,v $
#
# Under source code control: 1990/02/15 01:48:41
@@ -61,7 +61,7 @@ MAKEFILE_REV= $$Revision: 30.50 $$
#
# make ...__optional_arguments_... target=value
# Try uname -s if the target was not alreadhy set on the make command line
# Try uname -s if the target was not already set on the make command line
#
ifeq ($(target),)
target=$(shell uname -s 2>/dev/null)
@@ -101,13 +101,13 @@ TERMCONTROL=
# If you do not have vsprintf(), then calc will try sprintf() and hope
# for the best.
#
# A simular problem occurs if your system does not have a vsnprintf()
# A similar problem occurs if your system does not have a vsnprintf()
# function. This function is like the vsprintf() function except that
# there is an extra second argument that controls the maximum size
# string that is produced.
#
# If HAVE_VSPRINTF is empty, this Makefile will run the have_stdvs.c and/or
# have_varvs.c program to determine if vsprintf() is supported. If
# have_varvs.c program to determine if vsprintf() is supported. If
# HAVE_VSPRINTF is set to -DDONT_HAVE_VSPRINTF then calc will hope that
# sprintf() will work.
#
@@ -243,13 +243,13 @@ INODE_BITS=
#INODE_BITS= 64
# Determine if we have an off_t which one can perform arithmetic operations,
# assignments and comparisons. On some systems off_t is some sort of union
# assignments and comparisons. On some systems off_t is some sort of union
# or struct.
#
# If HAVE_OFFSCL is empty, this Makefile will run the have_offscl program
# to determine if off_t is a scalar. If HAVE_OFFSCL is set to the value
# -DOFF_T_NON_SCALAR when calc will assume that off_t some sort of
# union or struct which.
# union or struct.
#
# If in doubt, leave HAVE_OFFSCL empty and this Makefile will figure it out.
#
@@ -257,7 +257,7 @@ HAVE_OFFSCL=
#HAVE_OFFSCL= -DOFF_T_NON_SCALAR
# Determine if we have an fpos_t which one can perform arithmetic operations,
# assignments and comparisons. On some systems fpos_t is some sort of union
# assignments and comparisons. On some systems fpos_t is some sort of union
# or struct. Some systems do not have an fpos_t and long is as a file
# offset instead.
#
@@ -265,7 +265,7 @@ HAVE_OFFSCL=
# to determine if off_t is a scalar, or if there is no off_t and long
# (a scalar) should be used instead. If HAVE_POSSCL is set to the value
# -DFILEPOS_NON_SCALAR when calc will assume that fpos_t exists and is
# some sort of union or struct which.
# some sort of union or struct.
#
# If in doubt, leave HAVE_POSSCL empty and this Makefile will figure it out.
#
@@ -286,7 +286,7 @@ HAVE_CONST=
# Determine if we have uid_t
#
# If HAVE_UID_T is empty, this Makefile will run the have_uid_t program
# to determine if const is supported. If HAVE_UID_T is set to -DHAVE_NO_UID_T,
# to determine if uid_t is supported. If HAVE_UID_T is set to -DHAVE_NO_UID_T,
# then calc will treat uid_t as an unsigned short. This only matters if
# $HOME is not set and calc must look up the home directory in /etc/passwd.
#
@@ -313,7 +313,7 @@ HAVE_NEWSTR=
# If HAVE_MEMMOVE is empty, this Makefile will run the have_memmv program
# to determine if memmove() is supported. If HAVE_MEMMOVE is set to
# -DHAVE_NO_MEMMOVE, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the memory move function that does correct overlapping memory moves.
#
# If in doubt, leave HAVE_MEMMOVE empty and this Makefile will figure it out.
#
@@ -322,10 +322,10 @@ HAVE_MEMMOVE=
# Determine if we have ustat()
#
# If HAVE_USTAT is empty, this Makefile will run the have_memmv program
# to determine if ustat() is supported. If HAVE_USTAT is set to
# If HAVE_USTAT is empty, this Makefile will run the have_ustat program
# to determine if ustat() is supported. If HAVE_USTAT is set to
# -DHAVE_NO_USTAT, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the ustat() function that gets file system statistics.
#
# Select HAVE_USTAT= -DHAVE_NO_USTAT for DJGPP.
#
@@ -336,10 +336,10 @@ HAVE_USTAT=
# Determine if we have getsid()
#
# If HAVE_GETSID is empty, this Makefile will run the have_memmv program
# If HAVE_GETSID is empty, this Makefile will run the have_getsid program
# to determine if getsid() is supported. If HAVE_GETSID is set to
# -DHAVE_NO_GETSID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the getsid() function that gets session ID.
#
# Select HAVE_GETSID= -DHAVE_NO_GETSID for DJGPP.
#
@@ -350,10 +350,10 @@ HAVE_GETSID=
# Determine if we have getpgid()
#
# If HAVE_GETPGID is empty, this Makefile will run the have_memmv program
# If HAVE_GETPGID is empty, this Makefile will run the have_getpgid program
# to determine if getpgid() is supported. If HAVE_GETPGID is set to
# -DHAVE_NO_GETPGID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the getpgid() function that sets the process group ID.
#
# Select HAVE_GETPGID= -DHAVE_NO_GETPGID for DJGPP.
#
@@ -364,10 +364,10 @@ HAVE_GETPGID=
# Determine if we have clock_gettime()
#
# If HAVE_GETTIME is empty, this Makefile will run the have_memmv program
# to determine if clock_gettime() is supported. If HAVE_GETTIME is set to
# If HAVE_GETTIME is empty, this Makefile will run the have_gettime program
# to determine if clock_gettime() is supported. If HAVE_GETTIME is set to
# -DHAVE_NO_GETTIME, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the clock_gettime() function.
#
# Select HAVE_GETTIME= -DHAVE_NO_GETTIME for DJGPP.
#
@@ -378,10 +378,10 @@ HAVE_GETTIME=
# Determine if we have getprid()
#
# If HAVE_GETPRID is empty, this Makefile will run the have_memmv program
# If HAVE_GETPRID is empty, this Makefile will run the have_getprid program
# to determine if getprid() is supported. If HAVE_GETPRID is set to
# -DHAVE_NO_GETPRID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the getprid() function.
#
# Select HAVE_GETPRID= -DHAVE_NO_GETPRID for DJGPP.
#
@@ -392,7 +392,7 @@ HAVE_GETPRID=
# Determine if we have the /dev/urandom
#
# HAVE_URANDOM_H= let the Makefile look /dev/urandom
# HAVE_URANDOM_H= let the Makefile look for /dev/urandom
# HAVE_URANDOM_H= YES assume that /dev/urandom exists
# HAVE_URANDOM_H= NO assume that /dev/urandom does not exist
#
@@ -406,10 +406,10 @@ HAVE_URANDOM_H=
# Determine if we have getrusage()
#
# If HAVE_GETRUSAGE is empty, this Makefile will run the have_memmv program
# If HAVE_GETRUSAGE is empty, this Makefile will run the have_rusage program
# to determine if getrusage() is supported. If HAVE_GETRUSAGE is set to
# -DHAVE_NO_GETRUSAGE, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the getrusage() function.
#
# If in doubt, leave HAVE_GETRUSAGE empty and this Makefile will figure it out.
#
@@ -418,10 +418,10 @@ HAVE_GETRUSAGE=
# Determine if we have strdup()
#
# If HAVE_STRDUP is empty, this Makefile will run the have_memmv program
# If HAVE_STRDUP is empty, this Makefile will run the have_strdup program
# to determine if strdup() is supported. If HAVE_STRDUP is set to
# -DHAVE_NO_STRDUP, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the strdup() function.
#
# If in doubt, leave HAVE_STRDUP empty and this Makefile will figure it out.
#
@@ -429,10 +429,10 @@ HAVE_STRDUP=
#HAVE_STRDUP= -DHAVE_NO_STRDUP
# Some architectures such as Sparc do not allow one to access 32 bit values
# that are not alligned on a 32 bit boundary.
# that are not aligned on a 32 bit boundary.
#
# The Dec Alpha running OSF/1 will produce alignment error messages when
# align32.c tries to figure out if alignment is needed. Use the
# align32.c tries to figure out if alignment is needed. Use the
# ALIGN32= -DMUST_ALIGN32 to force alignment and avoid such error messages.
#
# ALIGN32= let align32.c figure out if alignment is needed
@@ -587,7 +587,7 @@ HAVE_UNUSED=
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# Where to install calc realted things
# Where to install calc related things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
@@ -672,7 +672,7 @@ SCRIPTDIR= ${BINDIR}/cscript
# T - top level directory under which calc will be installed
#
# The calc install is performed under ${T}, the calc build is
# performed under /. The purpose for ${T} is to allow someone
# performed under /. The purpose for ${T} is to allow someone
# to install calc somewhere other than into the system area.
#
# For example, if:
@@ -690,7 +690,7 @@ SCRIPTDIR= ${BINDIR}/cscript
# calc binary files: /var/tmp/testing/usr/bin
# calc link library: /var/tmp/testing/usr/lib
# calc help, .cal ...: /var/tmp/testing/usr/share/calc
# ... etc ... /var/tmp/testing/...
# ... etc ... /var/tmp/testing/...
#
# If ${T} is empty, calc is installed under /, which is the same
# top of tree for which it was built. If ${T} is non-empty, then
@@ -754,12 +754,12 @@ CATEXT= 1
# If NROFF is non-empty, then
#
# ${NROFF} ${NROFF_ARG} calc.1 > ${CATDIR}/calc.${CATEXT}
# is used to built and install the cat page
# is used to build and install the cat page
#
# else (NROFF is empty)
#
# ${MANMAKE} calc.1 ${CATDIR}
# is used to built and install the cat page
# is used to build and install the cat page
# else
#
# The cat page is not built or installed
@@ -782,8 +782,8 @@ CATMODE= 0444
# By default, custom builtin functions may only be executed if calc
# is given the -C option. This is because custom builtin functions
# may invoke non-standard or non-portable code. One may completely
# disable custom builtin functions by not compiling any of code
# may invoke non-standard or non-portable code. One may completely
# disable custom builtin functions by not compiling any custom code
#
# ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given
# ALLOW_CUSTOM= # disable custom even if -C is given
@@ -794,7 +794,7 @@ ALLOW_CUSTOM= -DCUSTOM
#ALLOW_CUSTOM=
# If the $CALCPATH environment variable is not defined, then the following
# path will be search for calc resource file routines.
# path will be searched for calc resource file routines.
#
# Select CALCPATH= .;./cal;~/.cal;${CALC_SHAREDIR};${CUSTOMCALDIR} for DJGPP.
#
@@ -809,7 +809,7 @@ endif
#endif /* end of skip for non-Gnu makefiles */
# If the $CALCRC environment variable is not defined, then the following
# path will be search for calc resource files.
# path will be searched for calc resource files.
#
# Select CALCRC= ${CALC_SHAREDIR}/startup;~/.calcrc;./.calcinit for DJGPP.
#
@@ -817,7 +817,7 @@ CALCRC= ${CALC_SHAREDIR}/startup:~/.calcrc:./.calcinit
#CALCRC= ${CALC_SHAREDIR}/startup;~/.calcrc;./.calcinit
# Determine of the GNU-readline facility will be used instead of the
# built-in calc binding method.
# builtin calc binding method.
#
# USE_READLINE= Do not use GNU-readline, use calc bindings
# USE_READLINE= -DUSE_READLINE Use GNU-readline, do not use calc bindings
@@ -831,7 +831,7 @@ CALCRC= ${CALC_SHAREDIR}/startup:~/.calcrc:./.calcinit
# READLINE_INCLUDE Where the readline include files reside
# (leave blank if they are /usr/include/readline)
#
# NOTE: The GNU-readline code is not shipped with calc. You must have
# NOTE: The GNU-readline code is not shipped with calc. You must have
# the appropriate headers and link libs installed on your system in
# order to use it.
#
@@ -908,9 +908,9 @@ RANLIB=ranlib
#RANLIB=:
# Normally certain files depend on the Makefile. If the Makefile is
# changed, then certain steps should be redone. If MAKE_FILE is
# changed, then certain steps should be redone. If MAKE_FILE is
# set to Makefile, then these files will depend on Makefile. If
# MAKE_FILE is empty, then they wont.
# MAKE_FILE is empty, then they won't.
#
# If in doubt, set MAKE_FILE to Makefile
#
@@ -971,9 +971,9 @@ CALC_ENV= CALCPATH=./cal LD_LIBRARY_PATH=.
#
# ${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.
# to create directories. Normally this amounts to using mkdir -p dir ...
# Some older systems may not have mkdir -p. If your system does not
# have 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
@@ -981,8 +981,8 @@ CALC_ENV= CALCPATH=./cal LD_LIBRARY_PATH=.
MKDIR_ARG= -p
#MKDIR_ARG=
# Some out of date operating systems require / want an executable to
# end with a certain file extension. Some compile systems such as
# Some out of date operating systems require/want an executable to
# end with a certain file extension. Some compiler systems such as
# windoz build calc as calc.exe. The EXT variable is used to denote
# the extension required by such. Note that Cygwin requires EXT to be
# the same as Linux/Un*x/GNU, even though it runs under windoz.
@@ -997,7 +997,7 @@ EXT=
# The default calc versions
#
VERSION= 2.12.4.7
VERSION= 2.12.4.13
VERS= 2.12.4
VER= 2.12
VE= 2
@@ -1048,11 +1048,11 @@ STRIP= strip
# Extra compiling and linking flags
#
# EXTRA_CFLAGS are flags given to ${CC} when compiling C files
# EXTRA_LDFLAGS are flags given to ${CC} when linking progs
# EXTRA_LDFLAGS are flags given to ${CC} when linking programs
#
# Both CFLAGS and LDFLAGS are left blank in this Makefile by
# default so that users may use them on the make command line
# to always the way that C is compiled and files are linked
# to always set the way that C is compiled and files are linked
# respectively. For example:
#
# make all EXTRA_CFLAGS="-DMAGIC" EXTRA_LDFLAGS="-lmagic"
@@ -1060,13 +1060,13 @@ STRIP= strip
# NOTE: These should be left blank in this Makefile to make it
# easier to add stuff on the command line. If you want to
# to change the way calc is compiled by this Makefile, change
# the appropirate host target section below or a flag above.
# the appropriate host target section below or a flag above.
#
EXTRA_CFLAGS=
EXTRA_LDFLAGS=
# COMMON_CFLAGS are the common ${CC} flags used for all progs, both
# intermediate and final calc and calc related progs
# COMMON_CFLAGS are the common ${CC} flags used for all programs, both
# intermediate and final calc and calc related programs
#
#if 0 /* start of skip for non-Gnu makefiles */
ifdef ALLOW_CUSTOM
@@ -1078,8 +1078,8 @@ COMMON_CFLAGS= -DCALC_SRC -UCUSTOM ${CCWARN} ${CCMISC} ${EXTRA_CFLAGS}
endif
#endif /* end of skip for non-Gnu makefiles */
# COMMON_LDFLAGS are the common flags used for linking all progs, both
# intermediate and final calc and calc related progs
# COMMON_LDFLAGS are the common flags used for linking all programs, both
# intermediate and final calc and calc related programs
#
COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
@@ -1097,16 +1097,16 @@ COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
# BLD_TYPE= calc-static-only
#
# 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
# 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
#
# 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
# 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
#
# NOTE: The above 4 values are unused if BLD_TYPE= calc-dynamic-only
@@ -1119,8 +1119,8 @@ COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
# to abort on warnings, then leave CCWERR blank.
# CCMISC are misc flags given to ${CC}
#
# LCC how the the C compiler is invoked on locally executed intermediate progs
# CC is how the the C compiler is invoked (with an optional Purify)
# LCC is how the C compiler is invoked on locally executed intermediate programs
# CC is how the C compiler is invoked (with an optional Purify)
#
# Specific target overrides or modifications to default values
@@ -1200,7 +1200,7 @@ CCMISC= ${DARWIN_ARCH}
LCC= MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} gcc
CC= ${PURIFY} ${LCC} ${CCWERR}
#
# Darmin dynamic shared lib filenames
# Darwin dynamic shared lib filenames
LIB_EXT:= .dylib
LIB_EXT_VERSION:= .${VERSION}${LIB_EXT}
LIB_EXT_VERS:= .${VERS}${LIB_EXT}
@@ -1403,10 +1403,10 @@ CC= ${PURIFY} ${LCC} ${CCWERR}
#
# The simple makefile forces the use of static ${CC} flags
#
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs
# ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# CFLAGS are given to ${CC} for calc programs other than intermediate programs
# ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc programs other than intermediate programs
#
ICFLAGS= ${COMMON_CFLAGS} ${CC_STATIC}
CFLAGS= ${ICFLAGS} ${CCOPT}
@@ -1506,8 +1506,8 @@ endif
# Required flags to compile C files for calc
#
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs
# ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# 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
#
@@ -1520,8 +1520,8 @@ CFLAGS= ${ICFLAGS} ${CCOPT}
# Required flags to link files for calc
#
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs
# ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc programs other than intermediate programs
#
ILDFLAGS= ${COMMON_LDFLAGS}
LDFLAGS= ${LD_DEBUG} ${ILDFLAGS}
@@ -1740,7 +1740,7 @@ CUSTOM_PASSDOWN= \
VERSION=${VERSION} \
target=${target}
# The compelte list of Makefile vars passed down to help/Makefile.
# The complete list of Makefile vars passed down to help/Makefile.
#
HELP_PASSDOWN= \
AR=${AR} \
@@ -1777,7 +1777,7 @@ HELP_PASSDOWN= \
TOUCH=${TOUCH} \
TRUE=${TRUE}
# The compelte list of Makefile vars passed down to cal/Makefile.
# The complete list of Makefile vars passed down to cal/Makefile.
#
CAL_PASSDOWN= \
AR=${AR} \
@@ -1805,7 +1805,7 @@ CAL_PASSDOWN= \
TOUCH=${TOUCH} \
TRUE=${TRUE}
# The compelte list of Makefile vars passed down to cscript/Makefile.
# The complete list of Makefile vars passed down to cscript/Makefile.
#
CSCRIPT_PASSDOWN= \
AR=${AR} \
@@ -1854,7 +1854,7 @@ DISTLIST= ${C_SRC} ${H_SRC} ${MAKE_FILE} BUGS CHANGES LIBRARY README \
README.WINDOWS calc.man HOWTO.INSTALL ${UTIL_MISC_SRC} ${LICENSE} \
sample.README calc.spec.in rpm.mk
# These files are used to make (but not built) a calc .a link library
# These files are used to make (but not build) a calc .a link library
#
CALCLIBLIST= ${LIBSRC} ${UTIL_C_SRC} ${LIB_H_SRC} ${MAKE_FILE} \
${UTIL_MISC_SRC} BUGS CHANGES LIBRARY
@@ -1875,7 +1875,7 @@ CALC_STATIC_LIBS= libcalc.a
endif
#endif /* end of skip for non-Gnu makefiles */
# Libaraies created and used to build calc
# Libraries created and used to build calc
#
#if 0 /* start of skip for non-Gnu makefiles */
ifdef ALLOW_CUSTOM
@@ -1887,7 +1887,7 @@ CALC_DYNAMIC_LIBS= libcalc${LIB_EXT_VERSION}
endif
#endif /* end of skip for non-Gnu makefiles */
# Symlinks of dymanic shared libraries
# Symlinks of dynamic shared libraries
#
#if 0 /* start of skip for non-Gnu makefiles */
ifdef ALLOW_CUSTOM
@@ -1903,7 +1903,7 @@ SYM_DYNAMIC_LIBS= libcalc${LIB_EXT_VER} libcalc${LIB_EXT_VE} libcalc${LIB_EXT} \
endif
#endif /* end of skip for non-Gnu makefiles */
# list of sample programs to that need to be built to satisfy sample rule
# list of sample programs that need to be built to satisfy sample rule
#
# NOTE: The ${SAMPLE_TARGETS} and ${SAMPLE_STATIC_TARGETS} are built but
# not installed at this time.
@@ -1914,7 +1914,7 @@ endif
SAMPLE_TARGETS= sample_rand${EXT} sample_many${EXT}
SAMPLE_STATIC_TARGETS= sample_rand-static${EXT} sample_many-static${EXT}
# list of cscript programs to that need to be built to satisfy cscript/.all
# list of cscript programs that need to be built to satisfy cscript/.all
#
# NOTE: This list MUST be coordinated with the ${CSCRIPT_TARGETS} variable
# in the cscript/Makefile
@@ -1977,7 +1977,7 @@ calc-dynamic-only: ${DYNAMIC_FIRST_TARGETS} ${EARLY_TARGETS} \
echo " ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
echo " ${MAKE} -f ${MAKE_FILE} $$r BLD_TYPE=$$r" 1>&2; \
echo "" 1>&2; \
echo "NOTE: It is a very good idea to c first clobber any" 1>&2; \
echo "NOTE: It is a very good idea to first clobber any" 1>&2; \
echo " previously built .o, libs and executables" 1>&2; \
echo " before switching to $$r!" 1>&2; \
echo "" 1>&2; \
@@ -1993,7 +1993,7 @@ calc-dynamic-only: ${DYNAMIC_FIRST_TARGETS} ${EARLY_TARGETS} \
echo " ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
echo " ${MAKE} -f ${MAKE_FILE} $$r BLD_TYPE=$$r" 1>&2; \
echo "" 1>&2; \
echo "to clean out any previously build static files." 1>&2; \
echo "to clean out any previously built static files." 1>&2; \
echo "" 1>&2; \
echo "=== aborting make ===" 1>&2; \
exit 2; \
@@ -2023,7 +2023,7 @@ calc-static-only: ${STATIC_FIRST_TARGETS} ${EARLY_TARGETS} \
echo " ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
echo " ${MAKE} -f ${MAKE_FILE} $$r BLD_TYPE=$$r" 1>&2; \
echo "" 1>&2; \
echo "NOTE: It is a very good idea to c first clobber any" 1>&2; \
echo "NOTE: It is a very good idea to first clobber any" 1>&2; \
echo " previously built .o, libs and executables" 1>&2; \
echo " before switching to $$r!" 1>&2; \
echo "" 1>&2; \
@@ -2039,7 +2039,7 @@ calc-static-only: ${STATIC_FIRST_TARGETS} ${EARLY_TARGETS} \
echo " ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
echo " ${MAKE} -f ${MAKE_FILE} $$r BLD_TYPE=$$r" 1>&2; \
echo "" 1>&2; \
echo "to clean out any previously build dynamic files." 1>&2; \
echo "to clean out any previously built dynamic files." 1>&2; \
echo "" 1>&2; \
echo "=== aborting make ===" 1>&2; \
exit 4; \
@@ -2135,8 +2135,8 @@ seed.o: seed.c no_implicit.arg ${MAKE_FILE}
###
#
# The next set of rules cause the .h files BUILD_H_SRC files to be built
# according tot he system and the Makefile variables above. The hsrc rule
# is a convenient rule to invoke to built all of the BUILD_H_SRC.
# according to the system and the Makefile variables above. The hsrc rule
# is a convenient rule to invoke to build all of the BUILD_H_SRC.
#
# We add in the BUILD_C_SRC files because they are similar to the
# BUILD_H_SRC files in terms of the build process.
@@ -2552,8 +2552,10 @@ have_fpos.h: have_fpos.c ${MAKE_FILE}
${Q} echo '' >> have_fpos.h
${Q} echo '/* do we have fgetpos & fsetpos functions? */' >> have_fpos.h
${Q} ${RM} -f have_fpos.o have_fpos${EXT}
-${Q} ${LCC} ${HAVE_FPOS} ${ICFLAGS} have_fpos.c -c >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_fpos.o -o have_fpos${EXT} >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${HAVE_FPOS} ${ICFLAGS} have_fpos.c -c \
>/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_fpos.o -o have_fpos${EXT} \
>/dev/null 2>&1; ${TRUE}
-${Q} ${SHELL} -c "./have_fpos${EXT} > fpos_tmp 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}
-${Q} if [ -s fpos_tmp ]; then \
@@ -2638,8 +2640,9 @@ fposval.h: fposval.c have_fpos.h have_fpos_pos.h have_offscl.h have_posscl.h \
${Q} echo '/* what are our file position & size types? */' >> fposval.h
${Q} ${RM} -f fposval.o fposval${EXT}
-${Q} ${LCC} ${ICFLAGS} ${FPOS_BITS} ${OFF_T_BITS} \
${DEV_BITS} ${INODE_BITS} fposval.c -c >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} fposval.o -o fposval${EXT} >/dev/null 2>&1; ${TRUE}
${DEV_BITS} ${INODE_BITS} fposval.c -c >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} fposval.o -o fposval${EXT} >/dev/null \
2>&1; ${TRUE}
${Q} ${SHELL} -c "./fposval${EXT} fposv_tmp >> fposval.h 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}
${Q} echo '' >> fposval.h
@@ -2673,7 +2676,8 @@ have_const.h: have_const.c ${MAKE_FILE}
${Q} ${RM} -f have_const.o have_const${EXT}
-${Q} ${LCC} ${ICFLAGS} ${HAVE_CONST} have_const.c -c \
>/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_const.o -o have_const${EXT} >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_const.o -o have_const${EXT} \
>/dev/null 2>&1; ${TRUE}
-${Q} ${SHELL} -c "./have_const${EXT} > const_tmp 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}
-${Q} if [ -s const_tmp ]; then \
@@ -2807,7 +2811,8 @@ align32.h: align32.c longbits.h have_unistd.h ${MAKE_FILE}
${RM} -f align32.o align32${EXT}; \
${LCC} ${ICFLAGS} ${ALIGN32} align32.c -c >/dev/null 2>&1; \
${LCC} ${ILDFLAGS} align32.o -o align32${EXT} >/dev/null 2>&1; \
${SHELL} -c "./align32${EXT} >align32_tmp 2>/dev/null" >/dev/null 2>&1; \
${SHELL} -c \
"./align32${EXT} >align32_tmp 2>/dev/null" >/dev/null 2>&1; \
if [ -s align32_tmp ]; then \
${CAT} align32_tmp >> align32.h; \
else \
@@ -2848,7 +2853,8 @@ have_uid_t.h: have_uid_t.c have_unistd.h ${MAKE_FILE}
${Q} ${RM} -f have_uid_t.o have_uid_t${EXT}
-${Q} ${LCC} ${ICFLAGS} ${HAVE_UID_T} have_uid_t.c -c \
>/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_uid_t.o -o have_uid_t${EXT} >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_uid_t.o -o have_uid_t${EXT} \
>/dev/null 2>&1; ${TRUE}
-${Q} ${SHELL} -c "./have_uid_t${EXT} > uid_tmp 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}
-${Q} if [ -s uid_tmp ]; then \
@@ -3036,7 +3042,8 @@ have_getpgid.h: have_getpgid.c ${MAKE_FILE}
${Q} ${RM} -f getpgid_tmp have_getpgid.h
${Q} echo 'forming have_getpgid.h'
${Q} echo '/*' > have_getpgid.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getpgid.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_getpgid.h
${Q} echo ' */' >> have_getpgid.h
${Q} echo '' >> have_getpgid.h
${Q} echo '' >> have_getpgid.h
@@ -3076,7 +3083,8 @@ have_gettime.h: have_gettime.c ${MAKE_FILE}
${Q} ${RM} -f gettime_tmp have_gettime.h
${Q} echo 'forming have_gettime.h'
${Q} echo '/*' > have_gettime.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_gettime.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_gettime.h
${Q} echo ' */' >> have_gettime.h
${Q} echo '' >> have_gettime.h
${Q} echo '' >> have_gettime.h
@@ -3116,7 +3124,8 @@ have_getprid.h: have_getprid.c ${MAKE_FILE}
${Q} ${RM} -f getprid_tmp have_getprid.h
${Q} echo 'forming have_getprid.h'
${Q} echo '/*' > have_getprid.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getprid.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_getprid.h
${Q} echo ' */' >> have_getprid.h
${Q} echo '' >> have_getprid.h
${Q} echo '' >> have_getprid.h
@@ -3156,7 +3165,8 @@ have_urandom.h: ${MAKE_FILE}
${Q} ${RM} -f have_urandom.h
${Q} echo 'forming have_urandom.h'
${Q} echo '/*' > have_urandom.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_urandom.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_urandom.h
${Q} echo ' */' >> have_urandom.h
${Q} echo '' >> have_urandom.h
${Q} echo '' >> have_urandom.h
@@ -3192,7 +3202,8 @@ have_rusage.h: have_rusage.c ${MAKE_FILE}
${Q} ${RM} -f rusage_tmp have_rusage.h
${Q} echo 'forming have_rusage.h'
${Q} echo '/*' > have_rusage.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_rusage.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_rusage.h
${Q} echo ' */' >> have_rusage.h
${Q} echo '' >> have_rusage.h
${Q} echo '' >> have_rusage.h
@@ -3283,14 +3294,16 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
${Q} ${RM} -f have_stdvs.o have_stdvs${EXT}
-${Q} ${LCC} ${ICFLAGS} ${HAVE_VSPRINTF} have_stdvs.c -c \
>/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_stdvs.o -o have_stdvs${EXT} >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_stdvs.o -o have_stdvs${EXT} \
>/dev/null 2>&1; ${TRUE}
-${Q} if ./have_stdvs${EXT} >>args.h 2>/dev/null; then \
${TOUCH} have_args.sh; \
else \
${TRUE}; \
fi
-${Q} if [ ! -f have_args.sh ] && [ X"${HAVE_VSPRINTF}" = X ]; then \
${RM} -f have_stdvs.o have_stdvs${EXT} have_varvs.o have_varvs${EXT}; \
${RM} -f have_stdvs.o have_stdvs${EXT} have_varvs.o; \
${RM} -f have_varvs${EXT}; \
${LCC} ${ICFLAGS} ${HAVE_VSPRINTF} have_varvs.c -c \
2>/dev/null; \
${LCC} ${ILDFLAGS} have_varvs.o -o have_varvs${EXT} 2>/dev/null; \
@@ -3314,7 +3327,8 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
${Q} echo '' >> args.h
${Q} echo '' >> args.h
${Q} echo '#endif /* !__ARGS_H__ */' >> args.h
${Q} ${RM} -f have_stdvs.o have_varvs.o have_varvs${EXT} have_args.sh core
${Q} ${RM} -f have_stdvs.o have_varvs.o have_varvs${EXT} have_args.sh
${Q} ${RM} -f core
${Q} echo 'args.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
@@ -3388,7 +3402,8 @@ no_implicit.arg: no_implicit.c ${MAKE_FILE}
else \
${LCC} -Wno-implicit ${ICFLAGS} -DHAVE_NO_IMPLICIT \
no_implicit.c -c >/dev/null 2>&1; \
${LCC} ${ILDFLAGS} no_implicit.o -o no_implicit${EXT} >/dev/null 2>&1; \
${LCC} ${ILDFLAGS} no_implicit.o -o no_implicit${EXT} \
>/dev/null 2>&1; \
${SHELL} -c "./no_implicit${EXT} > no_implicit.arg 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}; \
fi
@@ -3577,7 +3592,7 @@ endif
###
#
# building calc-static and static lib*.a libraires
# building calc-static and static lib*.a libraries
#
###
@@ -3616,10 +3631,10 @@ sample_many-static${EXT}: sample_many.o ${CALC_STATIC_LIBS} ${MAKE_FILE}
###
#
# Home grown make dependency rules. Your system make not support
# Homegrown make dependency rules. Your system may not support
# or have the needed tools. You can ignore this section.
#
# We will form a skelaton tree of *.c files containing only #include "foo.h"
# We will form a skeleton tree of *.c files containing only #include "foo.h"
# lines and .h files containing the same lines surrounded by multiple include
# prevention lines. This allows us to build a static depend list that will
# satisfy all possible cpp symbol definition combinations.
@@ -3673,7 +3688,8 @@ depend: custom/Makefile hsrc
${Q} echo forming new ${MAKE_FILE}
${Q} ${RM} -f ${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/makedep.out >> ${MAKE_FILE}
${Q} ${RM} -rf skel
-${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \
@@ -3728,21 +3744,21 @@ h_list:
# 1 level version string.
#
# version:
# This rule simply echos the value found in this makefile.
# This rule simply echoes the value found in this makefile.
# This rule produces the full version string. Note that the
# full version could be 4 or 3 levels long depending on the
# minor patch number.
#
# vers:
# This rule simply echos the value found in this makefile.
# This rule simply echoes the value found in this makefile.
# This rule produces only a 3 level version string.
#
# ver:
# This rule simply echos the value found in this makefile.
# This rule simply echoes the value found in this makefile.
# This rule produces only a 2 level version string.
#
# ve:
# This rule simply echos the value found in this makefile.
# This rule simply echoes the value found in this makefile.
# This rule produces only a 1 level version string.
#
###
@@ -3860,7 +3876,7 @@ custom/Makefile.simple: custom/Makefile
#
# Doing a 'make chk' will cause only the context around interesting
# (and error) messages to be printed. Unlike 'make check', this
# rule does not cause things to be built. I.e., the all rule is
# rule does not cause things to be built. i.e., the all rule is
# not invoked.
#
###
@@ -4056,34 +4072,38 @@ env:
mkdebug: env version.c
@echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
@echo '=-=-=-=-= Determining the source version =-=-=-=-='
@echo '=-=-=-= Determining the source version =-=-=-='
@${MAKE} -f Makefile Q= V=@ ver_calc${EXT}
-@./ver_calc${EXT}
@echo '=-=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ all =-=-=-=-='
@echo '=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ all =-=-=-='
@${MAKE} -f Makefile Q= V=@ all
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-=-= Determining the binary version =-=-=-=-='
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-= Determining the binary version =-=-=-='
-@./calc${EXT} -e -q -v
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
debug: env
@echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
@echo '=-=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ clobber =-=-=-=-='
@echo '=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ clobber =-=-=-='
@${MAKE} -f Makefile Q= V=@ clobber
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-=-= Determining the source version =-=-=-=-='
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ all =-=-=-='
@echo '=-=-= this may take a bit of time =-=-='
@${MAKE} -f Makefile Q= V=@ all
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-= Determining the source version =-=-=-='
@${MAKE} -f Makefile Q= V=@ ver_calc${EXT}
-@./ver_calc${EXT}
@echo '=-=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ all =-=-=-=-='
@${MAKE} -f Makefile Q= V=@ all
@echo '=-=-=-=-= Determining the binary version =-=-=-=-='
-@./calc${EXT} -e -q -v
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ chk =-=-=-=-='
@echo '=-=-=-=-= this may take a while =-=-=-=-='
@${MAKE} -f Makefile Q= V=@ chk
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo -n '=-=-=-= Print #defile values if custom functions '
@echo 'are allowed =-=-=-='
-@./calc${EXT} -e -q -C 'print custom("sysinfo", 2);'
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ check =-=-=-='
@echo '=-=-= this may take a while =-=-='
@${MAKE} -f Makefile Q= V=@ check
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
###
@@ -4148,7 +4168,8 @@ rpm-unhide-static:
rpm-chk-static:
${V} echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
${CALC_ENV} ./calc-static${EXT} -d -q read regress 2>&1 | ${AWK} -f check.awk
${CALC_ENV} ./calc-static${EXT} -d -q read regress 2>&1 | \
${AWK} -f check.awk
${V} echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
rpm-clean-static:
@@ -4193,7 +4214,7 @@ inst_files: ${MAKE_FILE} help/Makefile cal/Makefile custom/Makefile \
${Q} LANG=C ${SORT} -u inst_files -o inst_files
${V} echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
# The olduninstall rule will remove calc files from the older, histroic
# The olduninstall rule will remove calc files from the older, historic
# locations under the /usr/local directory. If you are using the
# new default values for ${BINDIR}, ${CALC_SHAREDIR}, ${INCDIR} and ${LIBDIR}
# then you can use this rule to clean out the older calc stuff under
@@ -4312,7 +4333,7 @@ clobber: custom/Makefile clean
# install everything
#
# NOTE: Keep the uninstall rule in reverse order to the install rule
# NOTE: Keep the uninstall rule in the reverse order of the install rule
#
install: custom/Makefile ${LIB_H_SRC} ${BUILD_H_SRC} calc.1 all
${V} echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
@@ -4547,7 +4568,8 @@ endif
continue; \
fi; \
${RM} -f tmp; \
${SED} -e 's/^\(#[ ]*include[ ][ ]*\)"/\1"calc\//' $$i > tmp; \
${SED} -e 's/^\(#[ ]*include[ ][ ]*\)"/\1"calc\//' \
$$i > tmp; \
if ${CMP} -s tmp ${T}${CALC_INCDIR}/$$i; then \
${TRUE}; \
else \
@@ -4618,7 +4640,7 @@ endif
# Try to remove everything that was installed
#
# NOTE: Keep the uninstall rule in reverse order to the install rule
# NOTE: Keep the uninstall rule in the reverse order of the install rule
#
uninstall: custom/Makefile
${V} echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
@@ -4670,7 +4692,7 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}" ]; then \
${RM} -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}"; \
if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}"; \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}";\
else \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}"; \
fi; \
@@ -4678,7 +4700,8 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}" ]; then \
${RM} -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}"; \
if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}"; \
echo -n "cannot uninstall "; \
echo "${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}"; \
else \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}"; \
fi; \
@@ -4686,7 +4709,8 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}" ]; then \
${RM} -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}"; \
if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}"; \
echo \
"cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}"; \
else \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}"; \
fi; \
@@ -4694,9 +4718,10 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}" ]; then \
${RM} -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}"; \
if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}"; \
echo \
"cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}";\
else \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}"; \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}";\
fi; \
fi
-${Q} if [ -f "${T}${LIBDIR}/libcalc${LIB_EXT}" ]; then \
@@ -4734,7 +4759,8 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}" ]; then \
${RM} -f "${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}"; \
if [ -f "${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}"; \
echo -n "cannot uninstall " \
echo "${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}"; \
else \
echo "uninstalled ${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}"; \
fi; \
@@ -4818,7 +4844,7 @@ strip:
done
${V} echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
# calc-symlink - setup symlinks from stardard locations into the ${T} tree
# calc-symlink - setup symlinks from standard locations into the ${T} tree
#
calc-symlink:
${Q}if [ -z "${T}" ]; then \
@@ -4852,15 +4878,20 @@ calc-symlink:
done
-${Q} if [ -n "${CATDIR}" ]; then \
if [ -e "${T}${CATDIR}/calc.${CATEXT}" ]; then \
if [ ! -L "${CATDIR}/calc.${CATEXT}" -a "${T}${CATDIR}/calc.${CATEXT}" -ef "${CATDIR}/calc.${CATEXT}" ]; then \
echo "ERROR: ${T}${CATDIR}/calc.${CATEXT} is the same as ${CATDIR}/calc.${CATEXT}" 1>&2; \
if [ ! -L "${CATDIR}/calc.${CATEXT}" -a \
"${T}${CATDIR}/calc.${CATEXT}" -ef \
"${CATDIR}/calc.${CATEXT}" ]; then \
echo -n "ERROR: ${T}${CATDIR}/calc.${CATEXT}" 2>&1; \
echo "is the same as ${CATDIR}/calc.${CATEXT}" 1>&2; \
else \
if [ -e "${CATDIR}/calc.${CATEXT}" ]; then \
echo ${RM} -f "${CATDIR}/calc.${CATEXT}"; \
${RM} -f "${CATDIR}/calc.${CATEXT}"; \
fi; \
echo ${LN} -s "${T}${CATDIR}/calc.${CATEXT}" "${CATDIR}/calc.${CATEXT}"; \
${LN} -s "${T}${CATDIR}/calc.${CATEXT}" "${CATDIR}/calc.${CATEXT}"; \
echo ${LN} -s "${T}${CATDIR}/calc.${CATEXT}" \
"${CATDIR}/calc.${CATEXT}"; \
${LN} -s "${T}${CATDIR}/calc.${CATEXT}" \
"${CATDIR}/calc.${CATEXT}"; \
fi; \
fi; \
fi
@@ -4889,7 +4920,8 @@ calc-unsymlink:
echo ${RM} -f "${CATDIR}/calc.${CATEXT}"; \
${RM} -f "${CATDIR}/calc.${CATEXT}"; \
else \
echo "Warning: ignoring non-symlink: ${CATDIR}/calc.${CATEXT}" 1>&2; \
echo "Warning: ignoring non-symlink: ${CATDIR}/calc.${CATEXT}" \
1>&2; \
fi; \
fi

View File

@@ -4,7 +4,7 @@
#
########################################################################
# Gnu makefile: # This is a Gnu make makefile. If your make does not #
# Gnu makefile: # understand this makefilkke format, then edit and use #
# Gnu makefile: # understand this makefile format, then edit and use #
# Gnu makefile: # Makefile.simple instead of this Makefile. #
########################################################################
#
@@ -12,12 +12,12 @@
#
# NOTE: This is NOT the calc rpm Makefile. This Makefile is a generic
# Makefile for the people who build calc from the bzip2-ed tarball.
# Without modification, it not assume the system has readline, ncurses
# or less. It compiles with gcc -O3 -g3 as well. You can change all
# this by modifying the Makefile variables below.
# Without modification, it does not assume the system has readline,
# ncurses or less. It compiles with gcc -O3 -g3 as well. You can
# change all this by modifying the Makefile variables below.
#
# NOTE: You might want use the READLINE facility if your system
# has the GNU readline headers and libaraies:
# has the GNU readline headers and libraries:
#
# USE_READLINE= -DUSE_READLINE
# READLINE_LIB= -lreadline
@@ -26,7 +26,7 @@
# Copyright (C) 1999-2008 Landon Curt Noll
#
# Calc is open software; you can redistribute it and/or modify it under
# the terms of the version 2.1 of the GNU Lesser General Public License
# the terms of 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
@@ -39,8 +39,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc.
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
#
MAKEFILE_REV= $$Revision: 30.50 $$
# @(#) $Id: Makefile.ship,v 30.50 2013/05/05 10:21:52 chongo Exp $
MAKEFILE_REV= $$Revision: 30.60 $$
# @(#) $Id: Makefile.ship,v 30.60 2013/09/27 08:55:27 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/Makefile.ship,v $
#
# Under source code control: 1990/02/15 01:48:41
@@ -86,13 +86,13 @@ TERMCONTROL=
# If you do not have vsprintf(), then calc will try sprintf() and hope
# for the best.
#
# A simular problem occurs if your system does not have a vsnprintf()
# A similar problem occurs if your system does not have a vsnprintf()
# function. This function is like the vsprintf() function except that
# there is an extra second argument that controls the maximum size
# string that is produced.
#
# If HAVE_VSPRINTF is empty, this Makefile will run the have_stdvs.c and/or
# have_varvs.c program to determine if vsprintf() is supported. If
# have_varvs.c program to determine if vsprintf() is supported. If
# HAVE_VSPRINTF is set to -DDONT_HAVE_VSPRINTF then calc will hope that
# sprintf() will work.
#
@@ -228,13 +228,13 @@ INODE_BITS=
#INODE_BITS= 64
# Determine if we have an off_t which one can perform arithmetic operations,
# assignments and comparisons. On some systems off_t is some sort of union
# assignments and comparisons. On some systems off_t is some sort of union
# or struct.
#
# If HAVE_OFFSCL is empty, this Makefile will run the have_offscl program
# to determine if off_t is a scalar. If HAVE_OFFSCL is set to the value
# -DOFF_T_NON_SCALAR when calc will assume that off_t some sort of
# union or struct which.
# union or struct.
#
# If in doubt, leave HAVE_OFFSCL empty and this Makefile will figure it out.
#
@@ -242,7 +242,7 @@ HAVE_OFFSCL=
#HAVE_OFFSCL= -DOFF_T_NON_SCALAR
# Determine if we have an fpos_t which one can perform arithmetic operations,
# assignments and comparisons. On some systems fpos_t is some sort of union
# assignments and comparisons. On some systems fpos_t is some sort of union
# or struct. Some systems do not have an fpos_t and long is as a file
# offset instead.
#
@@ -250,7 +250,7 @@ HAVE_OFFSCL=
# to determine if off_t is a scalar, or if there is no off_t and long
# (a scalar) should be used instead. If HAVE_POSSCL is set to the value
# -DFILEPOS_NON_SCALAR when calc will assume that fpos_t exists and is
# some sort of union or struct which.
# some sort of union or struct.
#
# If in doubt, leave HAVE_POSSCL empty and this Makefile will figure it out.
#
@@ -271,7 +271,7 @@ HAVE_CONST=
# Determine if we have uid_t
#
# If HAVE_UID_T is empty, this Makefile will run the have_uid_t program
# to determine if const is supported. If HAVE_UID_T is set to -DHAVE_NO_UID_T,
# to determine if uid_t is supported. If HAVE_UID_T is set to -DHAVE_NO_UID_T,
# then calc will treat uid_t as an unsigned short. This only matters if
# $HOME is not set and calc must look up the home directory in /etc/passwd.
#
@@ -298,7 +298,7 @@ HAVE_NEWSTR=
# If HAVE_MEMMOVE is empty, this Makefile will run the have_memmv program
# to determine if memmove() is supported. If HAVE_MEMMOVE is set to
# -DHAVE_NO_MEMMOVE, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the memory move function that does correct overlapping memory moves.
#
# If in doubt, leave HAVE_MEMMOVE empty and this Makefile will figure it out.
#
@@ -307,10 +307,10 @@ HAVE_MEMMOVE=
# Determine if we have ustat()
#
# If HAVE_USTAT is empty, this Makefile will run the have_memmv program
# to determine if ustat() is supported. If HAVE_USTAT is set to
# If HAVE_USTAT is empty, this Makefile will run the have_ustat program
# to determine if ustat() is supported. If HAVE_USTAT is set to
# -DHAVE_NO_USTAT, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the ustat() function that gets file system statistics.
#
# Select HAVE_USTAT= -DHAVE_NO_USTAT for DJGPP.
#
@@ -321,10 +321,10 @@ HAVE_USTAT=
# Determine if we have getsid()
#
# If HAVE_GETSID is empty, this Makefile will run the have_memmv program
# If HAVE_GETSID is empty, this Makefile will run the have_getsid program
# to determine if getsid() is supported. If HAVE_GETSID is set to
# -DHAVE_NO_GETSID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the getsid() function that gets session ID.
#
# Select HAVE_GETSID= -DHAVE_NO_GETSID for DJGPP.
#
@@ -335,10 +335,10 @@ HAVE_GETSID=
# Determine if we have getpgid()
#
# If HAVE_GETPGID is empty, this Makefile will run the have_memmv program
# If HAVE_GETPGID is empty, this Makefile will run the have_getpgid program
# to determine if getpgid() is supported. If HAVE_GETPGID is set to
# -DHAVE_NO_GETPGID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the getpgid() function that sets the process group ID.
#
# Select HAVE_GETPGID= -DHAVE_NO_GETPGID for DJGPP.
#
@@ -349,10 +349,10 @@ HAVE_GETPGID=
# Determine if we have clock_gettime()
#
# If HAVE_GETTIME is empty, this Makefile will run the have_memmv program
# to determine if clock_gettime() is supported. If HAVE_GETTIME is set to
# If HAVE_GETTIME is empty, this Makefile will run the have_gettime program
# to determine if clock_gettime() is supported. If HAVE_GETTIME is set to
# -DHAVE_NO_GETTIME, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the clock_gettime() function.
#
# Select HAVE_GETTIME= -DHAVE_NO_GETTIME for DJGPP.
#
@@ -363,10 +363,10 @@ HAVE_GETTIME=
# Determine if we have getprid()
#
# If HAVE_GETPRID is empty, this Makefile will run the have_memmv program
# If HAVE_GETPRID is empty, this Makefile will run the have_getprid program
# to determine if getprid() is supported. If HAVE_GETPRID is set to
# -DHAVE_NO_GETPRID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the getprid() function.
#
# Select HAVE_GETPRID= -DHAVE_NO_GETPRID for DJGPP.
#
@@ -377,7 +377,7 @@ HAVE_GETPRID=
# Determine if we have the /dev/urandom
#
# HAVE_URANDOM_H= let the Makefile look /dev/urandom
# HAVE_URANDOM_H= let the Makefile look for /dev/urandom
# HAVE_URANDOM_H= YES assume that /dev/urandom exists
# HAVE_URANDOM_H= NO assume that /dev/urandom does not exist
#
@@ -391,10 +391,10 @@ HAVE_URANDOM_H=
# Determine if we have getrusage()
#
# If HAVE_GETRUSAGE is empty, this Makefile will run the have_memmv program
# If HAVE_GETRUSAGE is empty, this Makefile will run the have_rusage program
# to determine if getrusage() is supported. If HAVE_GETRUSAGE is set to
# -DHAVE_NO_GETRUSAGE, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the getrusage() function.
#
# If in doubt, leave HAVE_GETRUSAGE empty and this Makefile will figure it out.
#
@@ -403,10 +403,10 @@ HAVE_GETRUSAGE=
# Determine if we have strdup()
#
# If HAVE_STRDUP is empty, this Makefile will run the have_memmv program
# If HAVE_STRDUP is empty, this Makefile will run the have_strdup program
# to determine if strdup() is supported. If HAVE_STRDUP is set to
# -DHAVE_NO_STRDUP, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
# the strdup() function.
#
# If in doubt, leave HAVE_STRDUP empty and this Makefile will figure it out.
#
@@ -414,10 +414,10 @@ HAVE_STRDUP=
#HAVE_STRDUP= -DHAVE_NO_STRDUP
# Some architectures such as Sparc do not allow one to access 32 bit values
# that are not alligned on a 32 bit boundary.
# that are not aligned on a 32 bit boundary.
#
# The Dec Alpha running OSF/1 will produce alignment error messages when
# align32.c tries to figure out if alignment is needed. Use the
# align32.c tries to figure out if alignment is needed. Use the
# ALIGN32= -DMUST_ALIGN32 to force alignment and avoid such error messages.
#
# ALIGN32= let align32.c figure out if alignment is needed
@@ -572,7 +572,7 @@ HAVE_UNUSED=
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# Where to install calc realted things
# Where to install calc related things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
@@ -657,7 +657,7 @@ SCRIPTDIR= ${BINDIR}/cscript
# T - top level directory under which calc will be installed
#
# The calc install is performed under ${T}, the calc build is
# performed under /. The purpose for ${T} is to allow someone
# performed under /. The purpose for ${T} is to allow someone
# to install calc somewhere other than into the system area.
#
# For example, if:
@@ -675,7 +675,7 @@ SCRIPTDIR= ${BINDIR}/cscript
# calc binary files: /var/tmp/testing/usr/bin
# calc link library: /var/tmp/testing/usr/lib
# calc help, .cal ...: /var/tmp/testing/usr/share/calc
# ... etc ... /var/tmp/testing/...
# ... etc ... /var/tmp/testing/...
#
# If ${T} is empty, calc is installed under /, which is the same
# top of tree for which it was built. If ${T} is non-empty, then
@@ -739,12 +739,12 @@ CATEXT= 1
# If NROFF is non-empty, then
#
# ${NROFF} ${NROFF_ARG} calc.1 > ${CATDIR}/calc.${CATEXT}
# is used to built and install the cat page
# is used to build and install the cat page
#
# else (NROFF is empty)
#
# ${MANMAKE} calc.1 ${CATDIR}
# is used to built and install the cat page
# is used to build and install the cat page
# else
#
# The cat page is not built or installed
@@ -767,8 +767,8 @@ CATMODE= 0444
# By default, custom builtin functions may only be executed if calc
# is given the -C option. This is because custom builtin functions
# may invoke non-standard or non-portable code. One may completely
# disable custom builtin functions by not compiling any of code
# may invoke non-standard or non-portable code. One may completely
# disable custom builtin functions by not compiling any custom code
#
# ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given
# ALLOW_CUSTOM= # disable custom even if -C is given
@@ -779,14 +779,14 @@ ALLOW_CUSTOM= -DCUSTOM
#ALLOW_CUSTOM=
# If the $CALCPATH environment variable is not defined, then the following
# path will be search for calc resource file routines.
# path will be searched for calc resource file routines.
#
# Select CALCPATH= .;./cal;~/.cal;${CALC_SHAREDIR};${CUSTOMCALDIR} for DJGPP.
#
CALCPATH= .:./cal:~/.cal:${CALC_SHAREDIR}:${CUSTOMCALDIR}
# If the $CALCRC environment variable is not defined, then the following
# path will be search for calc resource files.
# path will be searched for calc resource files.
#
# Select CALCRC= ${CALC_SHAREDIR}/startup;~/.calcrc;./.calcinit for DJGPP.
#
@@ -794,7 +794,7 @@ CALCRC= ${CALC_SHAREDIR}/startup:~/.calcrc:./.calcinit
#CALCRC= ${CALC_SHAREDIR}/startup;~/.calcrc;./.calcinit
# Determine of the GNU-readline facility will be used instead of the
# built-in calc binding method.
# builtin calc binding method.
#
# USE_READLINE= Do not use GNU-readline, use calc bindings
# USE_READLINE= -DUSE_READLINE Use GNU-readline, do not use calc bindings
@@ -808,7 +808,7 @@ CALCRC= ${CALC_SHAREDIR}/startup:~/.calcrc:./.calcinit
# READLINE_INCLUDE Where the readline include files reside
# (leave blank if they are /usr/include/readline)
#
# NOTE: The GNU-readline code is not shipped with calc. You must have
# NOTE: The GNU-readline code is not shipped with calc. You must have
# the appropriate headers and link libs installed on your system in
# order to use it.
#
@@ -885,9 +885,9 @@ RANLIB=ranlib
#RANLIB=:
# Normally certain files depend on the Makefile. If the Makefile is
# changed, then certain steps should be redone. If MAKE_FILE is
# changed, then certain steps should be redone. If MAKE_FILE is
# set to Makefile, then these files will depend on Makefile. If
# MAKE_FILE is empty, then they wont.
# MAKE_FILE is empty, then they won't.
#
# If in doubt, set MAKE_FILE to Makefile
#
@@ -948,9 +948,9 @@ CALC_ENV= CALCPATH=./cal LD_LIBRARY_PATH=.
#
# ${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.
# to create directories. Normally this amounts to using mkdir -p dir ...
# Some older systems may not have mkdir -p. If your system does not
# have 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
@@ -958,8 +958,8 @@ CALC_ENV= CALCPATH=./cal LD_LIBRARY_PATH=.
MKDIR_ARG= -p
#MKDIR_ARG=
# Some out of date operating systems require / want an executable to
# end with a certain file extension. Some compile systems such as
# Some out of date operating systems require/want an executable to
# end with a certain file extension. Some compiler systems such as
# windoz build calc as calc.exe. The EXT variable is used to denote
# the extension required by such. Note that Cygwin requires EXT to be
# the same as Linux/Un*x/GNU, even though it runs under windoz.
@@ -974,7 +974,7 @@ EXT=
# The default calc versions
#
VERSION= 2.12.4.7
VERSION= 2.12.4.13
VERS= 2.12.4
VER= 2.12
VE= 2
@@ -1025,11 +1025,11 @@ STRIP= strip
# Extra compiling and linking flags
#
# EXTRA_CFLAGS are flags given to ${CC} when compiling C files
# EXTRA_LDFLAGS are flags given to ${CC} when linking progs
# EXTRA_LDFLAGS are flags given to ${CC} when linking programs
#
# Both CFLAGS and LDFLAGS are left blank in this Makefile by
# default so that users may use them on the make command line
# to always the way that C is compiled and files are linked
# to always set the way that C is compiled and files are linked
# respectively. For example:
#
# make all EXTRA_CFLAGS="-DMAGIC" EXTRA_LDFLAGS="-lmagic"
@@ -1037,18 +1037,18 @@ STRIP= strip
# NOTE: These should be left blank in this Makefile to make it
# easier to add stuff on the command line. If you want to
# to change the way calc is compiled by this Makefile, change
# the appropirate host target section below or a flag above.
# the appropriate host target section below or a flag above.
#
EXTRA_CFLAGS=
EXTRA_LDFLAGS=
# COMMON_CFLAGS are the common ${CC} flags used for all progs, both
# intermediate and final calc and calc related progs
# COMMON_CFLAGS are the common ${CC} flags used for all programs, both
# intermediate and final calc and calc related programs
#
COMMON_CFLAGS= -DCALC_SRC ${ALLOW_CUSTOM} ${CCWARN} ${CCMISC} ${EXTRA_CFLAGS}
# COMMON_LDFLAGS are the common flags used for linking all progs, both
# intermediate and final calc and calc related progs
# COMMON_LDFLAGS are the common flags used for linking all programs, both
# intermediate and final calc and calc related programs
#
COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
@@ -1066,16 +1066,16 @@ COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
# BLD_TYPE= calc-static-only
#
# 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
# 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
#
# 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
# 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
#
# NOTE: The above 4 values are unused if BLD_TYPE= calc-dynamic-only
@@ -1088,8 +1088,8 @@ COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
# to abort on warnings, then leave CCWERR blank.
# CCMISC are misc flags given to ${CC}
#
# LCC how the the C compiler is invoked on locally executed intermediate progs
# CC is how the the C compiler is invoked (with an optional Purify)
# LCC is how the C compiler is invoked on locally executed intermediate programs
# CC is how the C compiler is invoked (with an optional Purify)
#
# Specific target overrides or modifications to default values
@@ -1128,10 +1128,10 @@ CC= ${PURIFY} ${LCC} ${CCWERR}
#
# The simple makefile forces the use of static ${CC} flags
#
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs
# ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# CFLAGS are given to ${CC} for calc programs other than intermediate programs
# ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc programs other than intermediate programs
#
ICFLAGS= ${COMMON_CFLAGS} ${CC_STATIC}
CFLAGS= ${ICFLAGS} ${CCOPT}
@@ -1354,7 +1354,7 @@ CUSTOM_PASSDOWN= \
VERSION=${VERSION} \
target=${target}
# The compelte list of Makefile vars passed down to help/Makefile.
# The complete list of Makefile vars passed down to help/Makefile.
#
HELP_PASSDOWN= \
AR=${AR} \
@@ -1391,7 +1391,7 @@ HELP_PASSDOWN= \
TOUCH=${TOUCH} \
TRUE=${TRUE}
# The compelte list of Makefile vars passed down to cal/Makefile.
# The complete list of Makefile vars passed down to cal/Makefile.
#
CAL_PASSDOWN= \
AR=${AR} \
@@ -1419,7 +1419,7 @@ CAL_PASSDOWN= \
TOUCH=${TOUCH} \
TRUE=${TRUE}
# The compelte list of Makefile vars passed down to cscript/Makefile.
# The complete list of Makefile vars passed down to cscript/Makefile.
#
CSCRIPT_PASSDOWN= \
AR=${AR} \
@@ -1468,7 +1468,7 @@ DISTLIST= ${C_SRC} ${H_SRC} ${MAKE_FILE} BUGS CHANGES LIBRARY README \
README.WINDOWS calc.man HOWTO.INSTALL ${UTIL_MISC_SRC} ${LICENSE} \
sample.README calc.spec.in rpm.mk
# These files are used to make (but not built) a calc .a link library
# These files are used to make (but not build) a calc .a link library
#
CALCLIBLIST= ${LIBSRC} ${UTIL_C_SRC} ${LIB_H_SRC} ${MAKE_FILE} \
${UTIL_MISC_SRC} BUGS CHANGES LIBRARY
@@ -1481,18 +1481,18 @@ OBJS= ${LIBOBJS} ${CALCOBJS} ${UTIL_OBJS} ${SAMPLE_OBJ}
#
CALC_STATIC_LIBS= libcalc.a libcustcalc.a
# Libaraies created and used to build calc
# Libraries created and used to build calc
#
CALC_DYNAMIC_LIBS= libcalc${LIB_EXT_VERSION} libcustcalc${LIB_EXT_VERSION}
# Symlinks of dymanic shared libraries
# Symlinks of dynamic shared libraries
#
SYM_DYNAMIC_LIBS= libcalc${LIB_EXT_VER} libcalc${LIB_EXT_VE} libcalc${LIB_EXT} \
libcalc${LIB_EXT_VERS} libcustcalc${LIB_EXT_VERSION} \
libcustcalc${LIB_EXT_VERS} libcustcalc${LIB_EXT_VER} \
libcustcalc${LIB_EXT_VE} libcustcalc${LIB_EXT}
# list of sample programs to that need to be built to satisfy sample rule
# list of sample programs that need to be built to satisfy sample rule
#
# NOTE: The ${SAMPLE_TARGETS} and ${SAMPLE_STATIC_TARGETS} are built but
# not installed at this time.
@@ -1503,7 +1503,7 @@ SYM_DYNAMIC_LIBS= libcalc${LIB_EXT_VER} libcalc${LIB_EXT_VE} libcalc${LIB_EXT} \
SAMPLE_TARGETS= sample_rand${EXT} sample_many${EXT}
SAMPLE_STATIC_TARGETS= sample_rand-static${EXT} sample_many-static${EXT}
# list of cscript programs to that need to be built to satisfy cscript/.all
# list of cscript programs that need to be built to satisfy cscript/.all
#
# NOTE: This list MUST be coordinated with the ${CSCRIPT_TARGETS} variable
# in the cscript/Makefile
@@ -1558,7 +1558,7 @@ calc-dynamic-only: ${DYNAMIC_FIRST_TARGETS} ${EARLY_TARGETS} \
echo " ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
echo " ${MAKE} -f ${MAKE_FILE} $$r BLD_TYPE=$$r" 1>&2; \
echo "" 1>&2; \
echo "NOTE: It is a very good idea to c first clobber any" 1>&2; \
echo "NOTE: It is a very good idea to first clobber any" 1>&2; \
echo " previously built .o, libs and executables" 1>&2; \
echo " before switching to $$r!" 1>&2; \
echo "" 1>&2; \
@@ -1574,7 +1574,7 @@ calc-dynamic-only: ${DYNAMIC_FIRST_TARGETS} ${EARLY_TARGETS} \
echo " ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
echo " ${MAKE} -f ${MAKE_FILE} $$r BLD_TYPE=$$r" 1>&2; \
echo "" 1>&2; \
echo "to clean out any previously build static files." 1>&2; \
echo "to clean out any previously built static files." 1>&2; \
echo "" 1>&2; \
echo "=== aborting make ===" 1>&2; \
exit 2; \
@@ -1604,7 +1604,7 @@ calc-static-only: ${STATIC_FIRST_TARGETS} ${EARLY_TARGETS} \
echo " ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
echo " ${MAKE} -f ${MAKE_FILE} $$r BLD_TYPE=$$r" 1>&2; \
echo "" 1>&2; \
echo "NOTE: It is a very good idea to c first clobber any" 1>&2; \
echo "NOTE: It is a very good idea to first clobber any" 1>&2; \
echo " previously built .o, libs and executables" 1>&2; \
echo " before switching to $$r!" 1>&2; \
echo "" 1>&2; \
@@ -1620,7 +1620,7 @@ calc-static-only: ${STATIC_FIRST_TARGETS} ${EARLY_TARGETS} \
echo " ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
echo " ${MAKE} -f ${MAKE_FILE} $$r BLD_TYPE=$$r" 1>&2; \
echo "" 1>&2; \
echo "to clean out any previously build dynamic files." 1>&2; \
echo "to clean out any previously built dynamic files." 1>&2; \
echo "" 1>&2; \
echo "=== aborting make ===" 1>&2; \
exit 4; \
@@ -1716,8 +1716,8 @@ seed.o: seed.c no_implicit.arg ${MAKE_FILE}
###
#
# The next set of rules cause the .h files BUILD_H_SRC files to be built
# according tot he system and the Makefile variables above. The hsrc rule
# is a convenient rule to invoke to built all of the BUILD_H_SRC.
# according to the system and the Makefile variables above. The hsrc rule
# is a convenient rule to invoke to build all of the BUILD_H_SRC.
#
# We add in the BUILD_C_SRC files because they are similar to the
# BUILD_H_SRC files in terms of the build process.
@@ -2127,8 +2127,10 @@ have_fpos.h: have_fpos.c ${MAKE_FILE}
${Q} echo '' >> have_fpos.h
${Q} echo '/* do we have fgetpos & fsetpos functions? */' >> have_fpos.h
${Q} ${RM} -f have_fpos.o have_fpos${EXT}
-${Q} ${LCC} ${HAVE_FPOS} ${ICFLAGS} have_fpos.c -c >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_fpos.o -o have_fpos${EXT} >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${HAVE_FPOS} ${ICFLAGS} have_fpos.c -c \
>/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_fpos.o -o have_fpos${EXT} \
>/dev/null 2>&1; ${TRUE}
-${Q} ${SHELL} -c "./have_fpos${EXT} > fpos_tmp 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}
-${Q} if [ -s fpos_tmp ]; then \
@@ -2213,8 +2215,9 @@ fposval.h: fposval.c have_fpos.h have_fpos_pos.h have_offscl.h have_posscl.h \
${Q} echo '/* what are our file position & size types? */' >> fposval.h
${Q} ${RM} -f fposval.o fposval${EXT}
-${Q} ${LCC} ${ICFLAGS} ${FPOS_BITS} ${OFF_T_BITS} \
${DEV_BITS} ${INODE_BITS} fposval.c -c >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} fposval.o -o fposval${EXT} >/dev/null 2>&1; ${TRUE}
${DEV_BITS} ${INODE_BITS} fposval.c -c >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} fposval.o -o fposval${EXT} >/dev/null \
2>&1; ${TRUE}
${Q} ${SHELL} -c "./fposval${EXT} fposv_tmp >> fposval.h 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}
${Q} echo '' >> fposval.h
@@ -2248,7 +2251,8 @@ have_const.h: have_const.c ${MAKE_FILE}
${Q} ${RM} -f have_const.o have_const${EXT}
-${Q} ${LCC} ${ICFLAGS} ${HAVE_CONST} have_const.c -c \
>/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_const.o -o have_const${EXT} >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_const.o -o have_const${EXT} \
>/dev/null 2>&1; ${TRUE}
-${Q} ${SHELL} -c "./have_const${EXT} > const_tmp 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}
-${Q} if [ -s const_tmp ]; then \
@@ -2382,7 +2386,8 @@ align32.h: align32.c longbits.h have_unistd.h ${MAKE_FILE}
${RM} -f align32.o align32${EXT}; \
${LCC} ${ICFLAGS} ${ALIGN32} align32.c -c >/dev/null 2>&1; \
${LCC} ${ILDFLAGS} align32.o -o align32${EXT} >/dev/null 2>&1; \
${SHELL} -c "./align32${EXT} >align32_tmp 2>/dev/null" >/dev/null 2>&1; \
${SHELL} -c \
"./align32${EXT} >align32_tmp 2>/dev/null" >/dev/null 2>&1; \
if [ -s align32_tmp ]; then \
${CAT} align32_tmp >> align32.h; \
else \
@@ -2423,7 +2428,8 @@ have_uid_t.h: have_uid_t.c have_unistd.h ${MAKE_FILE}
${Q} ${RM} -f have_uid_t.o have_uid_t${EXT}
-${Q} ${LCC} ${ICFLAGS} ${HAVE_UID_T} have_uid_t.c -c \
>/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_uid_t.o -o have_uid_t${EXT} >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_uid_t.o -o have_uid_t${EXT} \
>/dev/null 2>&1; ${TRUE}
-${Q} ${SHELL} -c "./have_uid_t${EXT} > uid_tmp 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}
-${Q} if [ -s uid_tmp ]; then \
@@ -2611,7 +2617,8 @@ have_getpgid.h: have_getpgid.c ${MAKE_FILE}
${Q} ${RM} -f getpgid_tmp have_getpgid.h
${Q} echo 'forming have_getpgid.h'
${Q} echo '/*' > have_getpgid.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getpgid.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_getpgid.h
${Q} echo ' */' >> have_getpgid.h
${Q} echo '' >> have_getpgid.h
${Q} echo '' >> have_getpgid.h
@@ -2651,7 +2658,8 @@ have_gettime.h: have_gettime.c ${MAKE_FILE}
${Q} ${RM} -f gettime_tmp have_gettime.h
${Q} echo 'forming have_gettime.h'
${Q} echo '/*' > have_gettime.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_gettime.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_gettime.h
${Q} echo ' */' >> have_gettime.h
${Q} echo '' >> have_gettime.h
${Q} echo '' >> have_gettime.h
@@ -2691,7 +2699,8 @@ have_getprid.h: have_getprid.c ${MAKE_FILE}
${Q} ${RM} -f getprid_tmp have_getprid.h
${Q} echo 'forming have_getprid.h'
${Q} echo '/*' > have_getprid.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getprid.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_getprid.h
${Q} echo ' */' >> have_getprid.h
${Q} echo '' >> have_getprid.h
${Q} echo '' >> have_getprid.h
@@ -2731,7 +2740,8 @@ have_urandom.h: ${MAKE_FILE}
${Q} ${RM} -f have_urandom.h
${Q} echo 'forming have_urandom.h'
${Q} echo '/*' > have_urandom.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_urandom.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_urandom.h
${Q} echo ' */' >> have_urandom.h
${Q} echo '' >> have_urandom.h
${Q} echo '' >> have_urandom.h
@@ -2767,7 +2777,8 @@ have_rusage.h: have_rusage.c ${MAKE_FILE}
${Q} ${RM} -f rusage_tmp have_rusage.h
${Q} echo 'forming have_rusage.h'
${Q} echo '/*' > have_rusage.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> have_rusage.h
${Q} echo ' * DO NOT EDIT -- generated by the Makefile' >> \
have_rusage.h
${Q} echo ' */' >> have_rusage.h
${Q} echo '' >> have_rusage.h
${Q} echo '' >> have_rusage.h
@@ -2858,14 +2869,16 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
${Q} ${RM} -f have_stdvs.o have_stdvs${EXT}
-${Q} ${LCC} ${ICFLAGS} ${HAVE_VSPRINTF} have_stdvs.c -c \
>/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_stdvs.o -o have_stdvs${EXT} >/dev/null 2>&1; ${TRUE}
-${Q} ${LCC} ${ILDFLAGS} have_stdvs.o -o have_stdvs${EXT} \
>/dev/null 2>&1; ${TRUE}
-${Q} if ./have_stdvs${EXT} >>args.h 2>/dev/null; then \
${TOUCH} have_args.sh; \
else \
${TRUE}; \
fi
-${Q} if [ ! -f have_args.sh ] && [ X"${HAVE_VSPRINTF}" = X ]; then \
${RM} -f have_stdvs.o have_stdvs${EXT} have_varvs.o have_varvs${EXT}; \
${RM} -f have_stdvs.o have_stdvs${EXT} have_varvs.o; \
${RM} -f have_varvs${EXT}; \
${LCC} ${ICFLAGS} ${HAVE_VSPRINTF} have_varvs.c -c \
2>/dev/null; \
${LCC} ${ILDFLAGS} have_varvs.o -o have_varvs${EXT} 2>/dev/null; \
@@ -2889,7 +2902,8 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
${Q} echo '' >> args.h
${Q} echo '' >> args.h
${Q} echo '#endif /* !__ARGS_H__ */' >> args.h
${Q} ${RM} -f have_stdvs.o have_varvs.o have_varvs${EXT} have_args.sh core
${Q} ${RM} -f have_stdvs.o have_varvs.o have_varvs${EXT} have_args.sh
${Q} ${RM} -f core
${Q} echo 'args.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
@@ -2963,7 +2977,8 @@ no_implicit.arg: no_implicit.c ${MAKE_FILE}
else \
${LCC} -Wno-implicit ${ICFLAGS} -DHAVE_NO_IMPLICIT \
no_implicit.c -c >/dev/null 2>&1; \
${LCC} ${ILDFLAGS} no_implicit.o -o no_implicit${EXT} >/dev/null 2>&1; \
${LCC} ${ILDFLAGS} no_implicit.o -o no_implicit${EXT} \
>/dev/null 2>&1; \
${SHELL} -c "./no_implicit${EXT} > no_implicit.arg 2>/dev/null" \
>/dev/null 2>&1; ${TRUE}; \
fi
@@ -3146,7 +3161,7 @@ libcustcalc${LIB_EXT}: libcustcalc${LIB_EXT_VERSION}
###
#
# building calc-static and static lib*.a libraires
# building calc-static and static lib*.a libraries
#
###
@@ -3179,10 +3194,10 @@ sample_many-static${EXT}: sample_many.o ${CALC_STATIC_LIBS} ${MAKE_FILE}
###
#
# Home grown make dependency rules. Your system make not support
# Homegrown make dependency rules. Your system may not support
# or have the needed tools. You can ignore this section.
#
# We will form a skelaton tree of *.c files containing only #include "foo.h"
# We will form a skeleton tree of *.c files containing only #include "foo.h"
# lines and .h files containing the same lines surrounded by multiple include
# prevention lines. This allows us to build a static depend list that will
# satisfy all possible cpp symbol definition combinations.
@@ -3236,7 +3251,8 @@ depend: custom/Makefile hsrc
${Q} echo forming new ${MAKE_FILE}
${Q} ${RM} -f ${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/makedep.out >> ${MAKE_FILE}
${Q} ${RM} -rf skel
-${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \
@@ -3291,21 +3307,21 @@ h_list:
# 1 level version string.
#
# version:
# This rule simply echos the value found in this makefile.
# This rule simply echoes the value found in this makefile.
# This rule produces the full version string. Note that the
# full version could be 4 or 3 levels long depending on the
# minor patch number.
#
# vers:
# This rule simply echos the value found in this makefile.
# This rule simply echoes the value found in this makefile.
# This rule produces only a 3 level version string.
#
# ver:
# This rule simply echos the value found in this makefile.
# This rule simply echoes the value found in this makefile.
# This rule produces only a 2 level version string.
#
# ve:
# This rule simply echos the value found in this makefile.
# This rule simply echoes the value found in this makefile.
# This rule produces only a 1 level version string.
#
###
@@ -3397,7 +3413,7 @@ calcliblistfmt:
#
# Doing a 'make chk' will cause only the context around interesting
# (and error) messages to be printed. Unlike 'make check', this
# rule does not cause things to be built. I.e., the all rule is
# rule does not cause things to be built. i.e., the all rule is
# not invoked.
#
###
@@ -3593,34 +3609,38 @@ env:
mkdebug: env version.c
@echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
@echo '=-=-=-=-= Determining the source version =-=-=-=-='
@echo '=-=-=-= Determining the source version =-=-=-='
@${MAKE} -f Makefile Q= V=@ ver_calc${EXT}
-@./ver_calc${EXT}
@echo '=-=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ all =-=-=-=-='
@echo '=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ all =-=-=-='
@${MAKE} -f Makefile Q= V=@ all
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-=-= Determining the binary version =-=-=-=-='
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-= Determining the binary version =-=-=-='
-@./calc${EXT} -e -q -v
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
debug: env
@echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
@echo '=-=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ clobber =-=-=-=-='
@echo '=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ clobber =-=-=-='
@${MAKE} -f Makefile Q= V=@ clobber
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-=-= Determining the source version =-=-=-=-='
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ all =-=-=-='
@echo '=-=-= this may take a bit of time =-=-='
@${MAKE} -f Makefile Q= V=@ all
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-= Determining the source version =-=-=-='
@${MAKE} -f Makefile Q= V=@ ver_calc${EXT}
-@./ver_calc${EXT}
@echo '=-=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ all =-=-=-=-='
@${MAKE} -f Makefile Q= V=@ all
@echo '=-=-=-=-= Determining the binary version =-=-=-=-='
-@./calc${EXT} -e -q -v
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ chk =-=-=-=-='
@echo '=-=-=-=-= this may take a while =-=-=-=-='
@${MAKE} -f Makefile Q= V=@ chk
@echo '=-=-=-=-= Back to the main Makefile for $@ rule =-=-=-=-='
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo -n '=-=-=-= Print #defile values if custom functions '
@echo 'are allowed =-=-=-='
-@./calc${EXT} -e -q -C 'print custom("sysinfo", 2);'
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-= Invoking ${MAKE} -f Makefile Q= V=@ check =-=-=-='
@echo '=-=-= this may take a while =-=-='
@${MAKE} -f Makefile Q= V=@ check
@echo '=-=-=-= Back to the main Makefile for $@ rule =-=-=-='
@echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
###
@@ -3685,7 +3705,8 @@ rpm-unhide-static:
rpm-chk-static:
${V} echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
${CALC_ENV} ./calc-static${EXT} -d -q read regress 2>&1 | ${AWK} -f check.awk
${CALC_ENV} ./calc-static${EXT} -d -q read regress 2>&1 | \
${AWK} -f check.awk
${V} echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
rpm-clean-static:
@@ -3730,7 +3751,7 @@ inst_files: ${MAKE_FILE} help/Makefile cal/Makefile custom/Makefile \
${Q} LANG=C ${SORT} -u inst_files -o inst_files
${V} echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
# The olduninstall rule will remove calc files from the older, histroic
# The olduninstall rule will remove calc files from the older, historic
# locations under the /usr/local directory. If you are using the
# new default values for ${BINDIR}, ${CALC_SHAREDIR}, ${INCDIR} and ${LIBDIR}
# then you can use this rule to clean out the older calc stuff under
@@ -3844,7 +3865,7 @@ clobber: custom/Makefile clean
# install everything
#
# NOTE: Keep the uninstall rule in reverse order to the install rule
# NOTE: Keep the uninstall rule in the reverse order of the install rule
#
install: custom/Makefile ${LIB_H_SRC} ${BUILD_H_SRC} calc.1 all
${V} echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
@@ -4067,7 +4088,8 @@ install: custom/Makefile ${LIB_H_SRC} ${BUILD_H_SRC} calc.1 all
continue; \
fi; \
${RM} -f tmp; \
${SED} -e 's/^\(#[ ]*include[ ][ ]*\)"/\1"calc\//' $$i > tmp; \
${SED} -e 's/^\(#[ ]*include[ ][ ]*\)"/\1"calc\//' \
$$i > tmp; \
if ${CMP} -s tmp ${T}${CALC_INCDIR}/$$i; then \
${TRUE}; \
else \
@@ -4138,7 +4160,7 @@ install: custom/Makefile ${LIB_H_SRC} ${BUILD_H_SRC} calc.1 all
# Try to remove everything that was installed
#
# NOTE: Keep the uninstall rule in reverse order to the install rule
# NOTE: Keep the uninstall rule in the reverse order of the install rule
#
uninstall: custom/Makefile
${V} echo '=-=-=-=-= ${MAKE_FILE} start of $@ rule =-=-=-=-='
@@ -4190,7 +4212,7 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}" ]; then \
${RM} -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}"; \
if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}"; \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}";\
else \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VE}"; \
fi; \
@@ -4198,7 +4220,8 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}" ]; then \
${RM} -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}"; \
if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}"; \
echo -n "cannot uninstall "; \
echo "${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}"; \
else \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VER}"; \
fi; \
@@ -4206,7 +4229,8 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}" ]; then \
${RM} -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}"; \
if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}"; \
echo \
"cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}"; \
else \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERS}"; \
fi; \
@@ -4214,9 +4238,10 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}" ]; then \
${RM} -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}"; \
if [ -f "${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}"; \
echo \
"cannot uninstall ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}";\
else \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}"; \
echo "uninstalled ${T}${LIBDIR}/libcustcalc${LIB_EXT_VERSION}";\
fi; \
fi
-${Q} if [ -f "${T}${LIBDIR}/libcalc${LIB_EXT}" ]; then \
@@ -4254,7 +4279,8 @@ uninstall: custom/Makefile
-${Q} if [ -f "${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}" ]; then \
${RM} -f "${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}"; \
if [ -f "${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}" ]; then \
echo "cannot uninstall ${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}"; \
echo -n "cannot uninstall " \
echo "${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}"; \
else \
echo "uninstalled ${T}${LIBDIR}/libcalc${LIB_EXT_VERSION}"; \
fi; \
@@ -4338,7 +4364,7 @@ strip:
done
${V} echo '=-=-=-=-= ${MAKE_FILE} end of $@ rule =-=-=-=-='
# calc-symlink - setup symlinks from stardard locations into the ${T} tree
# calc-symlink - setup symlinks from standard locations into the ${T} tree
#
calc-symlink:
${Q}if [ -z "${T}" ]; then \
@@ -4372,15 +4398,20 @@ calc-symlink:
done
-${Q} if [ -n "${CATDIR}" ]; then \
if [ -e "${T}${CATDIR}/calc.${CATEXT}" ]; then \
if [ ! -L "${CATDIR}/calc.${CATEXT}" -a "${T}${CATDIR}/calc.${CATEXT}" -ef "${CATDIR}/calc.${CATEXT}" ]; then \
echo "ERROR: ${T}${CATDIR}/calc.${CATEXT} is the same as ${CATDIR}/calc.${CATEXT}" 1>&2; \
if [ ! -L "${CATDIR}/calc.${CATEXT}" -a \
"${T}${CATDIR}/calc.${CATEXT}" -ef \
"${CATDIR}/calc.${CATEXT}" ]; then \
echo -n "ERROR: ${T}${CATDIR}/calc.${CATEXT}" 2>&1; \
echo "is the same as ${CATDIR}/calc.${CATEXT}" 1>&2; \
else \
if [ -e "${CATDIR}/calc.${CATEXT}" ]; then \
echo ${RM} -f "${CATDIR}/calc.${CATEXT}"; \
${RM} -f "${CATDIR}/calc.${CATEXT}"; \
fi; \
echo ${LN} -s "${T}${CATDIR}/calc.${CATEXT}" "${CATDIR}/calc.${CATEXT}"; \
${LN} -s "${T}${CATDIR}/calc.${CATEXT}" "${CATDIR}/calc.${CATEXT}"; \
echo ${LN} -s "${T}${CATDIR}/calc.${CATEXT}" \
"${CATDIR}/calc.${CATEXT}"; \
${LN} -s "${T}${CATDIR}/calc.${CATEXT}" \
"${CATDIR}/calc.${CATEXT}"; \
fi; \
fi; \
fi
@@ -4409,7 +4440,8 @@ calc-unsymlink:
echo ${RM} -f "${CATDIR}/calc.${CATEXT}"; \
${RM} -f "${CATDIR}/calc.${CATEXT}"; \
else \
echo "Warning: ignoring non-symlink: ${CATDIR}/calc.${CATEXT}" 1>&2; \
echo "Warning: ignoring non-symlink: ${CATDIR}/calc.${CATEXT}" \
1>&2; \
fi; \
fi

10
alloc.h
View File

@@ -17,8 +17,8 @@
* 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.2 $
* @(#) $Id: alloc.h,v 30.2 2008/04/15 21:17:57 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $Id: alloc.h,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/alloc.h,v $
*
* Under source code control: 1990/02/15 01:48:29
@@ -53,7 +53,8 @@
# if defined(HAVE_NEWSTR)
E_FUNC void *memcpy();
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();
# else
E_FUNC long strlen();
@@ -82,7 +83,8 @@ E_FUNC int strcmp();
#if !defined(HAVE_MEMMOVE)
# 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
# else
# define MEMMOVE_SIZE_T long

View File

@@ -17,8 +17,8 @@
* 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.1 $
* @(#) $Id: assocfunc.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $Id: assocfunc.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/assocfunc.c,v $
*
* Under source code control: 1993/07/20 23:04:27
@@ -332,7 +332,8 @@ assoccopy(ASSOC *oldap)
oldep = oldep->e_next) {
ep = (ASSOCELEM *) malloc(ELEMSIZE(oldep->e_dim));
if (ep == NULL) {
math_error("Cannot allocate association element");
math_error("Cannot allocate "
"association element");
/*NOTREACHED*/
}
ep->e_dim = oldep->e_dim;
@@ -340,7 +341,8 @@ assoccopy(ASSOC *oldap)
ep->e_value.v_type = V_NULL;
ep->e_value.v_subtype = V_NOSUBTYPE;
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);
listhead = &ap->a_table[ep->e_hash % ap->a_size];
ep->e_next = *listhead;

View File

@@ -19,8 +19,8 @@
* 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.1 $
* @(#) $Id: blkcpy.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $Id: blkcpy.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/blkcpy.c,v $
*
* 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
*/
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 newlen;
@@ -720,7 +721,8 @@ copystr2file(STRING *str, long ssi, long num, FILEID id, long dsi)
* copyblk2blk - copy block to block
*/
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 newsize;
@@ -762,7 +764,8 @@ copyblk2blk(BLOCK *sblk, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc
* copystr2blk - copy string to block
*/
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 newlen;
@@ -982,7 +985,8 @@ memmove(void *s1, CONST void *s2, MEMMOVE_SIZE_T n)
* copynum2blk - copy number numerator to block
*/
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 newsize;
@@ -1033,7 +1037,8 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi, BOOL norelo
* copyblk2num - copy block to number
*/
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;
NUMBER *ret; /* cloned and modified numerator */

View File

@@ -17,8 +17,8 @@
* 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.1 $
* @(#) $Id: byteswap.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $Id: byteswap.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/byteswap.c,v $
*
* 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));
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*/
}

View File

@@ -18,8 +18,8 @@
# 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.5 $
# @(#) $Id: Makefile,v 30.5 2011/05/23 22:50:18 chongo Exp $
# @(#) $Revision: 30.10 $
# @(#) $Id: Makefile,v 30.10 2013/09/02 03:02:00 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/cal/RCS/Makefile,v $
#
# Under source code control: 1991/07/21 05:00:54
@@ -179,22 +179,37 @@ MV= mv
CO= co
TRUE= true
TOUCH= touch
SED= sed
SORT= sort
FMT= fmt
# The calc files to install
#
CALC_FILES= README bigprime.cal deg.cal ellip.cal lucas.cal lucas_chk.cal \
lucas_tbl.cal mersenne.cal mod.cal pell.cal pi.cal pix.cal \
pollard.cal poly.cal psqrt.cal quat.cal regress.cal solve.cal \
sumsq.cal surd.cal unitfrac.cal varargs.cal chrem.cal mfactor.cal \
bindings randmprime.cal test1700.cal randrun.cal linear.cal \
randbitrun.cal bernoulli.cal test2300.cal test2600.cal \
test2700.cal test3100.cal test3300.cal test3400.cal prompt.cal \
test3500.cal seedrandom.cal test4000.cal test4100.cal test4600.cal \
beer.cal hello.cal test5100.cal test5200.cal randombitrun.cal \
randomrun.cal repeat.cal xx_print.cal natnumset.cal qtime.cal \
test8400.cal test8500.cal test8600.cal chi.cal intfile.cal screen.cal \
dotest.cal set8700.cal set8700.line alg_config.cal sumtimes.cal \
dms.cal hms.cal gvec.cal
# This list is prodiced by the detaillist rule when no WARNINGS are detected.
#
# Please use:
#
# make calc_files_list
#
# to keep this list in nice sorted order and to check that these
# deailed help files are under RCS control.
#
CALC_FILES= README alg_config.cal beer.cal bernoulli.cal \
bernpoly.cal bigprime.cal bindings brentsolve.cal chi.cal chrem.cal \
constants.cal deg.cal dms.cal dotest.cal ellip.cal factorial.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
#
@@ -242,6 +257,27 @@ calcliblist:
fi; \
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
@@ -293,7 +329,7 @@ install: all
${RM} -f ${T}${CALC_SHAREDIR}/$$i.new; \
${CP} -f $$i ${T}${CALC_SHAREDIR}/$$i.new; \
${CHMOD} 0444 ${T}${CALC_SHAREDIR}/$$i.new; \
${MV} -f ${T}${CALC_SHAREDIR}/$$i.new ${T}${CALC_SHAREDIR}/$$i; \
${MV} -f ${T}${CALC_SHAREDIR}/$$i.new ${T}${CALC_SHAREDIR}/$$i;\
echo "installed ${T}${CALC_SHAREDIR}/$$i"; \
fi; \
done

View File

@@ -173,7 +173,8 @@ alg_config.cal
beer.cal
Calc's contribution to the 99 Bottles of Beer web page:
This calc resource is calc's contribution to the 99 Bottles of Beer
web page:
http://www.ionet.net/~timtroyr/funhouse/beer.html#calc
@@ -191,6 +192,18 @@ bernoulli.cal
the builtin function.
bernpoly.cal
bernpoly(n,z)
Computes the nth Bernoulli polynomial at z for arbitrary n,z. See:
http://en.wikipedia.org/wiki/Bernoulli_polynomials
http://mathworld.wolfram.com/BernoulliPolynomial.html
for further information
bigprime.cal
bigprime(a, m, p)
@@ -198,6 +211,34 @@ bigprime.cal
A prime test, base a, on p*2^x+1 for even x>m.
brentsolve.cal
brentsolve(low, high,eps)
A root-finder implementwed with the Brent-Dekker trick.
brentsolve2(low, high,which,eps)
The second function, brentsolve2(low, high,which,eps) has some lines
added to make it easier to hardcode the name of the helper function
different from the obligatory "f".
See:
http://en.wikipedia.org/wiki/Brent%27s_method
http://mathworld.wolfram.com/BrentsMethod.html
to find out more about the Brent-Dekker method.
constants.cal
e()
G()
An implementation of different constants to arbitrary precision.
chi.cal
Z(x[, eps])
@@ -291,6 +332,166 @@ dotest.cal
dotest("set8700.line");
factorial.cal
factorial(n)
Calculates the product of the positive integers up to and including n.
See:
http://en.wikipedia.org/wiki/Factorial
for information on the factorial. This function depends on the script
toomcook.cal.
primorial(a,b)
Calculates the product of the primes between a and b. If a is not prime
the next higher prime is taken as the starting point. If b is not prime
the next lower prime is taking as the end point b. The end point b must
not exceed 4294967291. See:
http://en.wikipedia.org/wiki/Primorial
for information on the primorial.
factorial2.cal
This file contents a small variety of integer functions that can, with
more or less pressure, be related to the factorial.
doublefactorial(n)
Calculates the double factorial n!! with different algorithms for
- n odd
- n even and positive
- n (real|complex) sans the negative half integers
See:
http://en.wikipedia.org/wiki/Double_factorial
http://mathworld.wolfram.com/DoubleFactorial.html
for information on the double factorial. This function depends on
the script toomcook.cal, factorial.cal and specialfunctions.cal.
binomial(n,k)
Calculates the binomial coefficients for n large and k = k \pm
n/2. Defaults to the built-in function for smaller and/or different
values. Meant as a complete replacement for comb(n,k) with only a
very small overhead. See:
http://en.wikipedia.org/wiki/Binomial_coefficient
for information on the binomial. This function depends on the script
toomcook.cal factorial.cal and specialfunctions.cal.
bigcatalan(n)
Calculates the n-th Catalan number for n large. It is usefull
above n~50,000 but defaults to the builtin function for smaller
values.Meant as a complete replacement for catalan(n) with only a
very small overhead. See:
http://en.wikipedia.org/wiki/Catalan_number
http://mathworld.wolfram.com/CatalanNumber.html
for information on Catalan numbers. This function depends on the scripts
toomcook.cal, factorial.cal and specialfunctions.cal.
stirling1(n,m)
Calculates the Stirling number of the first kind. It does so with
building a list of all of the smaller results. It might be a good
idea, though, to run it once for the highest n,m first if many
Stirling numbers are needed at once, for example in a series. See:
http://en.wikipedia.org/wiki/Stirling_numbers_of_the_first_kind
http://mathworld.wolfram.com/StirlingNumberoftheFirstKind.html
Algorithm 3.17, Donald Kreher and Douglas Simpson, "Combinatorial
Algorithms", CRC Press, 1998, page 89.
for information on Stirling numbers of the first kind.
stirling2(n,m)
stirling2caching(n,m)
Calculate the Stirling number of the second kind.
The first function stirling2(n,m) does it with the sum
m
====
1 \ n m - k
-- > k (- 1) binomial(m, k)
m! /
====
k = 0
The other function stirling2caching(n,m) does it by way of the
reccurence relation and keeps all earlier results. This function
is much slower for computing a single value than stirling2(n,m) but
is very usefull if many Stirling numbers are needed, for example in
a series. See:
http://en.wikipedia.org/wiki/Stirling_numbers_of_the_second_kind
http://mathworld.wolfram.com/StirlingNumberoftheSecondKind.html
Algorithm 3.17, Donald Kreher and Douglas Simpson, "Combinatorial
Algorithms", CRC Press, 1998, page 89.
for information on Stirling numbers of the second kind.
bell(n)
Calculate the n-th Bell number. This may take some time for large n.
See:
http://oeis.org/A000110
http://en.wikipedia.org/wiki/Bell_number
http://mathworld.wolfram.com/BellNumber.html
for information on Bell numbers.
subfactorial(n)
Calculate the n-th subfactorial or derangement. This may take some
time for large n. See:
http://mathworld.wolfram.com/Derangement.html
http://en.wikipedia.org/wiki/Derangement
for information on subfactorials.
risingfactorial(x,n)
Calculates the rising factorial or Pochammer symbol of almost arbitrary
x,n. See:
http://en.wikipedia.org/wiki/Pochhammer_symbol
http://mathworld.wolfram.com/PochhammerSymbol.html
for information on rising factorials.
fallingfactorial(x,n)
Calculates the rising factorial of almost arbitrary x,n. See:
http://en.wikipedia.org/wiki/Pochhammer_symbol
http://mathworld.wolfram.com/PochhammerSymbol.html
for information on falling factorials.
ellip.cal
efactor(iN, ia, B, force)
@@ -336,6 +537,20 @@ hms.cal
Calculate in hours, minutes, and seconds. See also dmscal.
infinities.cal
isinfinite(x)
iscinf(x)
ispinf(x)
isninf(x)
cinf()
ninf()
pinf()
The symbolic handling of infinities. Needed for intnum.cal but might be
usefull elsewhere, too.
intfile.cal
file2be(filename)
@@ -363,6 +578,158 @@ intfile.cal
of the integer become the last octets of the file.
intnum.cal
quadtsdeletenodes()
quadtscomputenodes(order, expo, eps)
quadtscore(a, b, n)
quadts(a, b, points)
quadglcomputenodes(N)
quadgldeletenodes()
quadglcore(a, b, n)
quadgl(a, b, points)
quad(a, b, points = -1, method = "tanhsinh")
makerange(start, end, steps)
makecircle(radius, center, points)
makeellipse(angle, a, b, center, points)
makepoints()
This file offers some methods for numerical integration. Implemented are
the Gauss-Legendre and the tanh-sinh quadrature.
All functions are usefull to some extend but the main function for
quadrature is quad(), which is not much more than an abstraction layer.
The main workers are quadgl() for Gauss-legendre and quadts() for the
tanh-sinh quadrature. The limits of the integral can be anything in the
complex plane and the extended real line. The latter means that infinite
limits are supported by way of the smbolic infinities implemented in the
file infinities.cal (automatically linked in by intnum.cal).
Integration in parts and contour is supported by the "points" argument
which takes either a number or a list. the functions starting with "make"
allow for a less error prone use.
The function to evaluate must have the name "f".
Examples (shamelessly stolen from mpmath):
; define f(x){return sin(x);}
f(x) defined
; quadts(0,pi()) - 2
0.00000000000000000000
; quadgl(0,pi()) - 2
0.00000000000000000000
Sometimes rounding errors accumulate, it might be a good idea to crank up
the working precision a notch or two.
; define f(x){ return exp(-x^2);}
f(x) redefined
; quadts(0,pinf()) - pi()
0.00000000000000000000
; quadgl(0,pinf()) - pi()
0.00000000000000000001
; define f(x){ return exp(-x^2);}
f(x) redefined
; quadgl(ninf(),pinf()) - sqrt(pi())
0.00000000000000000000
; quadts(ninf(),pinf()) - sqrt(pi())
-0.00000000000000000000
Using the "points" parameter is a bit tricky
; define f(x){ return 1/x; }
f(x) redefined
; quadts(1,1,mat[3]={1i,-1,-1i}) - 2i*pi()
0.00000000000000000001i
; quadgl(1,1,mat[3]={1i,-1,-1i}) - 2i*pi()
0.00000000000000000001i
The make* functions make it a bit simpler
; quadts(1,1,makepoints(1i,-1,-1i)) - 2i*pi()
0.00000000000000000001i
; quadgl(1,1,makepoints(1i,-1,-1i)) - 2i*pi()
0.00000000000000000001i
; define f(x){ return abs(sin(x));}
f(x) redefined
; quadts(0,2*pi(),makepoints(pi())) - 4
0.00000000000000000000
; quadgl(0,2*pi(),makepoints(pi())) - 4
0.00000000000000000000
The quad*core functions do not offer anything fancy but the third parameter
controls the so called "order" which is just the number of nodes computed.
This can be quite usefull in some circumstances.
; quadgldeletenodes()
; define f(x){ return exp(x);}
f(x) redefined
; s=usertime();quadglcore(-3,3)- (exp(3)-exp(-3));e=usertime();e-s
0.00000000000000000001
2.632164
; s=usertime();quadglcore(-3,3)- (exp(3)-exp(-3));e=usertime();e-s
0.00000000000000000001
0.016001
; quadgldeletenodes()
; s=usertime();quadglcore(-3,3,14)- (exp(3)-exp(-3));e=usertime();e-s
-0.00000000000000000000
0.024001
; s=usertime();quadglcore(-3,3,14)- (exp(3)-exp(-3));e=usertime();e-s
-0.00000000000000000000
0
It is not much but can sum up. The tanh-sinh algorithm is not optimizable
as much as the Gauss-Legendre algorithm but is per se much faster.
; s=usertime();quadtscore(-3,3)- (exp(3)-exp(-3));e=usertime();e-s
-0.00000000000000000001
0.128008
; s=usertime();quadtscore(-3,3)- (exp(3)-exp(-3));e=usertime();e-s
-0.00000000000000000001
0.036002
; s=usertime();quadtscore(-3,3,49)- (exp(3)-exp(-3));e=usertime();e-s
-0.00000000000000000000
0.036002
; s=usertime();quadtscore(-3,3,49)- (exp(3)-exp(-3));e=usertime();e-s
-0.00000000000000000000
0.01200
lambertw.cal
lambertw(z,branch)
Computes Lambert's W-function at "z" at branch "branch". See
http://en.wikipedia.org/wiki/Lambert_W_function
http://mathworld.wolfram.com/LambertW-Function.html
https://cs.uwaterloo.ca/research/tr/1993/03/W.pdf
http://arxiv.org/abs/1003.1628
to get more information.
This file includes also an implementation for the series described in
Corless et al. (1996) eq. 4.22 (W-pdf) and Verebic (2010) (arxive link)
eqs.35-37.
The series has been implemented to get a different algorithm
for checking the results. This was necessary because the results
of the implementation in Maxima, the only program with a general
lambert-w implementation at hand at that time, differed slightly. The
Maxima versions tested were: Maxima 5.21.1 and 5.29.1. The current
version of this code concurs with the results of Mathematica`s(tm)
ProductLog[branch,z] with the tested values.
The series is only valid for the branches 0,-1, real z, converges
for values of z _very_ near the branchpoint -exp(-1) only, and must
be given the branches explicitly. See the code in lambertw.cal
for further information.
linear.cal
linear(x0, y0, x1, y1, x)
@@ -371,6 +738,24 @@ linear.cal
Requires x0 != y0.
lnseries.cal
lnseries(limit)
lnfromseries(n)
deletelnseries()
Calculates a series of n natural logarithms at 1,2,3,4...n. It
does so by computing the prime factorization of all of the number
sequence 1,2,3...n, calculates the natural logarithms of the primes
in 1,2,3...n and uses the above factorization to build the natural
logarithms of the rest of the sequence by sadding the logarithms of
the primes in the factorization. This is faster for high precision
of the logarithms and/or long sequences.
The sequence need to be initiated by running either lnseries(n) or
lnfromseries(n) once with n the upper limit of the sequence.
lucas.cal
lucas(h, n)
@@ -416,6 +801,7 @@ mfactor.cal
fastest even thought the initial startup overhead is larger than
for p_elim == 13.
mod.cal
lmod(a)
@@ -505,6 +891,7 @@ pi.cal
Lambert Meertens. See also the ABC Programmer's Handbook, by Geurts,
Meertens & Pemberton, published by Prentice-Hall (UK) Ltd., 1990.
pix.cal
pi_of_x(x)
@@ -587,10 +974,10 @@ randmprime.cal
randmprime(bits, seed [,dbg])
Find a prime of the form h*2^n-1 >= 2^bits for some given x. The initial
search points for 'h' and 'n' are selected by a cryptographic pseudo-random
number generator. The optional argument, dbg, if set to 1, 2 or 3
turn on various debugging print statements.
Find a prime of the form h*2^n-1 >= 2^bits for some given x. The
initial search points for 'h' and 'n' are selected by a cryptographic
pseudo-random number generator. The optional argument, dbg, if set
to 1, 2 or 3 turn on various debugging print statements.
randombitrun.cal
@@ -642,8 +1029,8 @@ repeat.cal
regress.cal
Test the correct execution of the calculator by reading this resource file.
Errors are reported with '****' messages, or worse. :-)
Test the correct execution of the calculator by reading this resource
file. Errors are reported with '****' messages, or worse. :-)
screen.cal
@@ -689,15 +1076,17 @@ screen.cal
Cyan
White
Define ANSI control sequences providing (i.e., cursor movement, changing
foreground or background color, etc.) for VT100 terminals and terminal
window emulators (i.e., xterm, Apple OS/X Terminal, etc.) that support them.
Define ANSI control sequences providing (i.e., cursor movement,
changing foreground or background color, etc.) for VT100 terminals
and terminal window emulators (i.e., xterm, Apple OS/X Terminal,
etc.) that support them.
For example:
read screen
print green:"This is green. ":red:"This is red.":black
seedrandom.cal
seedrandom(seed1, seed2, bitsize [,trials])
@@ -734,13 +1123,276 @@ set8700.line
The set8700.cal file (and dotest.cal) should be read first.
smallfactors.cal
smallfactors(x0)
printsmallfactors(flist)
Lists the prime factors of numbers smaller than 2^32. Try for example:
printsmallfactors(smallfactors(10!)).
solve.cal
solve(low, high, epsilon)
Solve the equation f(x) = 0 to within the desired error value for x.
The function 'f' must be defined outside of this routine, and the low
and high values are guesses which must produce values with opposite signs.
The function 'f' must be defined outside of this routine, and the
low and high values are guesses which must produce values with
opposite signs.
specialfunctions.cal
beta(a,b)
Calculates the value of the beta function. See:
https://en.wikipedia.org/wiki/Beta_function
http://mathworld.wolfram.com/BetaFunction.html
http://dlmf.nist.gov/5.12
for information on the beta function.
betainc(a,b,z)
Calculates the value of the regularized incomplete beta function. See:
https://en.wikipedia.org/wiki/Beta_function
http://mathworld.wolfram.com/RegularizedBetaFunction.html
http://dlmf.nist.gov/8.17
for information on the regularized incomplete beta function.
expoint(z)
Calculates the value of the exponential integral Ei(z) function at z.
See:
http://en.wikipedia.org/wiki/Exponential_integral
http://www.cs.utah.edu/~vpegorar/research/2011_JGT/
for information on the exponential integral Ei(z) function.
erf(z)
Calculates the value of the error function at z. See:
http://en.wikipedia.org/wiki/Error_function
for information on the error function function.
erfc(z)
Calculates the value of the complementary error function at z. See:
http://en.wikipedia.org/wiki/Error_function
for information on the complementary error function function.
erfi(z)
Calculates the value of the imaginary error function at z. See:
http://en.wikipedia.org/wiki/Error_function
for information on the imaginary error function function.
erfinv(x)
Calculates the inverse of the error function at x. See:
http://en.wikipedia.org/wiki/Error_function
for information on the inverse of the error function function.
faddeeva(z)
Calculates the value of the complex error function at z. See:
http://en.wikipedia.org/wiki/Faddeeva_function
for information on the complex error function function.
gamma(z)
Calculates the value of the Euler gamma function at z. See:
http://en.wikipedia.org/wiki/Gamma_function
http://dlmf.nist.gov/5
for information on the Euler gamma function.
gammainc(a,z)
Calculates the value of the lower incomplete gamma function for
arbitrary a, z. See:
http://en.wikipedia.org/wiki/Incomplete_gamma_function
for information on the lower incomplete gamma function.
gammap(a,z)
Calculates the value of the regularized lower incomplete gamma
function for a, z with a not in -N. See:
http://en.wikipedia.org/wiki/Incomplete_gamma_function
for information on the regularized lower incomplete gamma function.
gammaq(a,z)
Calculates the value of the regularized upper incomplete gamma
function for a, z with a not in -N. See:
http://en.wikipedia.org/wiki/Incomplete_gamma_function
for information on the regularized upper incomplete gamma function.
heavisidestep(x)
Computes the Heaviside stepp function (1+sign(x))/2
harmonic(limit)
Calculates partial values of the harmonic series up to limit. See:
http://en.wikipedia.org/wiki/Harmonic_series_(mathematics)
http://mathworld.wolfram.com/HarmonicSeries.html
for information on the harmonic series.
lnbeta(a,b)
Calculates the natural logarithm of the beta function. See:
https://en.wikipedia.org/wiki/Beta_function
http://mathworld.wolfram.com/BetaFunction.html
http://dlmf.nist.gov/5.12
for information on the beta function.
lngamma(z)
Calculates the value of the logarithm of the Euler gamma function
at z. See:
http://en.wikipedia.org/wiki/Gamma_function
http://dlmf.nist.gov/5.15
for information on the derivatives of the the Euler gamma function.
polygamma(m,z)
Calculates the value of the m-th derivative of the Euler gamma
function at z. See:
http://en.wikipedia.org/wiki/Polygamma
http://dlmf.nist.gov/5
for information on the n-th derivative ofthe Euler gamma function. This
function depends on the script zeta2.cal.
psi(z)
Calculates the value of the first derivative of the Euler gamma
function at z. See:
http://en.wikipedia.org/wiki/Digamma_function
http://dlmf.nist.gov/5
for information on the first derivative of the Euler gamma function.
zeta(s)
Calculates the value of the Rieman Zeta function at s. See:
http://en.wikipedia.org/wiki/Riemann_zeta_function
http://dlmf.nist.gov/25.2
for information on the Riemann zeta function. This function depends
on the script zeta2.cal.
statistics.cal
gammaincoctave(z,a)
Computes the regularized incomplete gamma function in a way to
correspond with the function in Octave.
invbetainc(x,a,b)
Computes the inverse of the regularized beta function. Does so the
brute-force way wich makes it a bit slower.
betapdf(x,a,b)
betacdf(x,a,b)
betacdfinv(x,a,b)
betamedian(a,b)
betamode(a,b)
betavariance(a,b)
betalnvariance(a,b)
betaskewness(a,b)
betakurtosis(a,b)
betaentropy(a,b)
normalpdf(x,mu,sigma)
normalcdf(x,mu,sigma)
probit(p)
normalcdfinv(p,mu,sigma)
normalmean(mu,sigma)
normalmedian(mu,sigma)
normalmode(mu,sigma)
normalvariance(mu,sigma)
normalskewness(mu,sigma)
normalkurtosis(mu,sigma)
normalentropy(mu,sigma)
normalmgf(mu,sigma,t)
normalcf(mu,sigma,t)
chisquaredpdf(x,k)
chisquaredpcdf(x,k)
chisquaredmean(x,k)
chisquaredmedian(x,k)
chisquaredmode(x,k)
chisquaredvariance(x,k)
chisquaredskewness(x,k)
chisquaredkurtosis(x,k)
chisquaredentropy(x,k)
chisquaredmfg(k,t)
chisquaredcf(k,t)
Calculates a bunch of (hopefully) aptly named statistical functions.
strings.cal
isascii(c)
isblank(c)
Implements some of the functions of libc's ctype.h and strings.h.
NOTE: A number of the ctype.h and strings.h functions are now builtin
functions in calc.
WARNING: If the remaining functions in this calc resource file become
calc builtin functions, then strings.cal may be removed in
a future release.
sumsq.cal
@@ -802,7 +1454,8 @@ test1700.cal
value
This resource files is used by regress.cal to test the read and use keywords.
This resource files is used by regress.cal to test the read and
use keywords.
test2600.cal
@@ -827,8 +1480,8 @@ test2600.cal
checkresult(x, y, z, a)
test2600(verbose, tnum)
This resource files is used by regress.cal to test some of builtin functions
in terms of accuracy and roundoff.
This resource files is used by regress.cal to test some of builtin
functions in terms of accuracy and roundoff.
test2700.cal
@@ -865,7 +1518,8 @@ test3100.cal
res_inv(a)
res(x)
This resource file is used by regress.cal to test determinants of a matrix
This resource file is used by regress.cal to test determinants of
a matrix.
test3300.cal
@@ -876,8 +1530,9 @@ test3300.cal
testr(str, n, N, verbose)
test3300(verbose, tnum)
This resource file is used by regress.cal to provide for more determinant
tests.
This resource file is used by regress.cal to provide for more
determinant tests.
test3400.cal
@@ -908,6 +1563,7 @@ test3500.cal
This resource file is used by regress.cal to test the functions frem,
fcnt, gcdrem.
test4000.cal
global defaultverbose
@@ -940,6 +1596,7 @@ test4000.cal
This resource file is used by regress.cal to test ptest, nextcand and
prevcand builtins.
test4100.cal
global defaultverbose
@@ -959,6 +1616,7 @@ test4100.cal
This resource file is used by regress.cal to test REDC operations.
test4600.cal
stest(str [, verbose]) defined
@@ -970,6 +1628,7 @@ test4600.cal
This resource file is used by regress.cal to test searching in files.
test5100.cal
global a5100
@@ -979,6 +1638,7 @@ test5100.cal
This resource file is used by regress.cal to test the new code generator
declaration scope and order.
test5200.cal
global a5200
@@ -990,6 +1650,7 @@ test5200.cal
This resource file is used by regress.cal to test the fix of a
global/static bug.
test8400.cal
test8400() defined
@@ -997,6 +1658,7 @@ test8400.cal
This resource file is used by regress.cal to check for quit-based
memory leaks.
test8500.cal
global err_8500
@@ -1009,6 +1671,7 @@ test8500.cal
This resource file is used by regress.cal to the // and % operators.
test8600.cal
global min_8600
@@ -1019,6 +1682,25 @@ test8600.cal
This resource file is used by regress.cal to test a change of
allowing up to 1024 args to be passed to a builtin function.
test8900.cal
This function tests a number of calc resource functions contributed
by Christoph Zurnieden. These include:
bernpoly.cal
brentsolve.cal
constants.cal
factorial2.cal
factorial.cal
lambertw.cal
lnseries.cal
specialfunctions.cal
statistics.cal
toomcook.cal
zeta2.cal
unitfrac.cal
unitfrac(x)
@@ -1026,6 +1708,29 @@ unitfrac.cal
Represent a fraction as sum of distinct unit fractions.
toomcook.cal
toomcook3(a,b)
toomcook4(a,b)
Toom-Cook multiplication algorithm. Multiply two integers a,b by
way of the Toom-Cook algorithm. See:
http://en.wikipedia.org/wiki/Toom%E2%80%93Cook_multiplication
toomcook3square(a)
toomcook4square(a)
Square the integer a by way of the Toom-Cook algorithm. See:
http://en.wikipedia.org/wiki/Toom%E2%80%93Cook_multiplication
The function toomCook4(a,b) calls the function toomCook3(a,b) which
calls built-in multiplication at a specific cut-off point. The
squaring functions act in the same way.
varargs.cal
sc(a, b, ...)
@@ -1033,6 +1738,7 @@ varargs.cal
Example program to use 'varargs'. Program to sum the cubes of all
the specified numbers.
xx_print.cal
is_octet(a) defined
@@ -1047,6 +1753,19 @@ xx_print.cal
Demo for the xx_print object routines.
zeta2.cal
hurwitzzeta(s,a)
Calculate the value of the Hurwitz Zeta function. See:
http://en.wikipedia.org/wiki/Hurwitz_zeta_function
http://dlmf.nist.gov/25.11
for information on this special zeta function.
## Copyright (C) 2000 David I. Bell and Landon Curt Noll
##
## Primary author: Landon Curt Noll
@@ -1065,8 +1784,8 @@ xx_print.cal
## 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: README,v 30.3 2011/05/23 22:50:32 chongo Exp $
## @(#) $Revision: 30.8 $
## @(#) $Id: README,v 30.8 2013/09/02 01:46:05 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/cal/RCS/README,v $
##
## Under source code control: 1990/02/15 01:50:32

View File

@@ -17,8 +17,8 @@
* 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.1 $
* @(#) $Id: alg_config.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $Id: alg_config.cal,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/alg_config.cal,v $
*
* Under source code control: 2006/06/07 14:10:11
@@ -80,7 +80,8 @@ define mul_loop(repeat, x)
len = sizeof((*x)[0]) / baseb_bytes;
for (i=1; i < 4; ++i) {
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";
}
}
@@ -378,7 +379,8 @@ define best_mul2()
}
} while (ratio >= 1.0);
if (config("user_debug") > 0) {
printf("alg1/alg2 ratio now < 1.0, starting binary search between %d and %d\n",
printf("alg1/alg2 ratio now < 1.0, starting binary search "
"between %d and %d\n",
low, high);
}
@@ -472,7 +474,8 @@ define sq_loop(repeat, x)
len = sizeof((*x)[0]) / baseb_bytes;
for (i=1; i < 4; ++i) {
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";
}
}
@@ -769,7 +772,8 @@ define best_sq2()
}
} while (ratio >= 1.0);
if (config("user_debug") > 0) {
printf("alg1/alg2 ratio now < 1.0, starting binary search between %d and %d\n",
printf("alg1/alg2 ratio now < 1.0, starting binary search "
"between %d and %d\n",
low, high);
}
@@ -866,7 +870,8 @@ define pow_loop(repeat, x, ex)
len = sizeof((*x)[0]) / baseb_bytes;
for (i=1; i < 4; ++i) {
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) {
@@ -1151,7 +1156,8 @@ define best_pow2()
if (config("user_debug") > 1) {
printf(" pmod alg1/alg2 ratio = %.3f\n", ratio);
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);
@@ -1205,8 +1211,8 @@ define best_pow2()
looped = 1;
} while (ratio >= 1.0);
if (config("user_debug") > 0) {
printf("alg1/alg2 ratio now < 1.0, starting binary search between %d and %d\n",
low, high);
printf("alg1/alg2 ratio now < 1.0, starting binary search "
"between %d and %d\n", low, high);
}
/*

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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.1 $
* @(#) $Id: lucas.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $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 $
*
* 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).
*
* 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
* v1 - gen_v1(h,n) (see function below)
*
@@ -475,13 +475,6 @@ gen_u0(h, n, v1)
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
*/

View File

@@ -17,8 +17,8 @@
* 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.1 $
* @(#) $Id: quat.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $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 $
*
* Under source code control: 1990/02/15 01:50:35
@@ -55,7 +55,8 @@ define quat(a,b,c,d)
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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.6 $
* @(#) $Id: regress.cal,v 30.6 2010/09/02 06:09:06 chongo Exp $
* @(#) $Revision: 30.12 $
* @(#) $Id: regress.cal,v 30.12 2013/09/02 02:32:55 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/cal/RCS/regress.cal,v $
*
* Under source code control: 1990/02/15 01:50:36
@@ -768,6 +768,8 @@ print '016: parsed test_bignums()';
/*
* Test many of the built-in functions.
*
* See test_functionss() starting at test 9000 for more built-in function tests.
*/
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(a == -3, '1194: a == -3');
vrfy(b == 1, '1195: b == 1');
vrfy(quomod(-10,-3,a,b,13) == 1,'1196: vrfy(quomod(-10,-3,a,b,13) == 1');
vrfy(quomod(-10,-3,a,b,13) == 1,
'1196: vrfy(quomod(-10,-3,a,b,13) == 1');
vrfy(a == 4, '1197: a == 4');
vrfy(b == 2, '1198: b == 2');
vrfy(quomod(10,3,a,b,14) == 1, '1199: vrfy(quomod(10,3,a,b,14) == 1');
@@ -1444,7 +1447,12 @@ define test_functions()
vrfy(jacobi(-1,-1) == 0, '1236: jacobi(-1,-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()';
@@ -1461,14 +1469,14 @@ define _test_underscore()
local _a = 27;
local __a = 23209;
print "1290: Beginning _test_underscore";
print "1294: Beginning _test_underscore";
vrfy(_a == 27, '1291: _a == 27');
vrfy(_ == 49, '1292: _ == 49');
vrfy(__ == 63, '1293: __ == 63');
vrfy(__a == 23209, '1294: __a == 23209');
vrfy(_a == 27, '1295: _a == 27');
vrfy(_ == 49, '1296: _ == 49');
vrfy(__ == 63, '1297: __ == 63');
vrfy(__a == 23209, '1298: __a == 23209');
print "1295: Ending _test_underscore";
print "1299: Ending _test_underscore";
}
print '020: parsed _test_underscore';
@@ -1509,8 +1517,10 @@ define test_assoc()
vrfy(isnull(search(a,16)), '1312: isnull(search(a,16))');
a["curds","whey"] = "spider";
print '1313: a["curds","whey"] = "spider"';
vrfy(a["curds","whey"] == "spider", '1314: a["curds","whey"] == "spider"');
vrfy(a[[rsearch(a,"spider")]] == "spider", '1315: a[[rsearch(a,"spider")]] == "spider"');
vrfy(a["curds","whey"] == "spider",
'1314: a["curds","whey"] == "spider"');
vrfy(a[[rsearch(a,"spider")]] == "spider",
'1315: a[[rsearch(a,"spider")]] == "spider"');
b = a;
print '1316: b = a';
vrfy(b[17] == 19, '1317: b[17] == 19');
@@ -4892,7 +4902,8 @@ define test_newsyn()
vrfy(s5500 == 55, '5510: s5500 == 45');
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(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;
print '152: obj xx5600 {} xx5600';
@@ -6506,7 +6517,8 @@ define test_blk()
/* A second named block */
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(sizeof(B1) == 20, '6748: sizeof(B1) == 20');
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));
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,
'7211: sha1(z) == 0x158cc87deeb9dd478ca14e3ab359205b0fb15b83');
@@ -7914,6 +7927,137 @@ return 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
*

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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.2 $
* @(#) $Id: solve.cal,v 30.2 2008/05/10 13:30:00 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $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 $
*
* Under source code control: 1990/02/15 01:50:37
@@ -52,7 +52,8 @@ define solve(low, high, epsilon)
if (sgn(flow) == sgn(fhigh))
quit "Non-opposite signs";
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))
places++;
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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.2 $
* @(#) $Id: test2600.cal,v 30.2 2007/07/11 22:57:23 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $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 $
*
* Under source code control: 1995/10/13 00:13:14
@@ -91,7 +91,8 @@ define testismult(str, n, verbose)
if (!ismult(c,a)) {
m++;
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) {
m++;
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) {
m++;
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) {
m++;
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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.1 $
* @(#) $Id: test2700.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $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 $
*
* Under source code control: 1995/11/01 22:52:25
@@ -127,7 +127,8 @@ define testcsqrt(str, n, verbose)
if (p) {
if (verbose > 0)
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);
m++;
}

View File

@@ -19,8 +19,8 @@
* 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.1 $
* @(#) $Id: test4000.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $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 $
*
* 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);
if (p) {
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++;
}
}
@@ -306,7 +307,8 @@ define ntimes(str, N, n, count, skip, residue, modulus, verbose)
}
tprev = round(usertime() - t, 4);
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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.1 $
* @(#) $Id: test8500.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $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 $
*
* 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.
*
* 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
* test, etc.
* stored in the list L_8500. L_8500[0], L_8500[1], L_8500[2] are a, b,
* rnd for the first* test, etc.
*/
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)";
}

10
calc.h
View File

@@ -17,8 +17,8 @@
* 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.2 $
* @(#) $Id: calc.h,v 30.2 2007/07/10 17:44:52 chongo Exp $
* @(#) $Revision: 30.4 $
* @(#) $Id: calc.h,v 30.4 2013/09/01 22:16:21 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/calc.h,v $
*
* Under source code control: 1990/02/15 01:48:31
@@ -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 isattyid(FILEID id);
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 freeconstant(unsigned 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 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 int nextchar(void);
E_FUNC void reread(void);

View File

@@ -15,8 +15,8 @@
.\" 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: calc.man,v 30.3 2007/09/08 02:53:09 chongo Exp $
.\" @(#) $Revision: 30.5 $
.\" @(#) $Id: calc.man,v 30.5 2013/08/11 08:41:38 chongo Exp $
.\" @(#) $Source: /usr/local/src/bin/calc/RCS/calc.man,v $
.\"
.\" Under source code control: 1991/07/23 05:48:26
@@ -1164,8 +1164,10 @@ Send bug reports and bug fixes to:
.nf
calc-bugs at asthe dot com
[[ NOTE: Replace 'at' with @, 'dot' is with . and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe' and the web site URL uses 'isthe' ]]
[[ NOTE: Replace 'at' with @, 'dot' is with . ]]
[[ and remove the spaces ]]
[[ NOTE: The EMail address uses 'asthe' and
[[ the web site URL uses 'isthe' ]]
.fi
.in -0.5i
.sp
@@ -1196,7 +1198,7 @@ for more information about bug reporting.
.SH "CALC WEB SITE"
\&
.br
Landon Noll maintains the the
Landon Noll maintains the
.B calc
web site is located at:
.sp

View File

@@ -18,8 +18,8 @@
# 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.10 $
# @(#) $Id: calc.spec.in,v 30.10 2013/05/05 11:57:44 chongo Exp $
# @(#) $Revision: 30.12 $
# @(#) $Id: calc.spec.in,v 30.12 2013/09/02 03:04:26 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/calc.spec.in,v $
#
# Under source code control: 2003/02/16 20:21:39
@@ -37,7 +37,7 @@
Summary: Arbitrary precision calculator.
Name: calc
Version: <<<PROJECT_VERSION>>>
Release: 10
Release: 11
License: LGPL
Group: Applications/Engineering
Source: http://www.isthe.com/chongo/src/calc/%{name}-%{version}.tar.bz2
@@ -76,38 +76,59 @@ For the latest calc release, see the project home page:
%build
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 %{?_smp_mflags} 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 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 %{?_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
echo '-=- calc.spec ending make calc-static-only -=-'
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 %{?_smp_mflags} 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 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 %{?_smp_mflags} 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 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 %{?_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=
echo '-=- calc.spec ending make calc-dynamic-only -=-'
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 %{?_smp_mflags} 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 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 %{?_smp_mflags} 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 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 %{?_smp_mflags} T=%{_buildroot} 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 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 %{?_smp_mflags} 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 -=-'
%install
echo '-=- calc.spec beginning make install -=-'
rm -rf %{_buildroot}
mkdir -p %{_buildroot}
make T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc MANDIR=%{_mandir}/man1 EXT= V=@ install
make 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 -=-'
%clean
@@ -125,7 +146,7 @@ rm -rf %{_buildroot}
%attr(644, root, root) %{_datadir}/%{name}/custom/*.cal
%attr(644, root, root) %{_datadir}/%{name}/help/*
%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}/libcustcalc.so
@@ -140,6 +161,9 @@ rm -rf %{_buildroot}
%attr(644, root, root) %{_libdir}/libcustcalc.a
%changelog
* Sun Sep 01 2013 Landon Curt Noll http://www.isthe.com/chongo
- Release: 11
- only list %{_datadir}/%{name}/set8700.line not *.line
* Sat May 05 2013 Landon Curt Noll http://www.isthe.com/chongo
- Release: 10
- Major bug rpm build process bug fix

View File

@@ -17,8 +17,8 @@
# 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.1 $
# @(#) $Id: calcerr.tbl,v 30.1 2007/03/16 11:09:46 chongo Exp $
# @(#) $Revision: 30.4 $
# @(#) $Id: calcerr.tbl,v 30.4 2013/09/02 01:38:08 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/calcerr.tbl,v $
#
# Under source code control: 1996/05/23 17:38:44
@@ -32,6 +32,16 @@
#
# 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_0OVER0 Indeterminate (0/0)
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_FGETFILE3 Unable to set file position in fgetfile
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,9 +18,9 @@
# 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.1 $
# @(#) $Id: check.awk,v 30.1 2007/03/16 11:09:46 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/check.awk,v $
# @(#) $Revision: 30.2 $
# @(#) $Id: check.awk,v 30.2 2013/08/11 01:08:32 chongo Exp $
# @(#) $Source: /usr/local/src/cmd/calc/RCS/check.awk,v $
#
# Under source code control: 1996/05/25 22:07:58
# File existed as early as: 1996
@@ -30,7 +30,7 @@
#
# 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
# 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.
#
BEGIN {

View File

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

View File

@@ -19,8 +19,8 @@
* 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.2 $
* @(#) $Id: config.c,v 30.2 2007/07/05 13:30:38 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $Id: config.c,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/config.c,v $
*
* 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) {
temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) {
math_error("Illegal truth value for redecl_warn");
math_error("Illegal truth value for "
"redecl_warn");
/*NOTREACHED*/
}
conf->redecl_warn = (int)temp;
@@ -962,7 +963,8 @@ setconfig(int type, VALUE *vp)
} else if (vp->v_type == V_STR) {
temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) {
math_error("Illegal truth value for dupvar_warn");
math_error("Illegal truth value for "
"dupvar_warn");
/*NOTREACHED*/
}
conf->dupvar_warn = (int)temp;
@@ -1153,7 +1155,8 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
vp->v_type = V_STR;
p = lookup_name(modes, cfg->outmode2);
if (p == NULL) {
math_error("invalid secondary output mode: %d", cfg->outmode2);
math_error("invalid secondary output mode: %d",
cfg->outmode2);
/*NOTREACHED*/
}
vp->v_str = makenewstring(p);

View File

@@ -17,8 +17,8 @@
# 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: Makefile,v 30.3 2007/09/21 01:27:27 chongo Exp $
# @(#) $Revision: 30.4 $
# @(#) $Id: Makefile,v 30.4 2013/08/11 08:41:38 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/cscript/RCS/Makefile,v $
#
# Under source code control: 1999/11/29 11:10:26
@@ -315,7 +315,9 @@ depend:
if [ X"$$i" != X"/dev/null" ]; then \
echo "$$i: $$i.calc"; \
echo ' @$${RM} -f $$@'; \
echo ' @$${SED} -e "1s:^#!/usr/local/src/cmd/calc/calc:#!$${BINDIR}/calc:" $$?>$$@'; \
echo -n ' @$${SED} -e "1s:'; \
echo "^#!/usr/local/src/cmd/calc/calc:#!$${BINDIR}/calc:" \
$$?>$$@'; \
echo ' @$${CHMOD} +x $$@'; \
fi; \
done >> makedep.out
@@ -323,7 +325,8 @@ depend:
${Q} echo forming new cscript/${MAKE_FILE}
${Q} ${RM} -f ${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} ${CAT} makedep.out >> ${MAKE_FILE}
${Q} ${RM} -f makedep.out

View File

@@ -18,8 +18,8 @@
# 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.25 $
# @(#) $Id: Makefile.head,v 30.25 2013/05/05 10:21:52 chongo Exp $
# @(#) $Revision: 30.31 $
# @(#) $Id: Makefile.head,v 30.31 2013/09/27 08:55:28 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/custom/RCS/Makefile.head,v $
#
# Under source code control: 1997/03/09 02:28:54
@@ -366,7 +366,7 @@ EXT=
# The default calc versions
#
VERSION= 2.12.4.7
VERSION= 2.12.4.13
VERS= 2.12.4
VER= 2.12
VE= 2
@@ -473,16 +473,16 @@ LDFLAGS= ${LD_DEBUG} ${ILDFLAGS}
# BLD_TYPE= calc-static-only
#
# 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
# 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
#
# 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
# 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
#
# NOTE: The above 4 values are unused if BLD_TYPE= calc-dynamic-only
@@ -495,8 +495,8 @@ LDFLAGS= ${LD_DEBUG} ${ILDFLAGS}
# to abort on warnings, then leave CCWERR blank.
# CCMISC are misc flags given to ${CC}
#
# LCC how the the C compiler is invoked on locally executed intermediate progs
# CC is how the the C compiler is invoked (with an optional Purify)
# LCC is how the C compiler is invoked on locally executed intermediate programs
# CC is how the C compiler is invoked (with an optional Purify)
#
# Specific target overrides or modifications to default values
@@ -576,7 +576,7 @@ CCMISC= ${DARWIN_ARCH}
LCC= MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} gcc
CC= ${PURIFY} ${LCC} ${CCWERR}
#
# Darmin dynamic shared lib filenames
# Darwin dynamic shared lib filenames
LIB_EXT:= .dylib
LIB_EXT_VERSION:= .${VERSION}${LIB_EXT}
LIB_EXT_VERS:= .${VERS}${LIB_EXT}
@@ -779,10 +779,10 @@ CC= ${PURIFY} ${LCC} ${CCWERR}
#
# The simple makefile forces the use of static ${CC} flags
#
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs
# ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# CFLAGS are given to ${CC} for calc programs other than intermediate programs
# ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc programs other than intermediate programs
#
ICFLAGS= ${COMMON_CFLAGS} ${CC_STATIC}
CFLAGS= ${ICFLAGS} ${CCOPT}
@@ -882,8 +882,8 @@ endif
# Required flags to compile C files for calc
#
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs
# ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# 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
#
@@ -896,8 +896,8 @@ CFLAGS= ${ICFLAGS} ${CCOPT}
# Required flags to link files for calc
#
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs
# ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc programs other than intermediate programs
#
ILDFLAGS= ${COMMON_LDFLAGS}
LDFLAGS= ${LD_DEBUG} ${ILDFLAGS}
@@ -1136,7 +1136,8 @@ depend:
${Q} echo forming new custom/${MAKE_FILE}
${Q} ${RM} -f ${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} ${RM} -rf skel
-${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \
@@ -1333,7 +1334,8 @@ install: all
${RM} -f ${T}${CUSTOMHELPDIR}/$$i.new; \
${CP} -f $$i ${T}${CUSTOMHELPDIR}/$$i.new; \
${CHMOD} 0444 ${T}${CUSTOMHELPDIR}/$$i.new; \
${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new ${T}${CUSTOMHELPDIR}/$$i; \
${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new \
${T}${CUSTOMHELPDIR}/$$i; \
echo "installed ${T}${CUSTOMHELPDIR}/$$i"; \
fi; \
done

View File

@@ -18,8 +18,8 @@
# 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.25 $
# @(#) $Id: Makefile.head,v 30.25 2013/05/05 10:21:52 chongo Exp $
# @(#) $Revision: 30.31 $
# @(#) $Id: Makefile.head,v 30.31 2013/09/27 08:55:28 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/custom/RCS/Makefile.head,v $
#
# Under source code control: 1997/03/09 02:28:54
@@ -366,7 +366,7 @@ EXT=
# The default calc versions
#
VERSION= 2.12.4.7
VERSION= 2.12.4.13
VERS= 2.12.4
VER= 2.12
VE= 2

View File

@@ -18,8 +18,8 @@
# 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.25 $
# @(#) $Id: Makefile.head,v 30.25 2013/05/05 10:21:52 chongo Exp $
# @(#) $Revision: 30.31 $
# @(#) $Id: Makefile.head,v 30.31 2013/09/27 08:55:28 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/custom/RCS/Makefile.head,v $
#
# Under source code control: 1997/03/09 02:28:54
@@ -351,7 +351,7 @@ EXT=
# The default calc versions
#
VERSION= 2.12.4.7
VERSION= 2.12.4.13
VERS= 2.12.4
VER= 2.12
VE= 2
@@ -433,16 +433,16 @@ COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
# BLD_TYPE= calc-static-only
#
# 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
# 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
#
# 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
# 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
#
# NOTE: The above 4 values are unused if BLD_TYPE= calc-dynamic-only
@@ -455,8 +455,8 @@ COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
# to abort on warnings, then leave CCWERR blank.
# CCMISC are misc flags given to ${CC}
#
# LCC how the the C compiler is invoked on locally executed intermediate progs
# CC is how the the C compiler is invoked (with an optional Purify)
# LCC is how the C compiler is invoked on locally executed intermediate programs
# CC is how the C compiler is invoked (with an optional Purify)
#
# Specific target overrides or modifications to default values
@@ -495,10 +495,10 @@ CC= ${PURIFY} ${LCC} ${CCWERR}
#
# The simple makefile forces the use of static ${CC} flags
#
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs
# ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# CFLAGS are given to ${CC} for calc programs other than intermediate programs
# ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc programs other than intermediate programs
#
ICFLAGS= ${COMMON_CFLAGS} ${CC_STATIC}
CFLAGS= ${ICFLAGS} ${CCOPT}
@@ -729,7 +729,8 @@ depend:
${Q} echo forming new custom/${MAKE_FILE}
${Q} ${RM} -f ${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} ${RM} -rf skel
-${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \
@@ -923,7 +924,8 @@ install: all
${RM} -f ${T}${CUSTOMHELPDIR}/$$i.new; \
${CP} -f $$i ${T}${CUSTOMHELPDIR}/$$i.new; \
${CHMOD} 0444 ${T}${CUSTOMHELPDIR}/$$i.new; \
${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new ${T}${CUSTOMHELPDIR}/$$i; \
${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new \
${T}${CUSTOMHELPDIR}/$$i; \
echo "installed ${T}${CUSTOMHELPDIR}/$$i"; \
fi; \
done

View File

@@ -227,7 +227,8 @@ depend:
${Q} echo forming new custom/${MAKE_FILE}
${Q} ${RM} -f ${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} ${RM} -rf skel
-${Q} if ${CMP} -s ${MAKE_FILE}.bak ${MAKE_FILE}; then \
@@ -424,7 +425,8 @@ install: all
${RM} -f ${T}${CUSTOMHELPDIR}/$$i.new; \
${CP} -f $$i ${T}${CUSTOMHELPDIR}/$$i.new; \
${CHMOD} 0444 ${T}${CUSTOMHELPDIR}/$$i.new; \
${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new ${T}${CUSTOMHELPDIR}/$$i; \
${MV} -f ${T}${CUSTOMHELPDIR}/$$i.new \
${T}${CUSTOMHELPDIR}/$$i; \
echo "installed ${T}${CUSTOMHELPDIR}/$$i"; \
fi; \
done

View File

@@ -17,8 +17,8 @@
* 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.2 $
* @(#) $Id: c_sysinfo.c,v 30.2 2007/07/05 19:35:20 chongo Exp $
* @(#) $Revision: 30.4 $
* @(#) $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 $
*
* 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 */
};
STATIC struct infoname sys_info[] = {
{"S100", "slots in an subtractive 100 table", NULL, (FULL)S100},
{"BASE", "base for calculations", NULL, (FULL)BASE},
{"BASE1", "one less than base", NULL, (FULL)BASE},
{"BASEB", "bits in the calculation base", NULL, (FULL)BASEB},
{"BASEDIG", "number of digits in base", NULL, (FULL)BASEDIG},
{"BIG_ENDIAN", "Most Significant Byte first symbol", NULL, (FULL)BIG_ENDIAN},
{"BLK_CHUNKSIZE", "default allocation chunk size for blocks", NULL, (FULL)BLK_CHUNKSIZE},
{"BLK_DEF_MAXPRINT", "default block octets to print", NULL, (FULL)BLK_DEF_MAXPRINT},
{"BLUM_PREGEN", "non-default predefined Blum generators", NULL, (FULL)BLUM_PREGEN},
{"CALCEXT", "extension for files read in", CALCEXT, (FULL)0},
{"CALC_BYTE_ORDER", "Byte order (LITTLE_ENDIAN or BIG_ENDIAN)", NULL, (FULL)CALC_BYTE_ORDER},
{"CUSTOMHELPDIR", "location of the custom help directory", CUSTOMHELPDIR, (FULL)0},
{"DEFAULTCALCBINDINGS", "default key bindings file", DEFAULTCALCBINDINGS, (FULL)0},
{"DEFAULTCALCHELP", "help file that -h prints", DEFAULTCALCHELP, (FULL)0},
{"DEFAULTCALCPAGER", "default pager", DEFAULTCALCPAGER, (FULL)0},
{"DEFAULTCALCPATH", "default :-separated search path", DEFAULTCALCPATH, (FULL)0},
{"DEFAULTCALCRC", "default :-separated startup file list", DEFAULTCALCRC, (FULL)0},
{"DEFAULTSHELL", "default shell to use", DEFAULTSHELL, (FULL)0},
{"DEV_BITS", "device number size in bits", NULL, (FULL)DEV_BITS},
{"DISPLAY_DEFAULT", "default digits for float display", NULL, (FULL)DISPLAY_DEFAULT},
{"EPSILONPREC_DEFAULT", "2^-EPSILON_DEFAULT <= EPSILON_DEFAULT", NULL, (FULL)EPSILONPREC_DEFAULT},
{"EPSILON_DEFAULT", "allowed error for float calculations", EPSILON_DEFAULT, (FULL)0},
{"ERRMAX", "default errmax value", NULL, (FULL)ERRMAX},
{"E_USERDEF", "base of user defined errors", NULL, (FULL)E_USERDEF},
{"E__BASE", "calc errors start above here", NULL, (FULL)E__BASE},
{"E__COUNT", "number of calc errors", NULL, (FULL)E__COUNT},
{"E__HIGHEST", "highest calc error", NULL, (FULL)E__HIGHEST},
{"FALSE", "boolean false", NULL, (FULL)FALSE},
{"FILEPOS_BITS", "file position size in bits", NULL, (FULL)FILEPOS_BITS},
{"FULL_BITS", "bits in a FULL", NULL, (FULL)FULL_BITS},
{"HELPDIR", "location of the help directory", HELPDIR, (FULL)0},
{"HIST_BINDING_FILE", "Default binding file", HIST_BINDING_FILE, (FULL)0},
{"HIST_SIZE", "Default history size", NULL, (FULL)HIST_SIZE},
{"INIT_J", "initial 1st walking a55 table index", NULL, (FULL)INIT_J},
{"INIT_K", "initial 2nd walking a55 table index", NULL, (FULL)INIT_K},
{"INODE_BITS", "inode number size in bits", NULL, (FULL)INODE_BITS},
{"LITTLE_ENDIAN", "Least Significant Byte first symbol", NULL, (FULL)LITTLE_ENDIAN},
{"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS},
{"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT},
{"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL, (FULL)MAX_CALCRC},
{"MAXCMD", "max length of command invocation", NULL, (FULL)MAXCMD},
{"MAXDIM", "max number of dimensions in matrices", NULL, (FULL)MAXDIM},
{"MAXERROR", "max length of error message string", NULL, (FULL)MAXERROR},
{"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},
{"S100", "slots in an subtractive 100 table", NULL,
(FULL)S100},
{"BASE", "base for calculations", NULL,
(FULL)BASE},
{"BASE1", "one less than base", NULL,
(FULL)BASE},
{"BASEB", "bits in the calculation base", NULL,
(FULL)BASEB},
{"BASEDIG", "number of digits in base", NULL,
(FULL)BASEDIG},
{"BIG_ENDIAN", "Most Significant Byte first symbol", NULL,
(FULL)BIG_ENDIAN},
{"BLK_CHUNKSIZE", "default allocation chunk size for blocks", NULL,
(FULL)BLK_CHUNKSIZE},
{"BLK_DEF_MAXPRINT", "default block octets to print", NULL,
(FULL)BLK_DEF_MAXPRINT},
{"BLUM_PREGEN", "non-default predefined Blum generators", NULL,
(FULL)BLUM_PREGEN},
{"CALCEXT", "extension for files read in", CALCEXT,
(FULL)0},
{"CALC_BYTE_ORDER", "Byte order (LITTLE_ENDIAN or BIG_ENDIAN)", NULL,
(FULL)CALC_BYTE_ORDER},
{"CUSTOMHELPDIR", "location of the custom help directory", CUSTOMHELPDIR,
(FULL)0},
{"DEFAULTCALCBINDINGS", "default key bindings file", DEFAULTCALCBINDINGS,
(FULL)0},
{"DEFAULTCALCHELP", "help file that -h prints", DEFAULTCALCHELP,
(FULL)0},
{"DEFAULTCALCPAGER", "default pager", DEFAULTCALCPAGER,
(FULL)0},
{"DEFAULTCALCPATH", "default :-separated search path", DEFAULTCALCPATH,
(FULL)0},
{"DEFAULTCALCRC", "default :-separated startup file list", DEFAULTCALCRC,
(FULL)0},
{"DEFAULTSHELL", "default shell to use", DEFAULTSHELL,
(FULL)0},
{"DEV_BITS", "device number size in bits", NULL,
(FULL)DEV_BITS},
{"DISPLAY_DEFAULT", "default digits for float display", NULL,
(FULL)DISPLAY_DEFAULT},
{"EPSILONPREC_DEFAULT", "2^-EPSILON_DEFAULT <= EPSILON_DEFAULT", NULL,
(FULL)EPSILONPREC_DEFAULT},
{"EPSILON_DEFAULT", "allowed error for float calculations",
EPSILON_DEFAULT, (FULL)0},
{"ERRMAX", "default errmax value", NULL,
(FULL)ERRMAX},
{"E_USERDEF", "base of user defined errors", NULL,
(FULL)E_USERDEF},
{"E__BASE", "calc errors start above here", NULL,
(FULL)E__BASE},
{"E__COUNT", "number of calc errors", NULL,
(FULL)E__COUNT},
{"E__HIGHEST", "highest calc error", NULL,
(FULL)E__HIGHEST},
{"FALSE", "boolean false", NULL,
(FULL)FALSE},
{"FILEPOS_BITS", "file position size in bits", NULL,
(FULL)FILEPOS_BITS},
{"FULL_BITS", "bits in a FULL", NULL,
(FULL)FULL_BITS},
{"HELPDIR", "location of the help directory", HELPDIR,
(FULL)0},
{"HIST_BINDING_FILE", "Default binding file", HIST_BINDING_FILE,
(FULL)0},
{"HIST_SIZE", "Default history size", NULL,
(FULL)HIST_SIZE},
{"INIT_J", "initial 1st walking a55 table index", NULL,
(FULL)INIT_J},
{"INIT_K", "initial 2nd walking a55 table index", NULL,
(FULL)INIT_K},
{"INODE_BITS", "inode number size in bits", NULL,
(FULL)INODE_BITS},
{"LITTLE_ENDIAN", "Least Significant Byte first symbol",
NULL, (FULL)LITTLE_ENDIAN},
{"LONG_BITS", "bit length of a long", NULL,
(FULL)LONG_BITS},
{"MAP_POPCNT", "number of odd primes in pr_map", NULL,
(FULL)MAP_POPCNT},
{"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL,
(FULL)MAX_CALCRC},
{"MAXCMD", "max length of command invocation", NULL,
(FULL)MAXCMD},
{"MAXDIM", "max number of dimensions in matrices", NULL,
(FULL)MAXDIM},
{"MAXERROR", "max length of error message string", NULL,
(FULL)MAXERROR},
{"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 */
{NULL, NULL, NULL, (FULL)0}

View File

@@ -17,8 +17,8 @@
* 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.1 $
* @(#) $Id: pmodm127.cal,v 30.1 2007/03/16 11:10:04 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $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 $
*
* 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 */
if (pmod(2, m127, q) != custom("pmodm127", 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));
}
}
@@ -133,5 +134,6 @@ define pmodm127_test2(testcnt, seed)
}
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
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
#define name. For conveience, the case infoname does not matter,
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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.1 $
## @(#) $Id: sysinfo,v 30.1 2007/03/16 11:10:04 chongo Exp $
## @(#) $Revision: 30.2 $
## @(#) $Id: sysinfo,v 30.2 2013/08/17 01:57:37 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/custom/RCS/sysinfo,v $
##
## Under source code control: 1997/03/09 23:14:40

7
decl.h
View File

@@ -19,8 +19,8 @@
* 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: decl.h,v 30.3 2008/04/15 21:17:57 chongo Exp $
* @(#) $Revision: 30.4 $
* @(#) $Id: decl.h,v 30.4 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/decl.h,v $
*
* Under source code control: 2007/02/09 05:24:25
@@ -100,7 +100,8 @@
/* Perform printf-style argument type checking for known compilers */
#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
# define PRINTF_FORMAT(fmt_idx, arg_idx)
#endif

View File

@@ -1,7 +1,7 @@
/*
* endian - determine the byte order of a long on your machine
*
* Copyright (C) 1999 Landon Curt Noll
* Copyright (C) 1999-2013 Landon Curt Noll
*
* Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License
@@ -17,8 +17,8 @@
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.3 $
* @(#) $Id: endian.c,v 30.3 2010/09/02 09:47:46 chongo Exp $
* @(#) $Revision: 30.4 $
* @(#) $Id: endian.c,v 30.4 2013/05/05 13:57:08 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/endian.c,v $
*
* Under source code control: 1993/11/15 04:32:58
@@ -54,7 +54,9 @@ int
main(void)
{
/* pointers into the byte order array */
#if defined(DEBUG) || (!defined(BIG_ENDIAN) && !defined(BIG_ENDIAN))
int *intp = (int *)byte;
#endif
#if defined(DEBUG)
short *shortp = (short *)byte;
long *longp = (long *)byte;

13
file.c
View File

@@ -19,8 +19,8 @@
* 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.2 $
* @(#) $Id: file.c,v 30.2 2007/07/05 13:30:38 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $Id: file.c,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/file.c,v $
*
* 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:
* name file name
@@ -2026,7 +2027,8 @@ showfiles(void)
* strptr pointer to where the new field pointer may be found
*/
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 */
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
*/
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 */
unsigned long len; /* current length of string */

7
file.h
View File

@@ -19,8 +19,8 @@
* 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.1 $
* @(#) $Id: file.h,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $Id: file.h,v 30.3 2013/09/01 22:16:21 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/file.h,v $
*
* Under source code control: 1996/05/24 05:55:58
@@ -96,7 +96,8 @@ E_FUNC int fgetposid(FILEID id, FILEPOS *ptr);
E_FUNC int fsetposid(FILEID id, FILEPOS *ptr);
E_FUNC int get_open_siz(FILE *fp, ZVALUE *res);
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__ */

470
func.c
View File

@@ -19,8 +19,8 @@
* 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: func.c,v 30.3 2008/04/15 21:17:57 chongo Exp $
* @(#) $Revision: 30.9 $
* @(#) $Id: func.c,v 30.9 2013/09/02 01:38:08 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/func.c,v $
*
* Under source code control: 1990/02/15 01:48:15
@@ -2062,7 +2062,8 @@ f_ln(int count, VALUE **vals)
}
switch (vals[0]->v_type) {
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_type = V_NUM;
return result;
@@ -2107,7 +2108,8 @@ f_log(int count, VALUE **vals)
}
switch (vals[0]->v_type) {
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_type = V_NUM;
return result;
@@ -4175,6 +4177,24 @@ f_strcmp(VALUE *v1, VALUE *v2)
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
f_strncmp(VALUE *v1, VALUE *v2, VALUE *v3)
@@ -4207,6 +4227,69 @@ f_strncmp(VALUE *v1, VALUE *v2, VALUE *v3)
result.v_num = itoq((long) flag);
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
@@ -4394,6 +4477,307 @@ f_ord(VALUE *vp)
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
f_protect(int count, VALUE **vals)
@@ -4842,7 +5226,8 @@ f_rsearch(int count, VALUE **vals)
i = listrsearch(v1->v_list, v2, l_start, l_end, &indx);
break;
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;
case V_STR:
i = stringrsearch(v1->v_str, v2->v_str, l_start,
@@ -8130,7 +8515,8 @@ STATIC CONST struct builtin builtins[] = {
{"ceil", 1, 1, 0, OP_NOP, 0, f_ceil,
"smallest integer greater than or equal to number"},
{"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,
"simplify number using continued fractions"},
{"char", 1, 1, 0, OP_NOP, 0, f_char,
@@ -8230,7 +8616,8 @@ STATIC CONST struct builtin builtins[] = {
{"fgets", 1, 1, 0, OP_NOP, 0, f_fgets,
"read next line from file, newline is kept"},
{"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,
"return opened file or max number of opened files"},
{"floor", 1, 1, 0, OP_NOP, 0, f_floor,
@@ -8238,7 +8625,8 @@ STATIC CONST struct builtin builtins[] = {
{"fopen", 2, 2, 0, OP_NOP, 0, f_fopen,
"open file name a in mode b"},
{"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,
"print formatted output to opened file"},
{"fputc", 2, 2, 0, OP_NOP, 0, f_fputc,
@@ -8262,9 +8650,11 @@ STATIC CONST struct builtin builtins[] = {
{"freopen", 2, 3, 0, OP_NOP, 0, f_freopen,
"reopen a file stream to a named file"},
{"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,
"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,
"seek to position b (offset from c) in file a"},
{"fsize", 1, 1, 0, OP_NOP, 0, f_fsize,
@@ -8282,7 +8672,8 @@ STATIC CONST struct builtin builtins[] = {
{"getenv", 1, 1, 0, OP_NOP, 0, f_getenv,
"value of environment variable (or NULL)"},
{"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,
"return list of specified number at head of a list"},
{"highbit", 1, 1, 0, OP_HIGHBIT, 0, 0,
@@ -8376,7 +8767,8 @@ STATIC CONST struct builtin builtins[] = {
{"istype", 2, 2, 0, OP_ISTYPE, 0, 0,
"whether the type of a is same as the type of b"},
{"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 one or more lists into one list"},
{"lcm", 1, IN, 0, OP_NOP, f_lcm, 0,
@@ -8449,8 +8841,31 @@ STATIC CONST struct builtin builtins[] = {
"numerator of fraction"},
{"ord", 1, 1, 0, OP_NOP, 0, f_ord,
"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,
"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,
"permutation number a!/(a-b)!"},
{"prevcand", 1, 5, 0, OP_NOP, f_prevcand, 0,
@@ -8470,7 +8885,8 @@ STATIC CONST struct builtin builtins[] = {
{"polar", 2, 3, 0, OP_NOP, 0, f_polar,
"complex value of polar coordinate (a * exp(b*1i))"},
{"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 value from front of list"},
{"popcnt", 1, 2, 0, OP_NOP, f_popcnt, 0,
@@ -8492,7 +8908,8 @@ STATIC CONST struct builtin builtins[] = {
{"quo", 2, 3, 0, OP_NOP, 0, f_quo,
"integer quotient of a by b, rounding type c"},
{"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,
"additive 55 random number [0,2^64), [0,a), or [a,b)"},
{"randbit", 0, 1, 0, OP_NOP, f_randbit, 0,
@@ -8528,7 +8945,8 @@ STATIC CONST struct builtin builtins[] = {
{"round", 1, 3, 0, OP_NOP, 0, f_round,
"round value a to b number of decimal places"},
{"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,
"user and kernel mode cpu time in seconds"},
{"saveval", 1, 1, 0, OP_SAVEVAL, 0, 0,
@@ -8536,11 +8954,14 @@ STATIC CONST struct builtin builtins[] = {
{"scale", 2, 2, 0, OP_SCALE, 0, 0,
"scale value up or down by a power of two"},
{"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,
"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 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 of a within accuracy b"},
{"sech", 1, 2, 0, OP_NOP, 0, f_sech,
@@ -8581,10 +9002,16 @@ STATIC CONST struct builtin builtins[] = {
"assign value to stoponerror flag"},
{"str", 1, 1, 0, OP_NOP, 0, f_str,
"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,
"concatenate strings together"},
{"strcmp", 2, 2, 0, OP_NOP, 0, f_strcmp,
"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,
"copy string to string"},
{"strerror", 0, 1, 0, OP_NOP, 0, f_strerror,
@@ -8593,6 +9020,8 @@ STATIC CONST struct builtin builtins[] = {
"length of string"},
{"strncmp", 3, 3, 0, OP_NOP, 0, f_strncmp,
"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,
"copy up to c characters from string to string"},
{"strpos", 2, 2, 0, OP_NOP, 0, f_strpos,
@@ -8775,7 +9204,8 @@ builtinfunc(long index, int argcount, VALUE *stck)
vpp = valargs;
for (i = 0; i < argcount; i++) {
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*/
}
numargs[i] = (*vpp)->v_num;

7
hash.c
View File

@@ -17,8 +17,8 @@
* 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.2 $
* @(#) $Id: hash.c,v 30.2 2007/07/05 17:37:41 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $Id: hash.c,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/hash.c,v $
*
* 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);
(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;
vp++) {

View File

@@ -17,8 +17,8 @@
* 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.2 $
* @(#) $Id: have_posscl.c,v 30.2 2008/04/15 21:17:57 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $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 $
*
* Under source code control: 1996/07/13 12:57:22
@@ -85,7 +85,8 @@ main(void)
printf("#undef HAVE_FILEPOS_SCALAR\n");
printf("#define HAVE_FILEPOS_SCALAR /* FILEPOS is a simple value */\n");
#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
/* exit(0); */
return 0;

View File

@@ -17,8 +17,8 @@
* 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.1 $
* @(#) $Id: have_stdvs.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $Id: have_stdvs.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/have_stdvs.c,v $
*
* Under source code control: 1995/09/09 22:41:10
@@ -57,7 +57,8 @@
#endif
#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
#else
# define VSPRINTF_SIZE_T long
@@ -160,8 +161,10 @@ main(void)
puts("/*");
puts(" * SIMULATE_STDARG");
puts(" *");
puts(" * WARNING: This type of stdarg makes assumptions about the stack");
puts(" * that may not be true on your system. You may want to");
puts(" * WARNING: This type of stdarg makes assumptions "
"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(" */");
puts("typedef char *va_list;");
@@ -169,7 +172,8 @@ main(void)
puts("#define va_end(ap) (void)((ap) = 0)");
puts("#define va_arg(ap, type) \\");
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
puts("#define STDARG /* use <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.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @(#) $Revision: 30.1 $
* @(#) $Id: have_varvs.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $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 $
*
* Under source code control: 1995/09/09 22:41:10
@@ -53,7 +53,8 @@
#endif
#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
#else
# define VSPRINTF_SIZE_T long

8
help.c
View File

@@ -17,9 +17,9 @@
* 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.2 $
* @(#) $Id: help.c,v 30.2 2007/09/21 01:27:27 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/help.c,v $
* @(#) $Revision: 30.3 $
* @(#) $Id: help.c,v 30.3 2013/08/11 01:08:32 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/help.c,v $
*
* Under source code control: 1997/09/14 10:58:30
* File existed as early as: 1997
@@ -274,7 +274,7 @@ givehelp(char *type)
#if defined(CUSTOM)
/*
* open the the helpfile (looking in CUSTOMHELPDIR last)
* open the helpfile (looking in CUSTOMHELPDIR last)
*/
} else {

View File

@@ -18,8 +18,8 @@
# 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.5 $
# @(#) $Id: Makefile,v 30.5 2007/09/21 01:27:27 chongo Exp $
# @(#) $Revision: 30.9 $
# @(#) $Id: Makefile,v 30.9 2013/09/02 02:55:19 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/help/RCS/Makefile,v $
#
# 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_14}
# The detailed list of help files to install
#
# This list is prodiced by the detaillist rule when no WARNINGS are detected.
#
# Please use:
#
# make detaillist
# make detail_help_list
#
# to keep this list in nice sorted order and to check that these
# non-special help files are under RCS control.
#
DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \
appr arg argv arrow asec asech asin asinh assign atan atan2 atanh \
avg base base2 bernoulli bit blk blkcpy blkfree blocks bround btrunc \
calc_tty calclevel calcpath catalan ceil cfappr cfsim char cmdbuf \
cmp comb conj cos cosh cot coth count cp csc csch ctime delete den \
dereference det digit digits display dp epsilon errcount errmax \
errno error estr euler eval exp fact factor fclose fcnt feof ferror \
fflush fgetc fgetfield fgetfile fgetline fgets fgetstr fib files \
floor fopen forall fpathopen fprintf fputc fputs fputstr frac free \
freebernoulli freeeuler freeglobals freeredc freestatics frem freopen \
fscan fscanf fseek fsize ftell gcd gcdrem gd getenv hash head highbit \
hmean hnrmod hypot ilog ilog10 ilog2 im indices inputlevel insert int \
inverse iroot isassoc isatty isblk isconfig isdefined iserror iseven \
isfile ishash isident isint islist ismat ismult isnull isnum isobj \
isobjtype isodd isprime isptr isqrt isrand israndom isreal isrel \
issimple issq isstr istype jacobi join lcm lcmfact lfactor ln log \
lowbit ltol makelist matdim matfill matmax matmin matsum mattrace \
mattrans max memsize meq min minv mmin mne mod modify name near \
newerror nextcand nextprime norm null num oldvalue ord param perm \
pfact pi pix places pmod polar poly pop popcnt pound power prevcand \
prevprime printf prompt protect ptest push putenv quo quomod rand \
randbit random randombit randperm rcin rcmul rcout rcpow rcsq re \
remove reverse rewind rm root round rsearch runtime saveval scale \
scan scanf search sec sech seed segment select sgn sha1 sin \
sinh size sizeof sleep sort sqrt srand srandom ssq stoponerror \
str strcat strcmp strcpy strerror strlen strncmp strncpy strpos \
strprintf strscan strscanf substr sum swap system systime tail tan \
tanh test time trunc usertime version xor
DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address \
agd append appr arg argv arrow asec asech asin asinh assign atan \
atan2 atanh avg base base2 bernoulli bit blk blkcpy blkfree blocks \
bround btrunc calc_tty calclevel calcpath catalan ceil cfappr cfsim \
char cmdbuf cmp comb conj cos cosh cot coth count cp csc csch ctime \
delete den dereference det digit digits display dp epsilon errcount \
errmax errno error estr euler eval exp fact factor fclose fcnt \
feof ferror fflush fgetc fgetfield fgetfile fgetline fgets fgetstr \
fib files floor fopen forall fpathopen fprintf fputc fputs fputstr \
frac free freebernoulli freeeuler freeglobals freeredc freestatics \
frem freopen fscan fscanf fseek fsize ftell gcd gcdrem gd getenv \
hash head highbit hmean hnrmod hypot ilog ilog10 ilog2 im indices \
inputlevel insert int inverse iroot isalnum isalpha isassoc isatty \
isblk iscntrl isconfig isdefined isdigit iserror iseven isfile \
isgraph ishash isident isint islist islower ismat ismult isnull \
isnum isobj isobjtype isodd isprime isprint isptr ispunct isqrt \
isrand israndom isreal isrel issimple isspace issq isstr istype \
isupper isxdigit jacobi join lcm lcmfact lfactor ln log lowbit ltol \
makelist matdim matfill matmax matmin matsum mattrace mattrans max \
memsize meq min minv mmin mne mod modify name near newerror nextcand \
nextprime norm null num oldvalue ord param perm pfact pi pix places \
pmod polar poly pop popcnt pound power prevcand prevprime printf \
prompt protect ptest push putenv quo quomod rand randbit random \
randombit randperm rcin rcmul rcout rcpow rcsq re remove reverse \
rewind rm root round rsearch runtime saveval scale scan scanf \
search sec sech seed segment select sgn sha1 sin sinh size sizeof \
sleep sort sqrt srand srandom ssq stoponerror str strcasecmp strcat \
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
# built from DETAIL_HELP files.
@@ -633,11 +637,26 @@ bsdi: all
${RM} -f 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:
${Q} -(echo "xxxxx"; \
for i in ${DETAIL_HELP} /dev/null; do \
# NOTE: The ${DETAIL_HELP} list does not include special help files.
#
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 [ ! -f RCS/$$i,v ]; then \
echo "WARNING: $$i not under RCS control" 1>&2; \
@@ -645,8 +664,10 @@ detaillist:
echo $$i; \
fi; \
fi; \
done | LANG=C ${SORT}) | ${FMT} -70 | \
${SED} -e '1s/xxxxx/DETAIL_HELP=/' -e '2,$$s/^/ /' \
done; \
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/ \\$$//'
##

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:
@@ -31,8 +31,8 @@ chongo <was here> /\../\
## 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.1 $
## @(#) $Id: archive,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Revision: 30.2 $
## @(#) $Id: archive,v 30.2 2013/08/11 01:08:32 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/archive,v $
##
## Under source code control: 1996/06/13 02:51:48

View File

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

View File

@@ -30,8 +30,8 @@ DESCRIPTION
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.
If limit >= 2^32, factor(n, limit) causes an error and factor(n,
limit, err) returns the value of err.
If limit >= 2^32, factor(n, limit) causes an error and
factor(n, limit, err) returns the value of err.
EXAMPLE
; 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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.1 $
## @(#) $Id: factor,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Revision: 30.2 $
## @(#) $Id: factor,v 30.2 2013/08/18 20:15:13 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/factor,v $
##
## Under source code control: 1995/12/18 12:34:57

View File

@@ -1,5 +1,5 @@
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
fpathopen(filename, mode [,searchpath])
@@ -165,7 +165,8 @@ EXAMPLE
FILE 7 "/home/chongo/tmp/output" (writing, pos 0)
; 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
LIMITS
@@ -195,8 +196,8 @@ SEE ALSO
## 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.1 $
## @(#) $Id: fpathopen,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Revision: 30.2 $
## @(#) $Id: fpathopen,v 30.2 2013/08/11 08:41:38 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/fpathopen,v $
##
## Under source code control: 2006/05/07 23:56:04

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_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_sub 2
xx_neg 1 negative
@@ -144,9 +145,11 @@ Using objects
xx_abs 2 absolute value within given error
xx_norm 1 square of absolute value
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_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_quo 3 integer quotient
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.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: obj.file,v 30.3 2010/09/02 06:36:21 chongo Exp $
## @(#) $Revision: 30.4 $
## @(#) $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 $
##
## Under source code control: 1991/07/21 04:37:22

View File

@@ -264,7 +264,7 @@ DESCRIPTION
to having their Blum moduli factored, depending in their size,
by small PCs in a reasonable to large supercomputers/highly
parallel processors over a long time. Their value lies in their
speed relative the the default Blum generator. As of Feb 1997,
speed relative the default Blum generator. As of Feb 1997,
the Blum moduli associated with 13 <= newn < 20 appear to
be well beyond the scope of hardware and algorithms,
and 9 <= newn < 12 might be factorable with extreme difficulty.
@@ -354,8 +354,8 @@ SEE ALSO
## 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.1 $
## @(#) $Id: srandom,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Revision: 30.2 $
## @(#) $Id: srandom,v 30.2 2013/08/11 01:08:32 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/srandom,v $
##
## Under source code control: 1997/02/17 01:18:22

68
help/strcasecmp Normal file
View File

@@ -0,0 +1,68 @@
NAME
strcasecmp - compare two strings, case independent
SYNOPSIS
strcasecmp(s1, s2)
TYPES
s1 string
s2 string
return integer (1, 0 or -1)
DESCRIPTION
Let n1 = size(s1), n2 = size(s2) and m = min(n1, n2).
This function compares up to m values of consecutive characters
in the strings s1 and s2. If an inequality is encountered, the
function returns 1 or -1 according as the greater character is
in s1 or s2. If there has been no inequality, the function
returns 1, 0, or -1 according as n1 is greater than, equal to,
or less than n2.
Note that null characters within the strings are included in the
comparison.
This function is case independent
EXAMPLE
strcasecmp("ab", "aBc") == -1
strcasecmp("abc", "aBb") == 1
strcasecmp("abc", "abc") == 0
strcasecmp("abc", "aBc") == 0
strcasecmp("abc", "aBd") == -1
strcasecmp("abc\0", "aBc") == 1
strcasecmp("a\0b", "A\0c") == -1
LIMITS
none
LINK LIBRARY
FLAG stringcaserel(STRING *s1, STRING *s2)
SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strncasecmp strncpy, strpos,
strprintf, strscan, strscanf, substr
## 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: strcasecmp,v 30.3 2013/09/01 21:23:25 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strcasecmp,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

@@ -1,66 +1,66 @@
NAME
strcmp - compare two strings in the customary ordering of strings
SYNOPSIS
strcmp(s1, s2)
TYPES
s1 string
s2 string
return integer (1, 0 or -1)
DESCRIPTION
Let n1 = size(s1), n2 = size(s2) and m = min(n1, n2).
This function compares up to m values of consecutive characters
in the strings s1 and s2. If an inequality is encountered, the
function returns 1 or -1 according as the greater character is
in s1 or s2. If there has been no inequality, the function
returns 1, 0, or -1 according as n1 is greater than, equal to,
or less than n2.
Note that null characters within the strings are included in the
comparison.
EXAMPLE
strcmp("ab", "abc") == -1
strcmp("abc", "abb") == 1
strcmp("abc", "abc") == 0
strcmp("abc", "abd") == -1
strcmp("abc\0", "abc") == 1
strcmp("a\0b", "a\0c") == -1
LIMITS
none
LINK LIBRARY
FLAG stringrel(STRING *s1, STRING *s2)
SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strncpy, strpos,
strprintf, strscan, strscanf, substr
## Copyright (C) 2006 Ernest Bowen
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 30.1 $
## @(#) $Id: strcmp,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strcmp,v $
##
## Under source code control: 2006/03/03 03:32:44
## File existed as early as: 2006
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
NAME
strcmp - compare two strings in the customary ordering of strings
SYNOPSIS
strcmp(s1, s2)
TYPES
s1 string
s2 string
return integer (1, 0 or -1)
DESCRIPTION
Let n1 = size(s1), n2 = size(s2) and m = min(n1, n2).
This function compares up to m values of consecutive characters
in the strings s1 and s2. If an inequality is encountered, the
function returns 1 or -1 according as the greater character is
in s1 or s2. If there has been no inequality, the function
returns 1, 0, or -1 according as n1 is greater than, equal to,
or less than n2.
Note that null characters within the strings are included in the
comparison.
EXAMPLE
strcmp("ab", "abc") == -1
strcmp("abc", "abb") == 1
strcmp("abc", "abc") == 0
strcmp("abc", "abd") == -1
strcmp("abc\0", "abc") == 1
strcmp("a\0b", "a\0c") == -1
LIMITS
none
LINK LIBRARY
FLAG stringrel(STRING *s1, STRING *s2)
SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strncpy, strpos,
strprintf, strscan, strscanf, substr
## Copyright (C) 2006 Ernest Bowen
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: strcmp,v 30.3 2013/08/11 01:16:03 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strcmp,v $
##
## Under source code control: 2006/03/03 03:32:44
## File existed as early as: 2006
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

View File

@@ -1,68 +1,68 @@
NAME
strcpy - copy head or all of a string to head or all of a string
SYNOPSIS
strcpy(s1, s2)
TYPES
s1 string
s2 string
return string
DESCRIPTION
Let n1 = size(s1), n2 = size(n2), and m = min(n1, n2).
This function replaces the first m characters of s1 by the first
m characters of s2, and if m < n1, replaces the next character of
s1 by '\0'. The size of s1 and any later characters of s1 are unchanged.
s1, with its new value, is returned.
Unlike the C Library function with the same name, this function does
not require n1 to be greater than or equal to n2, but if this is so,
normal printing of the returned value will give the same result as
normal printing of s2.
EXAMPLE
strcpy("", "xyz") == ""
strcpy("a", "xyz") == "x"
strcpy("ab", "xyz") == "xy"
strcpy("abc", "xyz") == "xyz"
strcpy("abcd", "xyz") == "xyz\0"
strcpy("abcde", "xyz") == "xyz\0e"
strcpy("abcdef", "xyz") == "xyz\0ef"
strcpy("abc", "") == "\0bc"
LIMITS
none
LINK LIBRARY
STRING* stringcpy(STRING *s1, STRING *s2)
SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strncpy, strpos,
strprintf, strscan, strscanf, substr
## Copyright (C) 2006 Ernest Bowen
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 30.1 $
## @(#) $Id: strcpy,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strcpy,v $
##
## Under source code control: 2006/03/03 03:32:44
## File existed as early as: 2006
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
NAME
strcpy - copy head or all of a string to head or all of a string
SYNOPSIS
strcpy(s1, s2)
TYPES
s1 string
s2 string
return string
DESCRIPTION
Let n1 = size(s1), n2 = size(n2), and m = min(n1, n2).
This function replaces the first m characters of s1 by the first
m characters of s2, and if m < n1, replaces the next character of
s1 by '\0'. The size of s1 and any later characters of s1 are unchanged.
s1, with its new value, is returned.
Unlike the C Library function with the same name, this function does
not require n1 to be greater than or equal to n2, but if this is so,
normal printing of the returned value will give the same result as
normal printing of s2.
EXAMPLE
strcpy("", "xyz") == ""
strcpy("a", "xyz") == "x"
strcpy("ab", "xyz") == "xy"
strcpy("abc", "xyz") == "xyz"
strcpy("abcd", "xyz") == "xyz\0"
strcpy("abcde", "xyz") == "xyz\0e"
strcpy("abcdef", "xyz") == "xyz\0ef"
strcpy("abc", "") == "\0bc"
LIMITS
none
LINK LIBRARY
STRING* stringcpy(STRING *s1, STRING *s2)
SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strncpy, strpos,
strprintf, strscan, strscanf, substr
## Copyright (C) 2006 Ernest Bowen
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: strcpy,v 30.3 2013/08/11 01:16:03 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strcpy,v $
##
## Under source code control: 2006/03/03 03:32:44
## File existed as early as: 2006
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

71
help/strncasecmp Normal file
View File

@@ -0,0 +1,71 @@
NAME
strncasecmp - compare two strings up to n characters, case independent
SYNOPSIS
strncasecmp(s1, s2, n)
TYPES
s1 string
s2 string
n nonnegative integer
return integer (1, 0 or -1)
DESCRIPTION
Let n1 = size(s1), n2 = size(s2) and m = min(n1, n2, n).
This function compares up to m values of consecutive characters
in the strings s1 and s2. If an inequality is encountered, the
function returns 1 or -1 according as the greater character is
in s1 or s2. If there has been no inequality, the function
returns 1, 0, or -1 according as min(n1, n) is greater than, equal
to, or less than min(n2, n); in particular, if n1 and n2 are
both greater than equal to n, 0 is returned.
This function is case independent.
EXAMPLE
strncasecmp("abc", "xyz", 0) == 0
strncasecmp("abc", "xyz", 1) == -1
strncasecmp("abc", "", 1) == 1
strncasecmp("a", "b", 2) == -1
strncasecmp("ab", "Ac", 2) == -1
strncasecmp("\0ac", "\0b", 2) == -1
strncasecmp("ab", "aBc", 2) == 0
strncasecmp("abc", "abd", 2) == 0
LIMITS
none
LINK LIBRARY
This function uses FLAG stringcaserel(STRING *s1, STRING *s2),
temporarily replacing the string sizes by min(n1,n) and min(n2,n).
SEE ALSO
strcat, strcpy, strerror, strlen, strncpy, strpos, strcasecmp
strprintf, strscan, strscanf, substr
## 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: strncasecmp,v 30.3 2013/09/01 20:08:38 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strncasecmp,v $
##
## Under source code control: 2013/09/01 20:04:02
## 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

@@ -1,71 +1,71 @@
NAME
strncmp - compare two strings up to a specified number of characters
SYNOPSIS
strncmp(s1, s2, n)
TYPES
s1 string
s2 string
n nonnegative integer
return integer (1, 0 or -1)
DESCRIPTION
Let n1 = size(s1), n2 = size(s2) and m = min(n1, n2, n).
This function compares up to m values of consecutive characters
in the strings s1 and s2. If an inequality is encountered, the
function returns 1 or -1 according as the greater character is
in s1 or s2. If there has been no inequality, the function
returns 1, 0, or -1 according as min(n1, n) is greater than, equal
to, or less than min(n2, n); in particular, if n1 and n2 are
both greater than equal to n, 0 is returned.
EXAMPLE
strncmp("abc", "xyz", 0) == 0
strncmp("abc", "xyz", 1) == -1
strncmp("abc", "", 1) == 1
strncmp("a", "b", 2) == -1
strncmp("ab", "ac", 2) == -1
strncmp("\0ac", "\0b", 2) == -1
strncmp("ab", "abc", 2) == 0
strncmp("abc", "abd", 2) == 0
LIMITS
none
LINK LIBRARY
This function uses FLAG stringrel(STRING *s1, STRING *s2),
temporarily replacing the string sizes by min(n1,n) and min(n2,n).
SEE ALSO
strcat, strcpy, strerror, strlen, strncpy, strpos,
strprintf, strscan, strscanf, substr
## Copyright (C) 2006 Ernest Bowen
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 30.1 $
## @(#) $Id: strncmp,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strncmp,v $
##
## Under source code control: 2006/03/03 03:32:44
## File existed as early as: 2006
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
NAME
strncmp - compare two strings up to a specified number of characters
SYNOPSIS
strncmp(s1, s2, n)
TYPES
s1 string
s2 string
n nonnegative integer
return integer (1, 0 or -1)
DESCRIPTION
Let n1 = size(s1), n2 = size(s2) and m = min(n1, n2, n).
This function compares up to m values of consecutive characters
in the strings s1 and s2. If an inequality is encountered, the
function returns 1 or -1 according as the greater character is
in s1 or s2. If there has been no inequality, the function
returns 1, 0, or -1 according as min(n1, n) is greater than, equal
to, or less than min(n2, n); in particular, if n1 and n2 are
both greater than equal to n, 0 is returned.
EXAMPLE
strncmp("abc", "xyz", 0) == 0
strncmp("abc", "xyz", 1) == -1
strncmp("abc", "", 1) == 1
strncmp("a", "b", 2) == -1
strncmp("ab", "ac", 2) == -1
strncmp("\0ac", "\0b", 2) == -1
strncmp("ab", "abc", 2) == 0
strncmp("abc", "abd", 2) == 0
LIMITS
none
LINK LIBRARY
This function uses FLAG stringrel(STRING *s1, STRING *s2),
temporarily replacing the string sizes by min(n1,n) and min(n2,n).
SEE ALSO
strcat, strcpy, strerror, strlen, strncpy, strpos,
strprintf, strscan, strscanf, substr
## Copyright (C) 2006 Ernest Bowen
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: strncmp,v 30.3 2013/08/11 01:16:03 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strncmp,v $
##
## Under source code control: 2006/03/03 03:32:44
## File existed as early as: 2006
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

View File

@@ -1,66 +1,66 @@
NAME
strncpy - copy a number of chracters from head or all of a stringr
to head or all of a string
SYNOPSIS
strncpy(s1, s2, n)
TYPES
s1 string
s2 string
n nonnegative integer
return string
DESCRIPTION
Let n1 = size(s1), n2 = size(n2), and m = min(n1, n2, n).
This function replaces the first m characters of s1 by the first
m characters of s2, and if min(n1, n) > n2, replaces the next
min(n1,n) - n2 characters of s1 by '\0'. The size of s1 and any
later characters of s1 are unchanged. The function returns s1, with
new value.
EXAMPLE
strncpy("abcdef", "xyz", 0) == "abcdef"
strncpy("abcdef", "xyz", 1) == "xbcdef"
strncpy("abcdef", "xyz", 2) == "xycdef"
strncpy("abcdef", "xyz", 3) == "xyzdef"
strncpy("abcdef", "xyz", 4) == "xyz\0ef"
strncpy("abcdef", "xyz", 5) == "xyz\0\0f"
strncpy("ab", "xyz", 3) == "xy"
LIMITS
none
LINK LIBRARY
STRING* stringncpy(STRING *s1, STRING *s2, long num)
SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strpos,
strprintf, strscan, strscanf, substr
## Copyright (C) 2006 Ernest Bowen
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 30.1 $
## @(#) $Id: strncpy,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strncpy,v $
##
## Under source code control: 2006/03/03 03:32:44
## File existed as early as: 2006
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
NAME
strncpy - copy a number of chracters from head or all of a stringr
to head or all of a string
SYNOPSIS
strncpy(s1, s2, n)
TYPES
s1 string
s2 string
n nonnegative integer
return string
DESCRIPTION
Let n1 = size(s1), n2 = size(n2), and m = min(n1, n2, n).
This function replaces the first m characters of s1 by the first
m characters of s2, and if min(n1, n) > n2, replaces the next
min(n1,n) - n2 characters of s1 by '\0'. The size of s1 and any
later characters of s1 are unchanged. The function returns s1, with
new value.
EXAMPLE
strncpy("abcdef", "xyz", 0) == "abcdef"
strncpy("abcdef", "xyz", 1) == "xbcdef"
strncpy("abcdef", "xyz", 2) == "xycdef"
strncpy("abcdef", "xyz", 3) == "xyzdef"
strncpy("abcdef", "xyz", 4) == "xyz\0ef"
strncpy("abcdef", "xyz", 5) == "xyz\0\0f"
strncpy("ab", "xyz", 3) == "xy"
LIMITS
none
LINK LIBRARY
STRING* stringncpy(STRING *s1, STRING *s2, long num)
SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strpos,
strprintf, strscan, strscanf, substr
## Copyright (C) 2006 Ernest Bowen
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
##
## @(#) $Revision: 30.3 $
## @(#) $Id: strncpy,v 30.3 2013/08/11 01:16:03 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strncpy,v $
##
## Under source code control: 2006/03/03 03:32:44
## File existed as early as: 2006
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

View File

@@ -69,7 +69,7 @@ DESCRIPTION
might be taken to suggest a number like +2345; 'r' might suggest
a representation like -27/49; 'e' might suggest a representation like
1.24e-7; 'f' might suggest a representation like 27.145. However, there
is no test that the the result conforms to the specifier. Whatever
is no test that the result conforms to the specifier. Whatever
the specifier in these cases, the result depends on the characters read
until a space or other exceptional character is read. The
characters read may include one or more occurrences of +, -, * as
@@ -131,8 +131,8 @@ SEE ALSO
## 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.1 $
## @(#) $Id: strscanf,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Revision: 30.2 $
## @(#) $Id: strscanf,v 30.2 2013/08/11 01:08:32 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/strscanf,v $
##
## Under source code control: 1996/04/30 03:05:18

47
help/strtolower Normal file
View File

@@ -0,0 +1,47 @@
NAME
strtolower - transform an ASCII string to lower case
SYNOPSIS
strtolower(x_1)
TYPES
str string
x_1 any
return string
DESCRIPTION
All ASCII upper case letters get transformed into lower case letters. This
function can be locale dependent.
The function returns the lowercase'd string.
EXAMPLE
; strtolower(" GNU Lesser General Public License");
" gnu lesser general public license"
LIMITS
none.
LINK LIBRARY
none
SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strncpy, strpos,
strprintf, strscanf, substr
## 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.

47
help/strtoupper Normal file
View File

@@ -0,0 +1,47 @@
NAME
strtoupper - transform an ASCII string to upper case
SYNOPSIS
strtoupper(x_1)
TYPES
str string
x_1 any
return string
DESCRIPTION
All ASCII lower case letters get transformed into upper case letters. This
function can be locale dependent.
The function returns the lowercase'd string.
EXAMPLE
; strtoupper(" GNU Lesser General Public License");
" GNU LESSER GENERAL PUBLIC LICENSE"
LIMITS
none.
LINK LIBRARY
none
SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strncpy, strpos,
strprintf, strscanf, substr, strtoupper
## 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.

View File

@@ -17,7 +17,7 @@ DESCRIPTION
x.y
where x, y, z, w, v are integers (without leading 0's) and,
t is the the liternal character 't'.
t is the liternal character 't'.
EXAMPLE
; version()
@@ -48,8 +48,8 @@ SEE ALSO
## 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.1 $
## @(#) $Id: version,v 30.1 2007/03/16 11:10:42 chongo Exp $
## @(#) $Revision: 30.2 $
## @(#) $Id: version,v 30.2 2013/08/11 01:08:32 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/version,v $
##
## Under source code control: 2001/05/28 17:38:01

18
input.c
View File

@@ -17,8 +17,8 @@
* 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.2 $
* @(#) $Id: input.c,v 30.2 2008/04/15 21:17:57 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $Id: input.c,v 30.3 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/input.c,v $
*
* Under source code control: 1990/02/15 01:48:16
@@ -258,7 +258,7 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once)
/*
* f_pathopen - open an absolute filename, or a relative filename along a search path
* f_pathopen - open an absolute or relative filename along a search path
*
* Open a file by possibly searching through a path list. For example:
*
@@ -277,13 +277,16 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once)
* and opens the first one that exists and allows the mode.
*
* name file name to be read
* mode fopen() mode argument (one of "r", "w", "a", "r+", "w+", "a+")
* mode fopen() mode argument
* (one of "r", "w", "a", "r+", "w+", "a+")
* pathlist list of colon separated paths (or NULL)
* openpath if non-NULL, and file was opened, set to malloced path used to open
* openpath if non-NULL, and file was opened, set to malloced
* path used to open
*
* returns:
* open file stream, NULL ==> file was not found or error
* If file was open and openpath was non-NULL, changed to point to path used to open
* If file was open and openpath was non-NULL, changed to point
* to path used to open
*/
FILE *
f_pathopen(char *name, char *mode, char *pathlist, char **openpath)
@@ -478,7 +481,8 @@ homeexpand(char *name)
*
* given:
* name the filename to open
* mode fopen() mode argument (one of "r", "w", "a", "r+", "w+", "a+")
* mode fopen() mode argument
* (one of "r", "w", "a", "r+", "w+", "a+")
*/
FILE *
f_open(char *name, char *mode)

View File

@@ -17,8 +17,8 @@
* 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.1 $
* @(#) $Id: longbits.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $Id: longbits.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/longbits.c,v $
*
* Under source code control: 1994/03/18 03:06:18
@@ -203,7 +203,8 @@ main(int argc, char **argv)
"* signed 64 bits *");
putchar('\n');
printf("/%s/\n","* how to form 64 bit constants *");
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || \
defined(__cplusplus)
printf("#define U(x) x ## ULL\n");
printf("#define L(x) x ## LL\n");
#else
@@ -307,7 +308,8 @@ main(int argc, char **argv)
"* signed 64 bits *");
putchar('\n');
printf("/%s/\n","* how to form 64 bit constants *");
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || \
defined(__cplusplus)
printf("#define U(x) x ## UL\n");
printf("#define L(x) x ## L\n");
#else
@@ -324,7 +326,8 @@ main(int argc, char **argv)
"* signed 64 bits *");
putchar('\n');
printf("/%s/\n","* how to form 64 bit constants *");
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || \
defined(__cplusplus)
printf("#define U(x) x ## ULL\n");
printf("#define L(x) x ## LL\n");
#else

142
obj.c
View File

@@ -17,8 +17,8 @@
* 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.1 $
* @(#) $Id: obj.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.3 $
* @(#) $Id: obj.c,v 30.3 2013/09/01 22:16:21 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/obj.c,v $
*
* Under source code control: 1990/02/15 01:48:19
@@ -71,51 +71,96 @@ STATIC struct objectinfo {
char *name; /* name of function to call */
char *comment; /* useful comment if any */
} objectinfo[] = {
{1, A_UNDEF, ERR_PRINT, "print", "print value, default prints elements"},
{1, A_VALUE, ERR_ONE, "one", "multiplicative identity, default is 1"},
{1, A_INT, ERR_TEST, "test", "logical test (false,true => 0,1), default tests elements"},
{2, A_VALUE, ERR_NONE, "add", NULL},
{2, A_VALUE, ERR_NONE, "sub", NULL},
{1, A_VALUE, ERR_NONE, "neg", "negative"},
{2, A_VALUE, ERR_NONE, "mul", NULL},
{2, A_VALUE, ERR_NONE, "div", "non-integral division"},
{1, A_VALUE, ERR_NONE, "inv", "multiplicative inverse"},
{2, A_VALUE, ERR_NONE, "abs", "absolute value within given error"},
{1, A_VALUE, ERR_NONE, "norm", "square of absolute value"},
{1, A_VALUE, ERR_NONE, "conj", "conjugate"},
{2, A_VALUE, ERR_POW, "pow", "integer power, default does multiply, square, inverse"},
{1, A_VALUE, ERR_NONE, "sgn", "sign of value (-1, 0, 1)"},
{2, A_INT, ERR_CMP, "cmp", "equality (equal,nonequal => 0,1), default tests elements"},
{2, A_VALUE, ERR_NONE, "rel", "relative order, positive for >, etc."},
{3, A_VALUE, ERR_NONE, "quo", "integer quotient"},
{3, A_VALUE, ERR_NONE, "mod", "remainder of division"},
{1, A_VALUE, ERR_NONE, "int", "integer part"},
{1, A_VALUE, ERR_NONE, "frac", "fractional part"},
{1, A_VALUE, ERR_INC, "inc", "increment, default adds 1"},
{1, A_VALUE, ERR_DEC, "dec", "decrement, default subtracts 1"},
{1, A_VALUE, ERR_SQUARE,"square", "default multiplies by itself"},
{2, A_VALUE, ERR_NONE, "scale", "multiply by power of 2"},
{2, A_VALUE, ERR_NONE, "shift", "shift left by n bits (right if negative)"},
{3, A_VALUE, ERR_NONE, "round", "round to given number of decimal places"},
{3, A_VALUE, ERR_NONE, "bround", "round to given number of binary places"},
{3, A_VALUE, ERR_NONE, "root", "root of value within given error"},
{3, A_VALUE, ERR_NONE, "sqrt", "square root within given error"},
{2, A_VALUE, ERR_NONE, "or", "bitwise or"},
{2, A_VALUE, ERR_NONE, "and", "bitwise and"},
{1, A_VALUE, ERR_NONE, "not", "logical not"},
{1, A_VALUE, ERR_NONE, "fact", "factorial or postfix !"},
{1, A_VALUE, ERR_VALUE, "min", "value for min(...)"},
{1, A_VALUE, ERR_VALUE, "max", "value for max(...)"},
{1, A_VALUE, ERR_VALUE, "sum", "value for sum(...)"},
{2, A_UNDEF, ERR_ASSIGN, "assign", "assign, defaults to a = b"},
{2, A_VALUE, ERR_NONE, "xor", "value for binary ~"},
{1, A_VALUE, ERR_NONE, "comp", "value for unary ~"},
{1, A_VALUE, ERR_NONE, "content", "unary hash op"},
{2, A_VALUE, ERR_NONE, "hashop", "binary hash op"},
{1, A_VALUE, ERR_NONE, "backslash", "unary backslash op"},
{2, A_VALUE, ERR_NONE, "setminus", "binary backslash op"},
{1, A_VALUE, ERR_NONE, "plus", "unary + op"},
{0, 0, 0, NULL, NULL}
{1, A_UNDEF, ERR_PRINT,
"print", "print value, default prints elements"},
{1, A_VALUE, ERR_ONE,
"one", "multiplicative identity, default is 1"},
{1, A_INT, ERR_TEST,
"test", "logical test (false,true => 0,1), default tests elements"},
{2, A_VALUE, ERR_NONE,
"add", NULL},
{2, A_VALUE, ERR_NONE,
"sub", NULL},
{1, A_VALUE, ERR_NONE,
"neg", "negative"},
{2, A_VALUE, ERR_NONE,
"mul", NULL},
{2, A_VALUE, ERR_NONE,
"div", "non-integral division"},
{1, A_VALUE, ERR_NONE,
"inv", "multiplicative inverse"},
{2, A_VALUE, ERR_NONE,
"abs", "absolute value within given error"},
{1, A_VALUE, ERR_NONE,
"norm", "square of absolute value"},
{1, A_VALUE, ERR_NONE,
"conj", "conjugate"},
{2, A_VALUE, ERR_POW,
"pow", "integer power, default does multiply, square, inverse"},
{1, A_VALUE, ERR_NONE,
"sgn", "sign of value (-1, 0, 1)"},
{2, A_INT, ERR_CMP,
"cmp", "equality (equal,nonequal => 0,1), default tests elements"},
{2, A_VALUE, ERR_NONE,
"rel", "relative order, positive for >, etc."},
{3, A_VALUE, ERR_NONE,
"quo", "integer quotient"},
{3, A_VALUE, ERR_NONE,
"mod", "remainder of division"},
{1, A_VALUE, ERR_NONE,
"int", "integer part"},
{1, A_VALUE, ERR_NONE,
"frac", "fractional part"},
{1, A_VALUE, ERR_INC,
"inc", "increment, default adds 1"},
{1, A_VALUE, ERR_DEC,
"dec", "decrement, default subtracts 1"},
{1, A_VALUE, ERR_SQUARE,
"square", "default multiplies by itself"},
{2, A_VALUE, ERR_NONE,
"scale", "multiply by power of 2"},
{2, A_VALUE, ERR_NONE,
"shift", "shift left by n bits (right if negative)"},
{3, A_VALUE, ERR_NONE,
"round", "round to given number of decimal places"},
{3, A_VALUE, ERR_NONE,
"bround", "round to given number of binary places"},
{3, A_VALUE, ERR_NONE,
"root", "root of value within given error"},
{3, A_VALUE, ERR_NONE,
"sqrt", "square root within given error"},
{2, A_VALUE, ERR_NONE,
"or", "bitwise or"},
{2, A_VALUE, ERR_NONE,
"and", "bitwise and"},
{1, A_VALUE, ERR_NONE,
"not", "logical not"},
{1, A_VALUE, ERR_NONE,
"fact", "factorial or postfix !"},
{1, A_VALUE, ERR_VALUE,
"min", "value for min(...)"},
{1, A_VALUE, ERR_VALUE,
"max", "value for max(...)"},
{1, A_VALUE, ERR_VALUE,
"sum", "value for sum(...)"},
{2, A_UNDEF, ERR_ASSIGN,
"assign", "assign, defaults to a = b"},
{2, A_VALUE, ERR_NONE,
"xor", "value for binary ~"},
{1, A_VALUE, ERR_NONE,
"comp", "value for unary ~"},
{1, A_VALUE, ERR_NONE,
"content", "unary hash op"},
{2, A_VALUE, ERR_NONE,
"hashop", "binary hash op"},
{1, A_VALUE, ERR_NONE,
"backslash", "unary backslash op"},
{2, A_VALUE, ERR_NONE,
"setminus", "binary backslash op"},
{1, A_VALUE, ERR_NONE,
"plus", "unary + op"},
{0, 0, 0,
NULL, NULL}
};
@@ -262,7 +307,8 @@ objcall(int action, VALUE *v1, VALUE *v2, VALUE *v3)
val.v_type = V_NULL;
break;
default:
math_error("Function \"%s\" is undefined", namefunc(index));
math_error("Function \"%s\" is undefined",
namefunc(index));
/*NOTREACHED*/
}
return val;

403
opcodes.c
View File

@@ -19,8 +19,8 @@
* 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: opcodes.c,v 30.4 2008/05/10 13:51:32 chongo Exp $
* @(#) $Revision: 30.5 $
* @(#) $Id: opcodes.c,v 30.5 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/opcodes.c,v $
*
* Under source code control: 1990/02/15 01:48:19
@@ -168,7 +168,8 @@ S_FUNC void
o_globaladdr(FUNC UNUSED *fp, GLOBAL *sp)
{
if (sp == NULL) {
math_error("Global variable \"%s\" not initialized", sp->g_name);
math_error("Global variable \"%s\" not initialized",
sp->g_name);
/*NOTREACHED*/
}
stack++;
@@ -3557,138 +3558,270 @@ showsizes(void)
* Information about each opcode.
*/
STATIC struct opcode opcodes[MAX_OPCODE+1] = {
{o_nop, OPNUL, "NOP"}, /* no operation */
{o_localaddr, OPLOC, "LOCALADDR"}, /* address of local variable */
{o_globaladdr, OPGLB, "GLOBALADDR"}, /* address of global variable */
{o_paramaddr, OPPAR, "PARAMADDR"}, /* address of parameter variable */
{o_localvalue, OPLOC, "LOCALVALUE"}, /* value of local variable */
{o_globalvalue, OPGLB, "GLOBALVALUE"}, /* value of global variable */
{o_paramvalue, OPPAR, "PARAMVALUE"}, /* value of parameter variable */
{o_number, OPONE, "NUMBER"}, /* constant real numeric value */
{o_indexaddr, OPTWO, "INDEXADDR"}, /* array index address */
{o_printresult, OPNUL, "PRINTRESULT"}, /* print result of top-level expression */
{o_assign, OPNUL, "ASSIGN"}, /* assign value to variable */
{o_add, OPNUL, "ADD"}, /* add top two values */
{o_sub, OPNUL, "SUB"}, /* subtract top two values */
{o_mul, OPNUL, "MUL"}, /* multiply top two values */
{o_div, OPNUL, "DIV"}, /* divide top two values */
{o_mod, OPNUL, "MOD"}, /* take mod of top two values */
{o_save, OPNUL, "SAVE"}, /* save value for later use */
{o_negate, OPNUL, "NEGATE"}, /* negate top value */
{o_invert, OPNUL, "INVERT"}, /* invert top value */
{o_int, OPNUL, "INT"}, /* take integer part */
{o_frac, OPNUL, "FRAC"}, /* take fraction part */
{o_numerator, OPNUL, "NUMERATOR"}, /* take numerator */
{o_denominator, OPNUL, "DENOMINATOR"}, /* take denominator */
{o_duplicate, OPNUL, "DUPLICATE"}, /* duplicate top value */
{o_pop, OPNUL, "POP"}, /* pop top value */
{o_return, OPRET, "RETURN"}, /* return value of function */
{o_jumpz, OPJMP, "JUMPZ"}, /* jump if value zero */
{o_jumpnz, OPJMP, "JUMPNZ"}, /* jump if value nonzero */
{o_jump, OPJMP, "JUMP"}, /* jump unconditionally */
{o_usercall, OPTWO, "USERCALL"}, /* call a user function */
{o_getvalue, OPNUL, "GETVALUE"}, /* convert address to value */
{o_eq, OPNUL, "EQ"}, /* test elements for equality */
{o_ne, OPNUL, "NE"}, /* test elements for inequality */
{o_le, OPNUL, "LE"}, /* test elements for <= */
{o_ge, OPNUL, "GE"}, /* test elements for >= */
{o_lt, OPNUL, "LT"}, /* test elements for < */
{o_gt, OPNUL, "GT"}, /* test elements for > */
{o_preinc, OPNUL, "PREINC"}, /* add one to variable (++x) */
{o_predec, OPNUL, "PREDEC"}, /* subtract one from variable (--x) */
{o_postinc, OPNUL, "POSTINC"}, /* add one to variable (x++) */
{o_postdec, OPNUL, "POSTDEC"}, /* subtract one from variable (x--) */
{o_debug, OPONE, "DEBUG"}, /* debugging point */
{o_print, OPONE, "PRINT"}, /* print value */
{o_assignpop, OPNUL, "ASSIGNPOP"}, /* assign to variable and pop it */
{o_zero, OPNUL, "ZERO"}, /* put zero on the stack */
{o_one, OPNUL, "ONE"}, /* put one on the stack */
{o_printeol, OPNUL, "PRINTEOL"}, /* print end of line */
{o_printspace, OPNUL, "PRINTSPACE"}, /* print a space */
{o_printstring, OPONE, "PRINTSTR"}, /* print constant string */
{o_dupvalue, OPNUL, "DUPVALUE"}, /* duplicate value of top value */
{o_oldvalue, OPNUL, "OLDVALUE"}, /* old value from previous calc */
{o_quo, OPNUL, "QUO"}, /* integer quotient of top values */
{o_power, OPNUL, "POWER"}, /* value raised to a power */
{o_quit, OPONE, "QUIT"}, /* quit program */
{o_call, OPTWO, "CALL"}, /* call built-in routine */
{o_getepsilon, OPNUL, "GETEPSILON"}, /* get allowed error for calculations */
{o_and, OPNUL, "AND"}, /* arithmetic and or top two values */
{o_or, OPNUL, "OR"}, /* arithmetic or of top two values */
{o_not, OPNUL, "NOT"}, /* logical not or top value */
{o_abs, OPNUL, "ABS"}, /* absolute value of top value */
{o_sgn, OPNUL, "SGN"}, /* sign of number */
{o_isint, OPNUL, "ISINT"}, /* whether number is an integer */
{o_condorjump, OPJMP, "CONDORJUMP"}, /* conditional or jump */
{o_condandjump, OPJMP, "CONDANDJUMP"}, /* conditional and jump */
{o_square, OPNUL, "SQUARE"}, /* square top value */
{o_string, OPONE, "STRING"}, /* string constant value */
{o_isnum, OPNUL, "ISNUM"}, /* whether value is a number */
{o_undef, OPNUL, "UNDEF"}, /* load undefined value on stack */
{o_isnull, OPNUL, "ISNULL"}, /* whether value is the null value */
{o_argvalue, OPARG, "ARGVALUE"}, /* load value of arg (parameter) n */
{o_matcreate, OPONE, "MATCREATE"}, /* create matrix */
{o_ismat, OPNUL, "ISMAT"}, /* whether value is a matrix */
{o_isstr, OPNUL, "ISSTR"}, /* whether value is a string */
{o_getconfig, OPNUL, "GETCONFIG"}, /* get value of configuration parameter */
{o_leftshift, OPNUL, "LEFTSHIFT"}, /* left shift of integer */
{o_rightshift, OPNUL, "RIGHTSHIFT"}, /* right shift of integer */
{o_casejump, OPJMP, "CASEJUMP"}, /* test case and jump if not matched */
{o_isodd, OPNUL, "ISODD"}, /* whether value is odd integer */
{o_iseven, OPNUL, "ISEVEN"}, /* whether value is even integer */
{o_fiaddr, OPNUL, "FIADDR"}, /* 'fast index' matrix address */
{o_fivalue, OPNUL, "FIVALUE"}, /* 'fast index' matrix value */
{o_isreal, OPNUL, "ISREAL"}, /* whether value is real number */
{o_imaginary, OPONE, "IMAGINARY"}, /* constant imaginary numeric value */
{o_re, OPNUL, "RE"}, /* real part of complex number */
{o_im, OPNUL, "IM"}, /* imaginary part of complex number */
{o_conjugate, OPNUL, "CONJUGATE"}, /* complex conjugate */
{o_objcreate, OPONE, "OBJCREATE"}, /* create object */
{o_isobj, OPNUL, "ISOBJ"}, /* whether value is an object */
{o_norm, OPNUL, "NORM"}, /* norm of value (square of abs) */
{o_elemaddr, OPONE, "ELEMADDR"}, /* address of element of object */
{o_elemvalue, OPONE, "ELEMVALUE"}, /* value of element of object */
{o_istype, OPNUL, "ISTYPE"}, /* whether types are the same */
{o_scale, OPNUL, "SCALE"}, /* scale value by a power of two */
{o_islist, OPNUL, "ISLIST"}, /* whether value is a list */
{o_swap, OPNUL, "SWAP"}, /* swap values of two variables */
{o_issimple, OPNUL, "ISSIMPLE"}, /* whether value is simple type */
{o_cmp, OPNUL, "CMP"}, /* compare values returning -1, 0, 1 */
{o_setconfig, OPNUL, "SETCONFIG"}, /* set configuration parameter */
{o_setepsilon, OPNUL, "SETEPSILON"}, /* set allowed error for calculations */
{o_isfile, OPNUL, "ISFILE"}, /* whether value is a file */
{o_isassoc, OPNUL, "ISASSOC"}, /* whether value is an association */
{o_nop, OPSTI, "INITSTATIC"}, /* once only code for static init */
{o_eleminit, OPONE, "ELEMINIT"}, /* assign element of matrix or object */
{o_isconfig, OPNUL, "ISCONFIG"}, /* whether value is a configuration state */
{o_ishash, OPNUL, "ISHASH"}, /* whether value is a hash state */
{o_isrand, OPNUL, "ISRAND"}, /* whether value is a rand element */
{o_israndom, OPNUL, "ISRANDOM"}, /* whether value is a random element */
{o_show, OPONE, "SHOW"}, /* show current state data */
{o_initfill, OPNUL, "INITFILL"}, /* initially fill matrix */
{o_assignback, OPNUL, "ASSIGNBACK"}, /* assign in reverse order */
{o_test, OPNUL, "TEST"}, /* test that value is "nonzero" */
{o_isdefined, OPNUL, "ISDEFINED"}, /* whether a string names a function */
{o_isobjtype, OPNUL, "ISOBJTYPE"}, /* whether a string names an object type */
{o_isblock, OPNUL, "ISBLK"}, /* whether value is a block */
{o_ptr, OPNUL, "PTR"}, /* octet pointer */
{o_deref, OPNUL, "DEREF"}, /* dereference an octet pointer */
{o_isoctet, OPNUL, "ISOCTET"}, /* whether a value is an octet */
{o_isptr, OPNUL, "ISPTR"}, /* whether a value is a pointer */
{o_setsaveval, OPNUL, "SAVEVAL"}, /* enable or disable saving */
{o_links, OPNUL, "LINKS"}, /* links to number or string */
{o_bit, OPNUL, "BIT"}, /* whether bit is set */
{o_comp, OPNUL, "COMP"}, /* complement value */
{o_xor, OPNUL, "XOR"}, /* xor (~) of values */
{o_highbit, OPNUL, "HIGHBIT"}, /* highbit of value */
{o_lowbit, OPNUL, "LOWBIT"}, /* lowbit of value */
{o_content, OPNUL, "CONTENT"}, /* unary hash op */
{o_hashop, OPNUL, "HASHOP"}, /* binary hash op */
{o_backslash, OPNUL, "BACKSLASH"}, /* unary backslash op */
{o_setminus, OPNUL, "SETMINUS"}, /* binary backslash op */
{o_plus, OPNUL, "PLUS"}, /* unary + op */
{o_jumpnn, OPJMP, "JUMPNN"}, /* jump if non-null */
{o_abort, OPONE, "ABORT"} /* abort operation */
{o_nop, OPNUL,
"NOP"}, /* no operation */
{o_localaddr, OPLOC,
"LOCALADDR"}, /* address of local variable */
{o_globaladdr, OPGLB,
"GLOBALADDR"}, /* address of global variable */
{o_paramaddr, OPPAR,
"PARAMADDR"}, /* address of parameter variable */
{o_localvalue, OPLOC,
"LOCALVALUE"}, /* value of local variable */
{o_globalvalue, OPGLB,
"GLOBALVALUE"}, /* value of global variable */
{o_paramvalue, OPPAR,
"PARAMVALUE"}, /* value of parameter variable */
{o_number, OPONE,
"NUMBER"}, /* constant real numeric value */
{o_indexaddr, OPTWO,
"INDEXADDR"}, /* array index address */
{o_printresult, OPNUL,
"PRINTRESULT"}, /* print result of top-level expression */
{o_assign, OPNUL,
"ASSIGN"}, /* assign value to variable */
{o_add, OPNUL,
"ADD"}, /* add top two values */
{o_sub, OPNUL,
"SUB"}, /* subtract top two values */
{o_mul, OPNUL,
"MUL"}, /* multiply top two values */
{o_div, OPNUL,
"DIV"}, /* divide top two values */
{o_mod, OPNUL,
"MOD"}, /* take mod of top two values */
{o_save, OPNUL,
"SAVE"}, /* save value for later use */
{o_negate, OPNUL,
"NEGATE"}, /* negate top value */
{o_invert, OPNUL,
"INVERT"}, /* invert top value */
{o_int, OPNUL,
"INT"}, /* take integer part */
{o_frac, OPNUL,
"FRAC"}, /* take fraction part */
{o_numerator, OPNUL,
"NUMERATOR"}, /* take numerator */
{o_denominator, OPNUL,
"DENOMINATOR"}, /* take denominator */
{o_duplicate, OPNUL,
"DUPLICATE"}, /* duplicate top value */
{o_pop, OPNUL,
"POP"}, /* pop top value */
{o_return, OPRET,
"RETURN"}, /* return value of function */
{o_jumpz, OPJMP,
"JUMPZ"}, /* jump if value zero */
{o_jumpnz, OPJMP,
"JUMPNZ"}, /* jump if value nonzero */
{o_jump, OPJMP,
"JUMP"}, /* jump unconditionally */
{o_usercall, OPTWO,
"USERCALL"}, /* call a user function */
{o_getvalue, OPNUL,
"GETVALUE"}, /* convert address to value */
{o_eq, OPNUL,
"EQ"}, /* test elements for equality */
{o_ne, OPNUL,
"NE"}, /* test elements for inequality */
{o_le, OPNUL,
"LE"}, /* test elements for <= */
{o_ge, OPNUL,
"GE"}, /* test elements for >= */
{o_lt, OPNUL,
"LT"}, /* test elements for < */
{o_gt, OPNUL,
"GT"}, /* test elements for > */
{o_preinc, OPNUL,
"PREINC"}, /* add one to variable (++x) */
{o_predec, OPNUL,
"PREDEC"}, /* subtract one from variable (--x) */
{o_postinc, OPNUL,
"POSTINC"}, /* add one to variable (x++) */
{o_postdec, OPNUL,
"POSTDEC"}, /* subtract one from variable (x--) */
{o_debug, OPONE,
"DEBUG"}, /* debugging point */
{o_print, OPONE,
"PRINT"}, /* print value */
{o_assignpop, OPNUL,
"ASSIGNPOP"}, /* assign to variable and pop it */
{o_zero, OPNUL,
"ZERO"}, /* put zero on the stack */
{o_one, OPNUL,
"ONE"}, /* put one on the stack */
{o_printeol, OPNUL,
"PRINTEOL"}, /* print end of line */
{o_printspace, OPNUL,
"PRINTSPACE"}, /* print a space */
{o_printstring, OPONE,
"PRINTSTR"}, /* print constant string */
{o_dupvalue, OPNUL,
"DUPVALUE"}, /* duplicate value of top value */
{o_oldvalue, OPNUL,
"OLDVALUE"}, /* old value from previous calc */
{o_quo, OPNUL,
"QUO"}, /* integer quotient of top values */
{o_power, OPNUL,
"POWER"}, /* value raised to a power */
{o_quit, OPONE,
"QUIT"}, /* quit program */
{o_call, OPTWO,
"CALL"}, /* call built-in routine */
{o_getepsilon, OPNUL,
"GETEPSILON"}, /* get allowed error for calculations */
{o_and, OPNUL,
"AND"}, /* arithmetic and or top two values */
{o_or, OPNUL,
"OR"}, /* arithmetic or of top two values */
{o_not, OPNUL,
"NOT"}, /* logical not or top value */
{o_abs, OPNUL,
"ABS"}, /* absolute value of top value */
{o_sgn, OPNUL,
"SGN"}, /* sign of number */
{o_isint, OPNUL,
"ISINT"}, /* whether number is an integer */
{o_condorjump, OPJMP,
"CONDORJUMP"}, /* conditional or jump */
{o_condandjump, OPJMP,
"CONDANDJUMP"}, /* conditional and jump */
{o_square, OPNUL,
"SQUARE"}, /* square top value */
{o_string, OPONE,
"STRING"}, /* string constant value */
{o_isnum, OPNUL,
"ISNUM"}, /* whether value is a number */
{o_undef, OPNUL,
"UNDEF"}, /* load undefined value on stack */
{o_isnull, OPNUL,
"ISNULL"}, /* whether value is the null value */
{o_argvalue, OPARG,
"ARGVALUE"}, /* load value of arg (parameter) n */
{o_matcreate, OPONE,
"MATCREATE"}, /* create matrix */
{o_ismat, OPNUL,
"ISMAT"}, /* whether value is a matrix */
{o_isstr, OPNUL,
"ISSTR"}, /* whether value is a string */
{o_getconfig, OPNUL,
"GETCONFIG"}, /* get value of configuration parameter */
{o_leftshift, OPNUL,
"LEFTSHIFT"}, /* left shift of integer */
{o_rightshift, OPNUL,
"RIGHTSHIFT"}, /* right shift of integer */
{o_casejump, OPJMP,
"CASEJUMP"}, /* test case and jump if not matched */
{o_isodd, OPNUL,
"ISODD"}, /* whether value is odd integer */
{o_iseven, OPNUL,
"ISEVEN"}, /* whether value is even integer */
{o_fiaddr, OPNUL,
"FIADDR"}, /* 'fast index' matrix address */
{o_fivalue, OPNUL,
"FIVALUE"}, /* 'fast index' matrix value */
{o_isreal, OPNUL,
"ISREAL"}, /* whether value is real number */
{o_imaginary, OPONE,
"IMAGINARY"}, /* constant imaginary numeric value */
{o_re, OPNUL,
"RE"}, /* real part of complex number */
{o_im, OPNUL,
"IM"}, /* imaginary part of complex number */
{o_conjugate, OPNUL,
"CONJUGATE"}, /* complex conjugate */
{o_objcreate, OPONE,
"OBJCREATE"}, /* create object */
{o_isobj, OPNUL,
"ISOBJ"}, /* whether value is an object */
{o_norm, OPNUL,
"NORM"}, /* norm of value (square of abs) */
{o_elemaddr, OPONE,
"ELEMADDR"}, /* address of element of object */
{o_elemvalue, OPONE,
"ELEMVALUE"}, /* value of element of object */
{o_istype, OPNUL,
"ISTYPE"}, /* whether types are the same */
{o_scale, OPNUL,
"SCALE"}, /* scale value by a power of two */
{o_islist, OPNUL,
"ISLIST"}, /* whether value is a list */
{o_swap, OPNUL,
"SWAP"}, /* swap values of two variables */
{o_issimple, OPNUL,
"ISSIMPLE"}, /* whether value is simple type */
{o_cmp, OPNUL,
"CMP"}, /* compare values returning -1, 0, 1 */
{o_setconfig, OPNUL,
"SETCONFIG"}, /* set configuration parameter */
{o_setepsilon, OPNUL,
"SETEPSILON"}, /* set allowed error for calculations */
{o_isfile, OPNUL,
"ISFILE"}, /* whether value is a file */
{o_isassoc, OPNUL,
"ISASSOC"}, /* whether value is an association */
{o_nop, OPSTI,
"INITSTATIC"}, /* once only code for static init */
{o_eleminit, OPONE,
"ELEMINIT"}, /* assign element of matrix or object */
{o_isconfig, OPNUL,
"ISCONFIG"}, /* whether value is a configuration state */
{o_ishash, OPNUL,
"ISHASH"}, /* whether value is a hash state */
{o_isrand, OPNUL,
"ISRAND"}, /* whether value is a rand element */
{o_israndom, OPNUL,
"ISRANDOM"}, /* whether value is a random element */
{o_show, OPONE,
"SHOW"}, /* show current state data */
{o_initfill, OPNUL,
"INITFILL"}, /* initially fill matrix */
{o_assignback, OPNUL,
"ASSIGNBACK"}, /* assign in reverse order */
{o_test, OPNUL,
"TEST"}, /* test that value is "nonzero" */
{o_isdefined, OPNUL,
"ISDEFINED"}, /* whether a string names a function */
{o_isobjtype, OPNUL,
"ISOBJTYPE"}, /* whether a string names an object type */
{o_isblock, OPNUL,
"ISBLK"}, /* whether value is a block */
{o_ptr, OPNUL,
"PTR"}, /* octet pointer */
{o_deref, OPNUL,
"DEREF"}, /* dereference an octet pointer */
{o_isoctet, OPNUL,
"ISOCTET"}, /* whether a value is an octet */
{o_isptr, OPNUL,
"ISPTR"}, /* whether a value is a pointer */
{o_setsaveval, OPNUL,
"SAVEVAL"}, /* enable or disable saving */
{o_links, OPNUL,
"LINKS"}, /* links to number or string */
{o_bit, OPNUL,
"BIT"}, /* whether bit is set */
{o_comp, OPNUL,
"COMP"}, /* complement value */
{o_xor, OPNUL,
"XOR"}, /* xor (~) of values */
{o_highbit, OPNUL,
"HIGHBIT"}, /* highbit of value */
{o_lowbit, OPNUL,
"LOWBIT"}, /* lowbit of value */
{o_content, OPNUL,
"CONTENT"}, /* unary hash op */
{o_hashop, OPNUL,
"HASHOP"}, /* binary hash op */
{o_backslash, OPNUL,
"BACKSLASH"}, /* unary backslash op */
{o_setminus, OPNUL,
"SETMINUS"}, /* binary backslash op */
{o_plus, OPNUL,
"PLUS"}, /* unary + op */
{o_jumpnn, OPJMP,
"JUMPNN"}, /* jump if non-null */
{o_abort, OPONE,
"ABORT"} /* abort operation */
};

10
qmath.c
View File

@@ -19,8 +19,8 @@
* 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.1 $
* @(#) $Id: qmath.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $Id: qmath.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/qmath.c,v $
*
* Under source code control: 1990/02/15 01:48:21
@@ -1260,9 +1260,9 @@ qrel(NUMBER *q1, NUMBER *q2)
if (qiszero(q1))
return -1;
/*
* Make a quick comparison by calculating the number of words resulting as
* if we multiplied through by the denominators, and then comparing the
* word counts.
* Make a quick comparison by calculating the number of words
* resulting as if we multiplied through by the denominators,
* and then comparing the word counts.
*/
sign = 1;
if (qisneg(q1))

View File

@@ -17,8 +17,8 @@
* 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.2 $
* @(#) $Id: qmath.h,v 30.2 2007/07/05 19:35:20 chongo Exp $
* @(#) $Revision: 30.4 $
* @(#) $Id: qmath.h,v 30.4 2013/09/01 22:16:21 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/qmath.h,v $
*
* Under source code control: 1993/07/30 19:42:47
@@ -165,7 +165,8 @@ E_FUNC long qilog2(NUMBER *q);
E_FUNC long qilog10(NUMBER *q);
E_FUNC NUMBER *qilog(NUMBER *q, ZVALUE base);
E_FUNC BOOL qcmpmod(NUMBER *q1, NUMBER *q2, NUMBER *q3);
E_FUNC BOOL qquomod(NUMBER *q1, NUMBER *q2, NUMBER **quo, NUMBER **mod, long rnd);
E_FUNC BOOL qquomod(NUMBER *q1, NUMBER *q2, NUMBER **quo, NUMBER **mod,
long rnd);
E_FUNC FLAG qnear(NUMBER *q1, NUMBER *q2, NUMBER *epsilon);
E_FUNC NUMBER *qdigit(NUMBER *q, ZVALUE dpos, ZVALUE base);
E_FUNC long qprecision(NUMBER *q);

10
rpm.mk
View File

@@ -19,8 +19,8 @@
# received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
MAKEFILE_REV= $$Revision: 30.10 $$
# @(#) $Id: rpm.mk,v 30.10 2013/05/05 11:59:51 chongo Exp $
MAKEFILE_REV= $$Revision: 30.11 $$
# @(#) $Id: rpm.mk,v 30.11 2013/08/11 08:41:38 chongo Exp $
# @(#) $Source: /usr/local/src/bin/calc/RCS/rpm.mk,v $
#
# Under source code control: 2003/02/16 20:21:39
@@ -32,7 +32,8 @@ MAKEFILE_REV= $$Revision: 30.10 $$
# calculator by David I. Bell with help/mods from others
# Makefile by Petteri Kettunen with modifications from Landon Curt Noll
# IMPORTANT NOTE: The rpm process assumes that ~/.rpmmacros contains the following:
# IMPORTANT NOTE: The rpm process assumes that ~/.rpmmacros contains
# the following:
#
# %_signature gpg
# %_gpg_path ~/.gnupg
@@ -95,7 +96,8 @@ PROJECT= ${PROJECT_NAME}-${PROJECT_VERSION}
SPECFILE= ${PROJECT_NAME}.spec
TARBALL= ${PROJECT}.${TAR}.bz2
RPM686= ${PROJECT}-${PROJECT_RELEASE}.${TARCH}.rpm
DRPM686= ${PROJECT_NAME}-devel-${PROJECT_VERSION}-${PROJECT_RELEASE}.${TARCH}.rpm
DRPM686= \
${PROJECT_NAME}-devel-${PROJECT_VERSION}-${PROJECT_RELEASE}.${TARCH}.rpm
SRPM= ${PROJECT}-${PROJECT_RELEASE}.src.rpm
RPM_TOP= ${HOME}/rpm/${NAME}
TMPDIR= ${RPM_TOP}/tmp

8
sha1.c
View File

@@ -22,9 +22,9 @@
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* @(#) $Revision: 30.3 $
* @(#) $Id: sha1.c,v 30.3 2007/07/05 17:37:41 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/sha1.c,v $
* @(#) $Revision: 30.4 $
* @(#) $Id: sha1.c,v 30.4 2013/08/11 01:08:32 chongo Exp $
* @(#) $Source: /usr/local/src/cmd/calc/RCS/sha1.c,v $
*
* This file is not covered under version 2.1 of the GNU LGPL.
*/
@@ -403,7 +403,7 @@ sha1Final(HASH *state)
* given:
* state the state to checkpoint
*
* This function will ensure that the the hash chunk buffer is empty.
* This function will ensure that the hash chunk buffer is empty.
* Any partially hashed data will be padded out with 0's and hashed.
*/
S_FUNC void

91
str.c
View File

@@ -19,8 +19,8 @@
* 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.1 $
* @(#) $Id: str.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.5 $
* @(#) $Id: str.c,v 30.5 2013/09/02 01:38:08 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/str.c,v $
*
* Under source code control: 1990/02/15 01:48:10
@@ -31,6 +31,7 @@
#include <stdio.h>
#include <ctype.h>
#include "calc.h"
#include "str.h"
@@ -162,7 +163,8 @@ findstr(STRINGHEAD *hp, char *str)
index = 0;
while (*test) {
testlen = strlen(test);
if ((testlen == len) && (*test == *str) && (strcmp(test, str) == 0))
if ((testlen == len) && (*test == *str) &&
(strcmp(test, str) == 0))
return index;
test += (testlen + 1);
index++;
@@ -263,7 +265,8 @@ addliteral(char *str)
if (literals.l_count >= literals.l_maxcount) {
count = literals.l_maxcount + STR_TABLECHUNK;
if (literals.l_maxcount)
table = (char **) realloc(literals.l_table, count * sizeof(char *));
table = (char **) realloc(literals.l_table, count *
sizeof(char *));
else
table = (char **) malloc(count * sizeof(char *));
if (table == NULL) {
@@ -680,6 +683,47 @@ stringshift(STRING *s1, long n)
return s;
}
/*
* stringtoupper makes st upper case
*/
STRING *
stringtoupper(STRING *st)
{
char *c1, *c2;
size_t num;
if (st->s_len > 0) {
c1 = st->s_str;
num = st->s_len;
c2 = c1;
while (num-- > 0)
*c1++ = (char)toupper((int)*c2++);
*c1 = '\0';
}
return slink(st);
}
/*
* stringtolower makes st lower case
*/
STRING *
stringtolower(STRING *st)
{
char *c1, *c2;
size_t num;
if (st->s_len > 0) {
c1 = st->s_str;
num = st->s_len;
c2 = c1;
while (num-- > 0)
*c1++ = (char)tolower((int)*c2++);
*c1 = '\0';
}
return slink(st);
}
/*
* stringcpy copies as many characters as possible
* from s2 to s1 and returns s1
@@ -850,7 +894,43 @@ stringrel(STRING *s1, STRING *s2)
return (i1 > i2);
}
/* Case independent stringrel(STRING *s1, STRING *s2)
* stringcaserel returns 0 if strings are equal; otherwise 1 or -1 according
* as the greater of the first unequal characters are in the first or
* second string, or in the case of unequal-length strings when the compared
* characters are all equal, 1 or -1 according as the first or second string
* is longer.
*/
FLAG
stringcaserel(STRING *s1, STRING *s2)
{
char *c1, *c2;
long i1, i2;
if (s1 == s2)
return 0;
i1 = s1->s_len;
i2 = s2->s_len;
if (i2 == 0)
return (i1 > 0);
if (i1 == 0)
return -1;
c1 = s1->s_str;
c2 = s2->s_str;
while (i1 > 1 && i2 > 1 && tolower(*c1) == tolower(*c2)) {
i1--;
i2--;
c1++;
c2++;
}
if ( (tolower(*c1)) > (tolower(*c2)))
return 1;
if ( (tolower(*c1)) < (tolower(*c2)))
return -1;
if (i1 < i2) return -1;
return (i1 > i2);
}
/*
* str with characters c0, c1, ... is considered as a bitstream, 8 bits
* per character; within a character the bits ordered from low order to
@@ -1214,7 +1294,8 @@ addstring(char *str, size_t len)
sp = (STRING **) realloc((char *) stringconsttable,
sizeof(STRING *) * (stringconstcount + STRCONSTALLOC));
if (sp == NULL) {
math_error("Unable to reallocate string const table");
math_error("Unable to reallocate string "
"const table");
/*NOTREACHED*/
}
stringconsttable = sp;

View File

@@ -19,8 +19,8 @@
* 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.1 $
* @(#) $Id: symbol.c,v 30.1 2007/03/16 11:09:46 chongo Exp $
* @(#) $Revision: 30.2 $
* @(#) $Id: symbol.c,v 30.2 2013/08/11 08:41:38 chongo Exp $
* @(#) $Source: /usr/local/src/bin/calc/RCS/symbol.c,v $
*
* Under source code control: 1990/02/15 01:48:23
@@ -61,7 +61,8 @@ STATIC GLOBAL **statictable;
* Hash a symbol name so we can find it in the hash table.
* Args are the symbol name and the symbol name size.
*/
#define HASHSYM(n, s) ((unsigned)((n)[0]*123 + (n)[s-1]*135 + (s)*157) % HASHSIZE)
#define HASHSYM(n, s) ((unsigned)((n)[0]*123 + (n)[s-1]*135 + (s)*157) % \
HASHSIZE)
/*

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