Compare commits

..

10 Commits

Author SHA1 Message Date
Landon Curt Noll
b54d8fc510 Release calc version 2.11.0t6 2017-05-21 15:38:27 -07:00
Landon Curt Noll
8cabbd6fb4 Release calc version 2.11.0t5.2 2017-05-21 15:38:27 -07:00
Landon Curt Noll
ea64a95b90 Release calc version 2.11.0t5.1 2017-05-21 15:38:27 -07:00
Landon Curt Noll
f60cbd24b2 Release calc version 2.11.0t5 2017-05-21 15:38:27 -07:00
Landon Curt Noll
97e9429000 Release calc version 2.11.0t4 2017-05-21 15:38:27 -07:00
Landon Curt Noll
1ce630ac19 Release calc version 2.11.0t3 2017-05-21 15:38:26 -07:00
Landon Curt Noll
4b98d5ff0e Release calc version 2.11.0t2 2017-05-21 15:38:26 -07:00
Landon Curt Noll
bad4535616 Release calc version 2.11.0t1 2017-05-21 15:38:26 -07:00
Landon Curt Noll
5307c4e16b Release calc version 2.11.0t0 2017-05-21 15:38:26 -07:00
Landon Curt Noll
b4e94b7eaa Release calc version 2.10.3t5.46 2017-05-21 15:38:26 -07:00
124 changed files with 2167 additions and 1267 deletions

46
BUGS
View File

@@ -1,8 +1,8 @@
If you notice something wrong, strange or broken, try rereading:
README.FIRST
README
BUGS (in particular the bottom problems or mis-features section)
HOWTO.INSTALL
BUGS (this file)
If that does not help, cd to the calc source directory and try:
@@ -18,13 +18,13 @@ If it does not, then something is really broken!
If you made and modifications to calc beyond the simple Makefile
configuration, try backing them out and see if things get better.
Check to see if the version of calc you are using is current. Calc
distributions may be obtained from the official calc repository:
To be sure that your version of calc is up to date, check out:
ftp://ftp.uu.net/pub/calc
http://reality.sgi.com/chongo/calc/calc-download.html
If you are an alpha or beta tester, you may have a special pre-released
version that is more advanced than what is in the ftp archive.
The calc web site is located at:
http://reality.sgi.com/chongo/calc
=-=
@@ -46,6 +46,8 @@ When you send your report, please include the following information:
* the type of compiler you were using
* any compiler warnings or erros that you saw
* cd to the calc source directory, and type:
make debug > debug.out 2>&1 (sh, ksh, bash users)
@@ -57,22 +59,8 @@ Stack traces from core dumps are useful to send as well.
=-=
The official calc repository is located in:
ftp://ftp.uu.net/pub/calc
If you don't have ftp access to that site, or if your version is more
recent than what has been released to the ftp archive, you may, as a
last resort, send EMail to:
chongo@toad.com
Indicate the version you have and that you would like a more up to date version.
=-=
Send any comments, suggestions and most importantly, fixes (in the form
of a context diff patch) to:
Send any comments, compiler warning messages, suggestions and most
importantly, fixes (in the form of a context diff patch) to:
calc-tester@postofc.corp.sgi.com
@@ -89,3 +77,15 @@ Known problems or mis-features:
* There is some places in the source with obscure variable names
and not much in the way of comments. We need some major cleanup
and documentation.
* On a Dec Alpha, using the Dec Alpha cc (not gcc) make check for
version 2.11.0t5.1 fails in the regression test:
From vandermj@molbio.sbphrd.com Tue Oct 5 04:06:52 1999
Subject: Re: oops, try calc version 2.10.0t5.1
Date: Tue, 05 Oct 1999 07:06:30 -0400
Regular cc on Dec alpha, 'make check' dies with:
1804: surd_value(a) == 2+3i
"": line 1706: Calling qfreenum with nozero links!!!

189
CHANGES
View File

@@ -1,4 +1,188 @@
Following is the change from calc version 2.10.3t5.38 to date:
Following is the change from calc version 2.11.0t1 to date:
Removed the makefile symbol MAIN. Now forcing all functions to correctly
be declared main. To satisfy some old broken compilers, a return 0;
(instead of an exit(0);) is used at the end of main().
A few of files that were added to calc used 4 character indentation
whereas most of calc uses 8 character indentation. These imported
sources have been changed to conform better with the calc style.
Added the program calc_errno.c and the Makefile symbol ERRNO_DECL.
If ERRNO_DECL is empty, calc_errno.c will try various ways to
declare errno, sys_errlist and sys_nerr. On success or when
it gives up, calc_errno will output the middle of the calc_errno.h
header file. If ERRNO_DECL is -DERRNO_NO_DECL, or -DERRNO_STD_DECL
or -DERRNO_OLD_DECL then the Makefile will build the middle
of the calc_errno.h header file without calc_errno.c's help.
The func.c file now includes the constructed header file calc_errno.h
to ensure that errno, sys_errlist and sys_nerr are declared correctly.
Changed check.awk to be more 'old awk' friendly.
Made some of the source a little more ++ friendly. We are NOT
porting calc to C++! We will NOT support C++ compilation of calc.
Calc will written ANSI C. We just compiled with a suggestion from
Love-Jensen, John <jlove-jensen@globalmt.com> to make calc's version
of C a little more to C++ compilers. We are simply avoiding symbols
such as new or try for example.
Renamed README to README.OLD. Renamed README.FIRST to README.
Updated README, lib/README and BUGS to reflect new URLs and addresses.
Added a HOWTO.INSTALL file.
Reordered cc Makefile variable sets in the main Makefile.
Fixed a bug and applied a fix that was reported by Ernest Bowen
<ernie@turing.une.edu.au>. Added regression tests 1103 to 1112.
Fixed a bug in version.c related to MINOR_PATCHs in both the
empty and non-empty MINOR_PATCH cases.
Fixed malloc and bad storage issues reported by Michel van der List
<vanderlistmj@sbphrd.com>.
Fixed some problems related to path processing while opening files.
Under extreme cases, an excessively long filename or CALCPATH value
could create problems. Placed guards in opensearchfile() function
in input.c to catch these cases.
Fixed cases were malloc failures were silently ignored in input.c.
Eliminated the PATHSIZE limit and the PATHSIZE symbol.
Added MAX_CALCRC to limit the length of the $CALCRC environment
variable to 1024 chars.
Fixed the magic number relating to the initial number of constants
declared by initconstants(). It is now related to the length
of the initnumbs[] NUMBER array.
Added a 'Dec Alpha / Compaq Tru64 cc (non-gnu) compiler set'
section to the main Makefile.
Fixed a string handling bug discovered by Dr.D.J.Picton
<dave@aps5.ph.bham.ac.uk> in the custom demo code.
Fixed a bug in the hnrmod() builtin that was discovered by
Ernest Bowen <ernie@neumann.une.edu.au>.
Added FORCE_STDC symbol. When defined it will force __STDC__ like
conditions. Thus for compilers with as the Solaris cc compiler
that are ANSI-like but still define __STDC__ as 0, one can use
-DFORCE_STDC and make use of ANSI-like features.
Removed the CCSHS symbol from the Makefile. The shs.c and shs1.c
files are now compiled with full ${CFLAGS}.
The custom.c file is now compiled with full ${CFLAGS}.
Rewrote command line / argument processing code. Calc is now
using getopt(3) argument processing.
Fixed a memory leak related to converting strings to numbers
in the str2q() function in qio.c.
Fixed a problem with reading uninitialized memory in the
v_subtype of a VALUE in the copyvalue() function in value.c.
Fixed problems in func.c where temporary VALUEs were not
having their v_type elements initialized.
Fixed a memory leak in qpi() in qtrans.c.
Fixed a memory leak in math_getdivertedio() in zio.c.
Fixed a problem with points going beyond the end of allocated
memory in addstring() in string.c.
Fixed a memory leak in zgcdrem(), f_putenv(), zlog() and
zlog10() in zfunc.c.
Fixed a memory leak in zdiv() and zshift() in zmath.c.
Fixed memory leaks in zsrand() in zrand.c.
Fixed a memory leak in zsrandom1() in zrandom.c. Fixed memory
leaks associated with replacing the internal random state with
another random state.
Added seed() builtin to return a 64 bit seed for a
pseudo-random generator.
Added functionality from Ernest Bowen <ernie@turing.une.edu.au> to
permit nested "= {...}" assignments for lists as well as matrices
and objects. Now one can have a list, matrix or object, some of
whose elements are lists, matrices or objects, to any depth of
recursion, and assign values to any number of particular elements
by an appropriate "initialization" expression. For example:
A = mat[2] = {list(1,2), list(3,4,list(5,6))};
and then assign values to the 6 number elements by:
A = {{7,8}, {9,10,{11,12}}};
Closed files that were previously left open from test4600.cal
as executed by regress.cal and from opening /dev/null by
regress.cal itself.
Fixed memory leaks from f_strprintf() and f_putenv() in func.c.
The regress.cal test suite calls freeredc(), freestatics() and
freeglobals() at the end of the test suite to free storage
consumed during the regression.
Added custom function custom("pzasusb8", n) and lib/pzasusb8.cal based on
Ernest Bowen's diagnostic patch.
Thanks to the efforts of Ernest Bowen <ernie@neumann.une.edu.au> and
Dr.D.J.Picton <dave@aps5.ph.bham.ac.uk>, a nasty endian-ness bug
in the sha and sha1 hash functions that showed up on machines such
as the Sparc was fixed.
Added functionality from Ernest Bowen <ernie@turing.une.edu.au>
to give arguments as well as function names after definitions when
config("lib_debug") >= 0.
Removed if (config("lib_debug") >= 0) { ... } the ends of most
of the calc library scripts because it was redundant with the
new config("lib_debug") >= 0 functionality. Some of the calc
library still has a partial section because some useful
additional information was being printed:
chrem.cal deg.cal lucas_tbl.cal randrun.cal
mfactor.cal mod.cal poly.cal seedrandom.cal
surd.cal varargs.cal
Fixed ellip.cal so that its defined function does not conflict with
the factor() builtin function.
Fixed mod.cal so that a defined function does not conflict with
the mod() builtin function.
The regression test suite now reads in most calc libs. A few
libs are not read because they, by design, produce output
when read even when config("lib_debug") is set to -1.
Increased the maximum number of object types that one can define
from 10 to 128.
Added a patch from Ernest Bowen <ernie@turing.une.edu.au>
to correctly hash a V_STR value-type that has an \0 byte
inside it.
Fixed misc compile warnings and notices.
Following is the change from calc version 2.10.3t5.38 to 2.11.0t0:
Fixed a few compile problems found under Red Hat 6.0 Linux.
Following is the change from calc version 2.10.3t5.38 to 2.11.3t5.46:
Fixed a bug discovered by Ernest Bowen related to matrix-to-matrix copies.
@@ -51,6 +235,9 @@ Following is the change from calc version 2.10.3t5.38 to date:
The function version(), now returns a malloced version string
without the title.
Consolidated multiple SGI IRIX -n32 sections (for r4k, r5k and r10k)
into a single section.
Following is the change from calc version 2.10.3t5.34 to 2.10.3t5.37:

52
HOWTO.INSTALL Normal file
View File

@@ -0,0 +1,52 @@
Installing calc in 4 easy steps:
1) Look at the makefile, and adjust it to suit your needs.
Here are some Makefile hints:
Select a compiler set by commenting in the appropriate set
of cc options. As shipped the Makefile assumes a gcc-like
environment such as Linux. If a more appropriate cc set if
found below, comment out the Linux set and comment in that
set or edit the gcc set or the common cc set as needed.
You may or may not need RANLIB when building libraries.
As shipped the Makefile assumes RANLIB is needed.
Comment the in/out the RANLIB value if ranlib does
not work or does not exist.
You may want to change the default pager used by calc.
As shipped the Makefile assumes 'more'. On your system
you may find 'less' to be a better pager.
The CALCBINDINGS is matter of personal taste. As shipped
the Makefile assumes a default quasi-emacs-like command
line editor. Changing CALCBINDINGS= altbind will cause ^D
to end calc in a fashion similar to that of the bc(1) command.
Set TOPDIR to be the place under which help files, calc,
include files and calc libs are to be installed. As shipped
the Makefile assumes a TOPDIR of /usr/local/lib.
Set BINDIR to the place where calc is installed. As shipped
the Makefile assumes a BINDIR /usr/local/bin.
Adjust other Makefile variables as needed.
2) build calc:
make all
==> We are interested in any compiler warnings (and errors) that
you may find. See the BUGS file if you find any compiler
warning or errors.
3) test calc:
make check
==> If you run into problems, follow the BUGS file instructions.
4) install calc:
make install

432
Makefile
View File

@@ -206,17 +206,38 @@ HAVE_MEMMOVE=
ALIGN32= -DMUST_ALIGN32
#ALIGN32= -UMUST_ALIGN32
# The return value type of main() differs from platform to platform.
# In some cases, a compiler warning is issued because main() does
# or does not return a value.
# On most machines: errno sys_errlist and sys_nerr are declared
# by either <stdio.h> and/or <errno.h>. But some systems declare
# them somewhere else or do not declare them at all!
#
# MAIN= -DMAIN=void main() is of type void
# MAIN= -DMAIN=int main() is of type int
# If the system were doing a proper job in headers, this should declare them:
#
# When in doubt, try MAIN= -DMAIN=void. If you get a warning try the other.
# #include <stdio.h>
# #include <errno.h>
#
MAIN= -DMAIN=void
#MAIN= -DMAIN=int
# But one some systems one must explicitly declare them as:
#
# extern int errno;
# extern const char *const sys_errlist[];
# extern int sys_nerr;
#
# and on some old systems they must be explicitly and incorrectly declared as:
#
# extern int errno;
# extern char *sys_errlist[];
# extern int sys_nerr;
#
# ERRNO_DECL= let calc_errno.c determine how to declare them
# ERRNO_DECL= -DERRNO_NO_DECL headers declare them correctly
# ERRNO_DECL= -DERRNO_STD_DECL one must explicitly declare then
# ERRNO_DECL= -DERRNO_OLD_DECL one must explicitly & incorrectly declare them
#
# When in doubt, be safe leave ERRNO_DECL empty.
#
ERRNO_DECL=
#ERRNO_DECL= -DERRNO_NO_DECL
#ERRNO_DECL= -DERRNO_STD_DECL
#ERRNO_DECL= -DERRNO_OLD_DECL
# where to install binary files
#
@@ -293,7 +314,8 @@ CATEXT= 1
# The cat page is not built or installed
#
# If in doubt and you don't want to fool with man pages, set MANDIR
# and CATDIR to empty and ignore the lines below.
# and CATDIR to empty and ignore the NROFF, NROFF_ARG and MANMAKE
# lines below.
#
NROFF= nroff
#NROFF=
@@ -332,7 +354,7 @@ CALCPAGER= more
# Debug/Optimize options for ${CC}
#
DEBUG= -O
#DEBUG= -O
#DEBUG= -O -g
#DEBUG= -O -g3
#DEBUG= -O1
@@ -340,7 +362,7 @@ DEBUG= -O
#DEBUG= -O1 -g3
#DEBUG= -O2
#DEBUG= -O2 -g
#DEBUG= -O2 -g3
DEBUG= -O2 -g3
#DEBUG= -O2 -ipa
#DEBUG= -O2 -g3 -ipa
#DEBUG= -O3
@@ -388,8 +410,8 @@ LD_NO_SHARED=
# a *.a library. Set RANLIB to the utility that performs this action.
# Set RANLIB to : if your system does not need such a utility.
#
#RANLIB=ranlib
RANLIB=:
RANLIB=ranlib
#RANLIB=:
# Some systems are able to form lint libs. How it is formed depends
# on your system. If you do not care about lint, use : as the
@@ -495,7 +517,6 @@ ALLOW_CUSTOM= -DCUSTOM
# ICFLAGS are given to ${CC} for intermediate progs
#
# CCMAIN are flags for ${CC} when files with main() instead of CFLAGS
# CCSHS are flags given to ${CC} for compiling shs.c & shs1.c instead of CFLAGS
#
# LCFLAGS are CC-style flags for ${LINT}
# LDFLAGS are flags given to ${CC} for linking .o files
@@ -505,48 +526,63 @@ ALLOW_CUSTOM= -DCUSTOM
#
###
#
# common cc set
# Linux set
#
CCWARN=
# Tested on Red Hat 6.0 Linux but should run on almost any Linux release.
#
# for better performance, set the following above:
# DEBUG= -O2
#
CCWARN= -Wall -Wno-implicit -Wno-comment
CCOPT= ${DEBUG} ${NO_SHARED}
CCMISC=
#
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
ICFLAGS= ${CCWARN} ${CCMISC}
#
CCMAIN= ${ICFLAGS} ${MAIN}
CCSHS= ${CFLAGS}
CCMAIN= ${ICFLAGS}
#
LCFLAGS=
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
ILDFLAGS=
#
CC= ${PURIFY} cc
CC= ${PURIFY} gcc
#
###
#
# SGI IRIX5.3 (or earlier) -o32 C Compiler
#
# You must set above:
# RANLIB=:
# LONGLONG_BITS= 0
# gcc set (some call it gcc2, some call it gcc)
#
# for better performance, set the following above:
# DEBUG= -O2 -g3
# DEBUG= -O2
#
# If you have the directory /usr/lib/nonshared, then set the following above:
# NO_SHARED= -non_shared
# LD_NO_SHARED= -Wl,-rdata_shared
#
#CCWARN= -fullwarn -woff 835
#CCWARN= -Wall -Wno-implicit -Wno-comment
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -use_readonly_const
#CCMISC=
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} gcc
#CC= ${PURIFY} gcc2
#
###
#
# common cc set
#
#CCWARN=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC=
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
@@ -556,7 +592,7 @@ CC= ${PURIFY} cc
#
###
#
# SGI IRIX6.2 (or later) -n32 (v7.1 or later) Compiler for the R4k
# SGI IRIX6.2 (or later) -n32 (v7.1 or later) Compiler
#
# You must set above:
# RANLIB=:
@@ -572,87 +608,18 @@ CC= ${PURIFY} cc
#
#CCWARN= -fullwarn -woff 1209
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -use_readonly_const
#CCMISC= -rdata_shared
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc -n32 -r4000 -xansi
#
###
#
# SGI IRIX6.2 (or later) -n32 (v7.1 or later) Compiler for the R5k
#
# You must set above:
# RANLIB=:
#
# for better performance, set the following above:
# DEBUG= -O2 -g3
#
# If you have the directory /usr/lib32/nonshared, then set the following above:
# NO_SHARED= -non_shared
# LD_NO_SHARED= -Wl,-rdata_shared
#
# woff 1209: cancel 'controlling expression is constant' warnings
#
#CCWARN= -fullwarn -woff 1209
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -use_readonly_const
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc -n32 -r5000 -xansi
#
###
#
# SGI IRIX6.5 (or later) -n32 (v7.2 or later) Compiler for the R10k
#
# NOTE: For Pre IRIX6.5 and pre v7.2 compilers, use:
#
# CCSHS= ${CFLAGS} -OPT:fold_arith_limit=1668
#
# You must set above:
# RANLIB=:
#
# for better performance, set the following above:
# DEBUG= -O2 -g3
#
# If you have the directory /usr/lib32/nonshared, then set the following above:
# NO_SHARED= -non_shared
# LD_NO_SHARED= -Wl,-rdata_shared
#
# woff 1209: cancel 'controlling expression is constant' warnings
#
#CCWARN= -fullwarn -woff 1209
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -use_readonly_const
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc -n32 -r10000 -mips4 -xansi
#CC= ${PURIFY} cc -n32 -xansi
#
###
#
@@ -671,8 +638,7 @@ CC= ${PURIFY} cc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
@@ -691,8 +657,7 @@ CC= ${PURIFY} cc
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
@@ -702,43 +667,22 @@ CC= ${PURIFY} cc
#
###
#
# BSDI's BSD/OS 2.0 (or later) set
#
# for better performance, set the following above:
# DEBUG= -O2
#
#CCWARN= -Wall -Wno-implicit -Wno-comment
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -ansi
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} shlicc2
#
###
#
# Solaris 2.x Sun cc compiler
# Solaris Sun cc compiler set
#
# for better performance, set the following above:
# DEBUG= -O
#
# We need -DFORCE_STDC to make use of ANSI-C like features and
# to avoid the use of -Xc (which as a lose performance wise).
#
#CCWARN=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC=-Xc
#CCMISC= -DFORCE_STDC
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
@@ -748,74 +692,47 @@ CC= ${PURIFY} cc
#
###
#
# gcc set
#
# for better performance, set the following above:
# DEBUG= -O
#
#CCWARN= -Wall
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -ansi
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} gcc
#
###
#
# gcc1 set (some call it gcc1, some call it gcc)
#
# for better performance, set the following above:
# DEBUG= -O
#
#CCWARN= -Wall
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -ansi
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} gcc1
#CC= ${PURIFY} gcc
#
###
#
# gcc2 set (some call it gcc2, some call it gcc)
# BSDI's BSD/OS 4.0 (or later) set
#
# for better performance, set the following above:
# DEBUG= -O2
#
#CCWARN= -Wall -Wno-implicit -Wno-comment
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -ansi
#CCMISC=
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS} ${MAIN}
#CCSHS= ${CFLAGS}
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} gcc2
#CC= ${PURIFY} gcc
#
###
#
# Dec Alpha / Compaq Tru64 cc (non-gnu) compiler set
#
# for better performance, set the following above:
# DEBUG= -O2
#
#CCWARN=
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC=
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc
##############################################################################
#-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#
@@ -858,7 +775,7 @@ LIBSRC= addop.c assocfunc.c blkcpy.c block.c byteswap.c \
file.c func.c hash.c help.c hist.c input.c jump.c label.c \
lib_calc.c lib_util.c listfunc.c matfunc.c math_error.c \
md5.c obj.c opcodes.c pix.c poly.c prime.c qfunc.c qio.c \
qmath.c qmod.c qtrans.c quickhash.c shs.c shs1.c size.c \
qmath.c qmod.c qtrans.c quickhash.c seed.c shs.c shs1.c size.c \
string.c symbol.c token.c value.c version.c zfunc.c zio.c \
zmath.c zmod.c zmul.c zprime.c zrand.c zrandom.c
@@ -872,7 +789,7 @@ LIBOBJS= addop.o assocfunc.o blkcpy.o block.o byteswap.o calcerr.o \
file.o func.o hash.o help.o hist.o input.o jump.o label.o \
lib_calc.o lib_util.o listfunc.o matfunc.o math_error.o \
md5.o obj.o opcodes.o pix.o poly.o prime.o qfunc.o qio.o \
qmath.o qmod.o qtrans.o quickhash.o shs.o shs1.o size.o \
qmath.o qmod.o qtrans.o quickhash.o seed.o shs.o shs1.o size.o \
string.o symbol.o token.o value.o version.o zfunc.o zio.o \
zmath.o zmod.o zmul.o zprime.o zrand.o zrandom.o
@@ -902,7 +819,7 @@ BUILD_H_SRC= align32.h args.h calcerr.h conf.h endian_calc.h \
fposval.h have_const.h have_fpos.h have_malloc.h \
have_memmv.h have_newstr.h have_offscl.h have_posscl.h \
have_stdlib.h have_string.h have_times.h have_uid_t.h \
have_unistd.h longbits.h longlong.h terminal.h
have_unistd.h longbits.h longlong.h terminal.h calc_errno.h
# we build these .c files during the make
#
@@ -914,7 +831,7 @@ BUILD_C_SRC= calcerr.c
#
UTIL_C_SRC= align32.c endian.c longbits.c have_newstr.c have_uid_t.c \
have_const.c have_stdvs.c have_varvs.c fposval.c have_fpos.c \
longlong.c have_offscl.c have_posscl.c have_memmv.c
longlong.c have_offscl.c have_posscl.c have_memmv.c calc_errno.c
# these awk and sed tools are used in the process of building BUILD_H_SRC
# and BUILD_C_SRC
@@ -928,16 +845,17 @@ UTIL_MISC_SRC= calcerr_h.sed calcerr_h.awk calcerr_c.sed calcerr_c.awk \
#
UTIL_OBJS= endian.o longbits.o have_newstr.o have_uid_t.o \
have_const.o fposval.o have_fpos.o longlong.o try_strarg.o \
have_stdvs.o have_varvs.o have_posscl.o have_memmv.o
have_stdvs.o have_varvs.o have_posscl.o have_memmv.o calc_errno.o
# these temp files may be created (and removed) during the build of BUILD_C_SRC
#
UTIL_TMP= ll_tmp fpos_tmp fposv_tmp const_tmp uid_tmp newstr_tmp vs_tmp
UTIL_TMP= ll_tmp fpos_tmp fposv_tmp const_tmp uid_tmp newstr_tmp vs_tmp \
calc_errno_tmp
# these utility progs may be used in the process of building BUILD_H_SRC
#
UTIL_PROGS= align32 fposval have_uid_t longlong have_const \
endian longbits have_newstr have_stdvs have_varvs
endian longbits have_newstr have_stdvs have_varvs calc_errno
# These files are required by the regress.cal regression test.
#
@@ -981,7 +899,6 @@ SAMPLE_PASSDOWN= Q="${Q}" \
TOPDIR="${TOPDIR}" \
LIBDIR="${LIBDIR}" \
HELPDIR="${HELPDIR}" \
MAIN="${MAIN}" \
DEBUG="${DEBUG}" \
NO_SHARED="${NO_SHARED}" \
RANLIB="${RANLIB}" \
@@ -1014,7 +931,7 @@ C_SRC= ${LIBSRC} ${CALCSRC} ${UTIL_C_SRC}
# These files are found (but not built) in the distribution
#
DISTLIST= ${C_SRC} ${H_SRC} ${MAKE_FILE} BUGS CHANGES LIBRARY README \
calc.man lint.sed README.FIRST ${UTIL_MISC_SRC}
calc.man lint.sed README.OLD HOWTO.INSTALL ${UTIL_MISC_SRC}
# complete list of .o files
#
@@ -1067,17 +984,11 @@ calc.o: calc.c ${MAKE_FILE}
${CC} ${CCMAIN} ${CCOPT} ${ALLOW_CUSTOM} -c calc.c
custom.o: custom.c ${MAKE_FILE}
${CC} ${CCOPT} ${ALLOW_CUSTOM} -c custom.c
${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c custom.c
hist.o: hist.c ${MAKE_FILE}
${CC} ${CFLAGS} ${TERMCONTROL} -c hist.c
shs.o: shs.c ${MAKE_FILE}
${CC} ${CCSHS} -c shs.c
shs1.o: shs1.c ${MAKE_FILE}
${CC} ${CCSHS} -c shs1.c
func.o: func.c ${MAKE_FILE}
${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c func.c
@@ -1909,6 +1820,98 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
true; \
fi
calc_errno.h: calc_errno.c ${MAKE_FILE}
-${Q}rm -f calc_errno.h calc_errno calc_errno_tmp
${Q}echo 'forming calc_errno.h'
${Q}echo '/*' > calc_errno.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> calc_errno.h
${Q}echo ' */' >> calc_errno.h
${Q}echo '' >> calc_errno.h
${Q}echo '' >> calc_errno.h
${Q}echo '#if !defined(__CALC_ERRNO_H__)' >> calc_errno.h
${Q}echo '#define __CALC_ERRNO_H__' >> calc_errno.h
${Q}echo '' >> calc_errno.h
${Q}echo '' >> calc_errno.h
-${Q}if [ X"${ERRNO_DECL}" = X"-DERRNO_NO_DECL" ]; then \
echo '/*' >> calc_errno.h; \
echo ' * The calc Makefile explicitly told us' >> calc_errno.h; \
echo ' * how to declare errno and friends.' >> calc_errno.h; \
echo ' */' >> calc_errno.h; \
echo '' >> calc_errno.h; \
echo '#include <stdio.h>' >> calc_errno.h; \
echo '#include <errno.h>' >> calc_errno.h; \
elif [ X"${ERRNO_DECL}" = X"-DERRNO_STD_DECL" ]; then \
echo '/*' >> calc_errno.h; \
echo ' * The calc Makefile explicitly told us' >> calc_errno.h; \
echo ' * how to declare errno and friends.' >> calc_errno.h; \
echo ' */' >> calc_errno.h; \
echo '' >> calc_errno.h; \
echo 'extern int errno; ' \
'/* last system error */' >> calc_errno.h; \
echo 'extern const char *const sys_errlist[];' \
' /* system error messages*/' >> calc_errno.h; \
echo 'extern int sys_nerr; ' \
'/* number of system errors */' >> calc_errno.h; \
elif [ X"${ERRNO_DECL}" = X"-DERRNO_OLD_DECL" ]; then \
echo '/*' >> calc_errno.h; \
echo ' * The calc Makefile explicitly told us' >> calc_errno.h; \
echo ' * how to declare errno and friends.' >> calc_errno.h; \
echo ' */' >> calc_errno.h; \
echo '' >> calc_errno.h; \
echo 'extern int errno; ' \
'/* last system error */' >> calc_errno.h; \
echo 'extern char *sys_errlist[];' \
' /* system error messages*/' >> calc_errno.h; \
echo 'extern int sys_nerr; ' \
'/* number of system errors */' >> calc_errno.h; \
else \
${CC} ${CCMAIN} -DTRY_ERRNO_NO_DECL \
calc_errno.c -o calc_errno 2>calc_errno_tmp; \
if [ -x ./calc_errno ]; then \
./calc_errno >> calc_errno.h; \
else \
${CC} ${CCMAIN} -DTRY_ERRNO_STD_DECL \
calc_errno.c -o calc_errno 2>calc_errno_tmp; \
if [ -x ./calc_errno ]; then \
./calc_errno >> calc_errno.h; \
else \
${CC} ${CCMAIN} -DTRY_ERRNO_OLD_DECL \
calc_errno.c -o calc_errno 2>calc_errno_tmp; \
if [ -x ./calc_errno ]; then \
./calc_errno >> calc_errno.h; \
else \
echo '/*' >> calc_errno.h; \
echo ' * We were unable to to determine' >> calc_errno.h; \
echo ' * how to declare errno and friends.' >> calc_errno.h; \
echo ' * So we will guess this will work' >> calc_errno.h; \
echo ' * and hope for the best.' >> calc_errno.h; \
echo ' */' >> calc_errno.h; \
echo '' >> calc_errno.h; \
echo 'extern int errno; ' \
'/* last system error */' >> calc_errno.h; \
echo 'extern const char *const sys_errlist[];' \
' /* system error messages*/' >> calc_errno.h; \
echo 'extern int sys_nerr; ' \
'/* number of system errors */' >> calc_errno.h; \
fi; \
fi; \
fi; \
fi
${Q}echo '' >> calc_errno.h
${Q}echo '' >> calc_errno.h
${Q}echo '#endif /* !__CALC_ERRNO_H__ */' >> calc_errno.h
-${Q}rm -f calc_errno calc_errno_tmp
${Q}echo 'calc_errno.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
calcerr.h: calcerr.tbl calcerr_h.sed calcerr_h.awk ${MAKE_FILE}
-${Q}rm -f calerr.h
${Q}echo 'forming calcerr.h'
@@ -2295,7 +2298,7 @@ env:
@echo "HAVE_UID_T=${HAVE_UID_T}"; echo ""
@echo "HAVE_NEWSTR=${HAVE_NEWSTR}"; echo ""
@echo "ALIGN32=${ALIGN32}"; echo ""
@echo "MAIN=${MAIN}"; echo ""
@echo "ERRNO_DECL=${ERRNO_DECL}"; echo ""
@echo "BINDIR=${BINDIR}"; echo ""
@echo "TOPDIR=${TOPDIR}"; echo ""
@echo "LIBDIR=${LIBDIR}"; echo ""
@@ -2330,7 +2333,6 @@ env:
@echo "CFLAGS=${CFLAGS}"; echo ""
@echo "ICFLAGS=${ICFLAGS}"; echo ""
@echo "CCMAIN=${CCMAIN}"; echo ""
@echo "CCSHS=${CCSHS}"; echo ""
@echo "LCFLAGS=${LCFLAGS}"; echo ""
@echo "LDFLAGS=${LDFLAGS}"; echo ""
@echo "ILDFLAGS=${ILDFLAGS}"; echo ""
@@ -2747,6 +2749,7 @@ byteswap.o: longbits.h
byteswap.o: qmath.h
byteswap.o: zmath.h
calc.o: alloc.h
calc.o: args.h
calc.o: block.h
calc.o: byteswap.h
calc.o: calc.c
@@ -2782,6 +2785,7 @@ calc.o: symbol.h
calc.o: token.h
calc.o: value.h
calc.o: zmath.h
calc_errno.o: calc_errno.c
calcerr.o: calcerr.c
calcerr.o: calcerr.h
calcerr.o: have_const.h
@@ -2959,6 +2963,7 @@ func.o: alloc.h
func.o: block.h
func.o: byteswap.h
func.o: calc.h
func.o: calc_errno.h
func.o: calcerr.h
func.o: cmath.h
func.o: config.h
@@ -3325,7 +3330,6 @@ obj.o: symbol.h
obj.o: value.h
obj.o: zmath.h
opcodes.o: alloc.h
opcodes.o: args.h
opcodes.o: block.h
opcodes.o: byteswap.h
opcodes.o: calc.h
@@ -3510,6 +3514,18 @@ quickhash.o: value.h
quickhash.o: zmath.h
quickhash.o: zrand.h
quickhash.o: zrandom.h
seed.o: alloc.h
seed.o: byteswap.h
seed.o: endian_calc.h
seed.o: have_malloc.h
seed.o: have_memmv.h
seed.o: have_newstr.h
seed.o: have_stdlib.h
seed.o: have_string.h
seed.o: longbits.h
seed.o: qmath.h
seed.o: seed.c
seed.o: zmath.h
shs.o: align32.h
shs.o: alloc.h
shs.o: block.h

86
README
View File

@@ -1,68 +1,54 @@
# Copyright (c) 1997 David I. Bell
# Permission is granted to use, distribute, or modify this source,
# provided that this copyright notice remains intact.
#
# Arbitrary precision calculator.
Dear calc user,
I am allowing this calculator to be freely distributed for your enjoyment.
Like all multi-precision programs, you should not depend absolutely on
its results, since bugs in such programs can be insidious and only rarely
show up.
See the HOWTO.INSTALL file for information on how to build and install calc.
-dbell-
To be sure that your version of calc is up to date, check out:
p.s. By Landon Curt Noll:
http://reality.sgi.com/chongo/calc/calc-download.html
Building calc in 3 easy steps:
We are interested in any/all feedback on recent versions of calc.
In particular we would like to hear about:
1) Look at the makefile, and adjust it to suit your needs.
* compiler warnings
* compile problems
* regression test problems (try: make check)
* special compile flags/options that you needed
* Makefile problems
* help file problems
* misc nits and typos
Here are some Makefile hints:
We would like to offer a clean compile across a wide verity of platforms,
so if you can test on several, so much the better!
In the past, some people have had to adjust the VARARG or
TERMCONTROL because the Makefile cannot always guess
correctly for certain systems. You may need to play with
these values if you experience problems.
The default compiler used is 'cc'. The default compiler flag
is '-O'. If you have gcc, or gcc v2 (or better) you should use
that instead. Some compilers allow for optimization beyond
just -O (gcc v2 has -O2, mips cc has -O3). You should select
the best flag for speed optimization. Calc can be cpu intensive
so selecting a quality compiler and good optimization level can
really pay off.
2) build calc:
make all
3) test calc:
make check
==>>>If you run into problems, follow the instructions in the BUGS file<<<==
If you run into problems, see the BUGS file.
=-=
For further reading:
LIBRARY
explains how programs can use libcalc.a to take advantage
of the calc multi-precision routines.
See the file:
help/todo
current wish list for calc
CHANGES
recent changes to calc
or run:
BUGS
known bugs, mis-features and how to report problems
calc 'help todo'
help/full
full set of calc documentation
for a wish/todo list. Code contributions are welcome.
=-=
David I. Bell dbell@auug.org.au
chongo@toad.com <Landon Curt Noll -- chongo@toad.com> /\../\
To join the calc-tester mailing list. Send a request to:
calc-tester-request@postofc.corp.sgi.com
Your message body (not the subject) should consist of:
subscribe calc-tester address
end
name your_full_name
where ``address'' is your EMail address and ``your_full_name'' is
your full name.
The calc web site is located at:
http://reality.sgi.com/chongo/calc

View File

@@ -1,52 +0,0 @@
Dear alpha tester,
Thanks for taking the time to try out this alpha version of calc! We are
interested in any/all feedback that you may have on this version. In
particular we would like to hear about:
* compile problems
* regression test problems (try: make check)
* compiler warnings
* special compile flags/options that you needed
* Makefile problems
* help file problems
* misc nits and typos
We would like to offer a clean compile across a wide verity of platforms,
so if you can test on several, so much the better!
Calc distributions may be obtained from:
ftp://ftp.uu.net/pub/calc
If you don't have ftp access to that site, or if you do not find a more
recent version (you may have a special pre-released version that is
more advanced than what is in the ftp archive) send EMail to:
chongo@toad.com
Indicate the version you have and that you would like a more up
to date version.
=-=
Misc items TODO before Beta release:
* improve the coverage in the 'SEE ALSO' help file lists
* where reasonable, be sure that regress.cal tests builtin functions
* add the Blum-Blum-Shub random() generator code
* add code to allow of the reading, writing and processing of binary data
* add shs, shs-1 and md5 hashing functions. Use align32.h.
* add mod h*2^n+/-1 function for integers
* be sure that CHANGES is up to date,
look over the help/todo file and update as needed,
revisit issues in the BUGS file and
change this file :-)
* clean the source code and document it better

73
README.OLD Normal file
View File

@@ -0,0 +1,73 @@
# Copyright (c) 1997 David I. Bell
# Permission is granted to use, distribute, or modify this source,
# provided that this copyright notice remains intact.
#
# Arbitrary precision calculator.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NOTE: This is an old historic README. We recommend that
you read README and HOWTO.INSTALL for more info.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I am allowing this calculator to be freely distributed for your enjoyment.
Like all multi-precision programs, you should not depend absolutely on
its results, since bugs in such programs can be insidious and only rarely
show up.
-dbell-
p.s. By Landon Curt Noll:
Building calc in 3 easy steps:
1) Look at the makefile, and adjust it to suit your needs.
Here are some Makefile hints:
In the past, some people have had to adjust the VARARG or
TERMCONTROL because the Makefile cannot always guess
correctly for certain systems. You may need to play with
these values if you experience problems.
The default compiler used is 'cc'. The default compiler flag
is '-O'. If you have gcc, or gcc v2 (or better) you should use
that instead. Some compilers allow for optimization beyond
just -O (gcc v2 has -O2, mips cc has -O3). You should select
the best flag for speed optimization. Calc can be cpu intensive
so selecting a quality compiler and good optimization level can
really pay off.
2) build calc:
make all
3) test calc:
make check
==>>>If you run into problems, follow the instructions in the BUGS file<<<==
=-=
For further reading:
LIBRARY
explains how programs can use libcalc.a to take advantage
of the calc multi-precision routines.
help/todo
current wish list for calc
CHANGES
recent changes to calc
BUGS
known bugs, mis-features and how to report problems
help/full
full set of calc documentation
=-=
David I. Bell dbell@auug.org.au
chongo <Landon Curt Noll> /\../\

19
addop.c
View File

@@ -135,6 +135,7 @@ endfunc(void)
{
register FUNC *fp; /* function just finished */
unsigned long size; /* size of just created function */
long index;
if (oldop != OP_RETURN) {
addop(OP_UNDEF);
@@ -163,14 +164,22 @@ endfunc(void)
size += dumpop(&fp->f_opcodes[size]);
}
}
if (inputisterminal() || conf->lib_debug >= 0) {
printf("%s(", fp->f_name);
for (index = 0; index < fp->f_paramcount; index++) {
if (index)
putchar(',');
printf("%s", paramname(index));
}
printf(") ");
if (functions[newindex])
printf("re");
printf("defined\n");
}
if (functions[newindex]) {
freenumbers(functions[newindex]);
free(functions[newindex]);
if (inputisterminal() || conf->lib_debug >= 0)
printf("%s() redefined\n", fp->f_name);
}
else if (inputisterminal() || conf->lib_debug >= 0)
printf("%s() defined\n", fp->f_name);
functions[newindex] = fp;
objuncache();
}
@@ -228,7 +237,7 @@ rmuserfunc(char *name)
return;
freenumbers(functions[index]);
free(functions[index]);
if (!inputisterminal() && conf->lib_debug >= 0)
if (inputisterminal() && conf->lib_debug >= 0)
printf("%s() undefined\n", name);
functions[index] = NULL;
}

View File

@@ -30,7 +30,7 @@
static void buserr(void); /* catch alignment errors */
MAIN
int
main(void)
{
char byte[2*sizeof(USB32)]; /* mis-alignment buffer */
@@ -58,7 +58,8 @@ main(void)
'/', '/');
#endif
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -17,7 +17,7 @@
#ifdef HAVE_MALLOC_H
# include <malloc.h>
#else
# if defined(__STDC__) && __STDC__ != 0
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
extern void *malloc();
extern void *realloc();
extern void free();
@@ -36,7 +36,7 @@
# if defined(HAVE_NEWSTR)
extern void *memcpy();
extern void *memset();
# if defined(__STDC__) && __STDC__ != 0
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
extern size_t strlen();
# else
extern long strlen();
@@ -65,7 +65,7 @@ extern int strcmp();
#if !defined(HAVE_MEMMOVE)
# undef CALC_SIZE_T
# if defined(__STDC__) && __STDC__ != 0
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
# define CALC_SIZE_T size_t
# else
# define CALC_SIZE_T long

48
block.c
View File

@@ -71,7 +71,7 @@ static void blkchk(BLOCK*);
BLOCK *
blkalloc(int len, int chunk)
{
BLOCK *new; /* new block allocated */
BLOCK *nblk; /* new block allocated */
/*
* firewall
@@ -84,8 +84,8 @@ blkalloc(int len, int chunk)
/*
* allocate BLOCK
*/
new = (BLOCK *)malloc(sizeof(BLOCK));
if (new == NULL) {
nblk = (BLOCK *)malloc(sizeof(BLOCK));
if (nblk == NULL) {
math_error("cannot allocate block");
/*NOTREACHED*/
}
@@ -93,23 +93,23 @@ blkalloc(int len, int chunk)
/*
* initialize BLOCK
*/
new->blkchunk = chunk;
new->maxsize = ((len+chunk)/chunk)*chunk;
new->data = (USB8*)malloc(new->maxsize);
if (new->data == NULL) {
nblk->blkchunk = chunk;
nblk->maxsize = ((len+chunk)/chunk)*chunk;
nblk->data = (USB8*)malloc(nblk->maxsize);
if (nblk->data == NULL) {
math_error("cannot allocate block data storage");
/*NOTREACHED*/
}
memset(new->data, 0, new->maxsize);
new->datalen = len;
memset(nblk->data, 0, nblk->maxsize);
nblk->datalen = len;
/*
* return BLOCK
*/
if (conf->calc_debug > 0) {
blkchk(new);
blkchk(nblk);
}
return new;
return nblk;
}
@@ -227,7 +227,7 @@ blkchk(BLOCK *blk)
BLOCK *
blkrealloc(BLOCK *blk, int newlen, int newchunk)
{
USB8 *new; /* realloced storage */
USB8 *nblk; /* realloced storage */
int newmax; /* new maximum stoage size */
/*
@@ -258,20 +258,20 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
if (newmax != blk->maxsize) {
/* reallocate new storage */
new = (USB8*)realloc(blk->data, newmax);
if (new == NULL) {
nblk = (USB8*)realloc(blk->data, newmax);
if (nblk == NULL) {
math_error("cannot reallocate block storage");
/*NOTREACHED*/
}
/* clear any new storage */
if (newmax > blk->maxsize) {
memset(new + blk->maxsize, 0, (newmax - blk->maxsize));
memset(nblk+blk->maxsize, 0, (newmax-blk->maxsize));
}
blk->maxsize = newmax;
/* restore the data pointers */
blk->data = new;
blk->data = nblk;
}
/*
@@ -391,13 +391,13 @@ blktrunc(BLOCK *blk)
BLOCK *
blk_copy(BLOCK *blk)
{
BLOCK *new; /* copy of blk */
BLOCK *nblk; /* copy of blk */
/*
* malloc new block
*/
new = (BLOCK *)malloc(sizeof(BLOCK));
if (new == NULL) {
nblk = (BLOCK *)malloc(sizeof(BLOCK));
if (nblk == NULL) {
math_error("blk_copy: cannot malloc BLOCK");
/*NOTREACHED*/
}
@@ -405,18 +405,18 @@ blk_copy(BLOCK *blk)
/*
* duplicate most of the block
*/
*new = *blk;
*nblk = *blk;
/*
* duplicate block data
*/
new->data = (USB8 *)malloc(blk->maxsize);
if (new->data == NULL) {
nblk->data = (USB8 *)malloc(blk->maxsize);
if (nblk->data == NULL) {
math_error("blk_copy: cannot duplicate block data");
/*NOTREACHED*/
}
memcpy(new->data, blk->data, blk->maxsize);
return new;
memcpy(nblk->data, blk->data, blk->maxsize);
return nblk;
}

250
calc.c
View File

@@ -39,7 +39,7 @@
/*
* external and static definitions
* external definitions and functions
*/
extern int abortlevel; /* current level of aborts */
extern BOOL inputwait; /* TRUE if in a terminal input wait */
@@ -52,6 +52,7 @@ extern int u_flag; /* TRUE => unbuffer stdin and stdout */
extern char *pager; /* $PAGER or default */
extern int stdin_tty; /* TRUE if stdin is a tty */
extern int interactive; /* TRUE if interactive session (no cmd args) */
extern char *program; /* our name */
extern char cmdbuf[]; /* command line expression */
@@ -59,135 +60,134 @@ extern char *version(void); /* return version string */
/*
* forward static functions
* static definitions and functions
*/
static char *usage = "usage: %s [-C] [-e] [-h] [-i] [-m mode] [-n] [-p]\n"
"\t[-q] [-u] [[--] calc_cmd ...]\n";
static void intint(int arg); /* interrupt routine */
/*
* Top level calculator routine.
*/
MAIN
int
main(int argc, char **argv)
{
static char *str; /* current option string or expression */
int want_defhelp = 0; /* 1=> we only want the default help */
int cmdlen; /* length of the command string */
extern char *optarg; /* option argument */
extern int optind; /* option index */
int c; /* option */
long i;
char *p;
/*
* parse args
*/
program = argv[0];
argc--;
argv++;
while ((argc > 0) && (**argv == '-')) {
for (str = &argv[0][1]; *str; str++) switch (*str) {
case 'C':
while ((c = getopt(argc, argv, "Cehim:npquv")) != -1) {
switch (c) {
case 'C':
#if defined(CUSTOM)
allow_custom = TRUE;
break;
#else
fprintf(stderr,
"Calc was built with custom functions "
"disabled, -C usage is disallowed\n");
/*
* we are too early in processing to call
* libcalc_call_me_last() - nothing to cleanup
*/
exit(1);
#endif /* CUSTOM */
case 'e':
no_env = TRUE;
break;
case 'h':
want_defhelp = 1;
break;
case 'i':
ign_errmax = TRUE;
break;
case 'm':
if (argv[0][2]) {
p = &argv[0][2];
} else if (argc > 1) {
p = argv[1];
argc--;
argv++;
} else {
fprintf(stderr, "-m requires an arg\n");
/*
* we are too early in processing to
* call libcalc_call_me_last()
* nothing to cleanup
*/
exit(1);
}
if (p[1] != '\0' || *p < '0' || *p > '7') {
fprintf(stderr, "unknown -m arg\n");
/*
* we are too early in processing to
* call libcalc_call_me_last()
* nothing to cleanup
*/
exit(1);
}
allow_read = (((*p-'0') & 04) > 0);
allow_write = (((*p-'0') & 02) > 0);
allow_exec = (((*p-'0') & 01) > 0);
break;
case 'n':
new_std = TRUE;
break;
case 'p':
p_flag = TRUE;
break;
case 'q':
q_flag = TRUE;
break;
case 'u':
u_flag = TRUE;
break;
case 'v':
printf("%s (version %s)\n",
CALC_TITLE, version());
/*
* we are too early in processing to call
* libcalc_call_me_last() - nothing to cleanup
*/
exit(0);
default:
fprintf(stderr,
"usage: %s [-C] [-e] [-h] [-i] [-m mode] [-n] [-p]\n",
program);
fprintf(stderr, "\t[-q] [-u] [calc_cmd ...]\n");
/*
* we are too early in processing to call
* libcalc_call_me_last() - nothing to cleanup
*/
exit(1);
}
argc--;
argv++;
}
cmdbuf[0] = '\0';
str = cmdbuf;
while (--argc >= 0) {
i = (long)strlen(*argv);
if (i+3 >= MAXCMD) {
fprintf(stderr, "command in arg list too long\n");
allow_custom = TRUE;
break;
#else /* CUSTOM */
/*
* we are too early in processing to call
* libcalc_call_me_last() - nothing to cleanup
*/
fprintf(stderr,
"%s: calc was built with custom functions "
"disabled, -C usage is disallowed\n", program);
exit(1);
#endif /* CUSTOM */
case 'e':
no_env = TRUE;
break;
case 'h':
want_defhelp = 1;
break;
case 'i':
ign_errmax = TRUE;
break;
case 'm':
if (optarg[1] == '\0' || *optarg<'0' || *optarg>'7') {
/*
* we are too early in processing to
* call libcalc_call_me_last()
* nothing to cleanup
*/
fprintf(stderr,
"%s: unknown -m arg\n", program);
exit(1);
}
allow_read = (((*optarg-'0') & 04) > 0);
allow_write = (((*optarg-'0') & 02) > 0);
allow_exec = (((*optarg-'0') & 01) > 0);
break;
case 'n':
new_std = TRUE;
break;
case 'p':
p_flag = TRUE;
break;
case 'q':
q_flag = TRUE;
break;
case 'u':
u_flag = TRUE;
break;
case 'v':
/*
* we are too early in processing to call
* libcalc_call_me_last() - nothing to cleanup
*/
printf("%s (version %s)\n", CALC_TITLE, version());
exit(0);
default:
/*
* we are too early in processing to call
* libcalc_call_me_last() - nothing to cleanup
*/
fprintf(stderr, usage, program);
exit(1);
}
*str++ = ' ';
strcpy(str, *argv++);
str += i;
str[0] = '\n';
str[1] = '\0';
}
str = cmdbuf;
interactive = (optind >= argc);
/*
* look at the length of any trailing command args
*
* We make room for the trailing '\0\n' as well as an extra guard byte.
*/
for (cmdlen=0, i=optind; i < argc; ++i) {
/* argument + space separator */
cmdlen += strlen(argv[i]) + 1;
}
if (i > MAXCMD) {
/*
* we are too early in processing to call
* libcalc_call_me_last() - nothing to cleanup
*/
fprintf(stderr,
"%s: command in arg list is too long\n", program);
exit(1);
}
/*
* We will form a command the remaining args separated by spaces.
*/
cmdbuf[0] = '\0';
if (optind < argc) {
strcpy(cmdbuf, argv[optind]);
cmdlen = strlen(argv[optind]);
for (i=optind+1; i < argc; ++i) {
cmdbuf[cmdlen++] = ' ';
strcpy(cmdbuf+cmdlen, argv[i]);
cmdlen += strlen(argv[i]);
}
cmdbuf[cmdlen++] = '\n';
cmdbuf[cmdlen] = '\0';
}
/*
* unbuffered mode
@@ -212,7 +212,7 @@ main(int argc, char **argv)
/*
* if allowed or needed, print version and setup bindings
*/
if (*str == '\0') {
if (interactive) {
/*
* check for pipe mode and/or non-tty stdin
*/
@@ -220,11 +220,6 @@ main(int argc, char **argv)
stdin_tty = isatty(0); /* assume stdin is on fd 0 */
}
/*
* empty string arg is no string
*/
str = NULL;
/*
* if tty, setup bindings
*/
@@ -235,14 +230,15 @@ main(int argc, char **argv)
switch (hist_init(calcbindings)) {
case HIST_NOFILE:
fprintf(stderr,
"Cannot open bindings file \"%s\", %s.\n",
calcbindings, "fancy editing disabled");
"%s: Cannot open bindings file \"%s\", "
"fancy editing disabled.\n",
program, calcbindings);
break;
case HIST_NOTTY:
fprintf(stderr,
"Cannot set terminal modes, %s.\n",
"fancy editing disabled");
"%s: Cannot set terminal modes, "
"fancy editing disabled\n", program);
break;
}
}
@@ -260,21 +256,21 @@ main(int argc, char **argv)
initialize();
} else {
/* initialize already done, jmpbuf is ready */
post_init = TRUE;
post_init = TRUE;
}
/*
* if arg mode or non-tty mode, just do the work and be gone
*/
if (str || !stdin_tty) {
if (!interactive || !stdin_tty) {
if (q_flag == FALSE && allow_read) {
runrcfiles();
q_flag = TRUE;
}
if (str)
(void) openstring(str);
else
if (interactive)
(void) openterminal();
else
(void) openstring(cmdbuf);
start_done = TRUE;
getcommands(FALSE);
libcalc_call_me_last();
@@ -282,7 +278,7 @@ main(int argc, char **argv)
}
}
/* if in arg mode, we should not get here */
if (str) {
if (!interactive) {
libcalc_call_me_last();
exit(1);
}
@@ -301,8 +297,8 @@ main(int argc, char **argv)
* all done
*/
libcalc_call_me_last();
exit(0);
/*NOTREACHED*/
/* exit(0); */
return 0;
}
@@ -339,7 +335,8 @@ math_error(char *fmt, ...)
if (funcname && (*funcname != '*'))
fprintf(stderr, "\"%s\": ", funcname);
if (funcline && ((funcname && (*funcname != '*')) || !inputisterminal()))
if (funcline && ((funcname && (*funcname != '*')) ||
!inputisterminal()))
fprintf(stderr, "line %ld: ", funcline);
va_start(ap, fmt);
vsprintf(buf, fmt, ap);
@@ -349,7 +346,8 @@ math_error(char *fmt, ...)
if (post_init) {
longjmp(jmpbuf, 1);
} else {
fprintf(stderr, "no jmpbuf jumpback point - ABORTING!!!\n");
fprintf(stderr, "It is too early provide a command line prompt "
"so we must simply exit. Sorry!\n");
/*
* don't call libcalc_call_me_last() -- we might loop
* and besides ... this is an unusual internal error case

4
calc.h
View File

@@ -26,7 +26,7 @@
#define DEFAULTCALCHELP "help" /* help file that -h prints */
#define DEFAULTSHELL "sh" /* default shell to use */
#define CALCEXT ".cal" /* extension for files read in */
#define PATHSIZE 1024 /* maximum length of path name */
#define MAX_CALCRC 1024 /* maximum length of $CALCRC */
#define HOMECHAR '~' /* char which indicates home directory */
#define DOTCHAR '.' /* char which indicates current directory */
#define PATHCHAR '/' /* char which separates path components */
@@ -37,7 +37,7 @@
#define SYMBOLSIZE 256 /* maximum symbol name size */
#define MAXINDICES 20 /* maximum number of indices for objects */
#define MAXLABELS 100 /* maximum number of user labels in function */
#define MAXOBJECTS 10 /* maximum number of object types */
#define MAXOBJECTS 128 /* maximum number of object types */
#define MAXSTRING 1024 /* maximum size of string constant */
#define MAXSTACK 1000 /* maximum depth of evaluation stack */
#define MAXFILES 20 /* maximum number of opened files */

123
calc_errno.c Normal file
View File

@@ -0,0 +1,123 @@
/*
* errno - Determine how to declare errno, sys_errlist and sys_nerr
*
* On most machines: errno sys_errlist and sys_nerr are declared
* by either <stdio.h> and/or <errno.h>. But some systems declare
* them somewhere else or do not declare them at all!
*
* If the system were doing a proper job in headers, this should declare them:
*
* #include <stdio.h>
* #include <errno.h>
*
* But one some systems one must explicitly declare them as:
*
* extern int errno;
* extern const char *const sys_errlist[];
* extern int sys_nerr;
*
* and on some old systems they must be explicitly and incorrectly declared as:
*
* extern int errno;
* extern char *sys_errlist[];
* extern int sys_nerr;
*
* The purpose of this utility is try and find the right way to declare
* them and to output the middle of a header file called calc_errno.h.
*/
/*
* Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright, this permission notice and text
* this comment, and the disclaimer below appear in all of the following:
*
* supporting documentation
* source copies
* source works derived from this source
* binaries derived from this source or from derived source
*
* LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
* EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* chongo was here /\../\
*/
#include <stdio.h>
#if defined(TRY_ERRNO_NO_DECL)
# include <errno.h>
#endif /* TRY_ERRNO_NO_DECL */
int
main(void)
{
#if defined(TRY_ERRNO_NO_DECL)
printf("/*\n");
printf(" * The following comments were produced by calc_errno\n");
printf(" * in an effort to see if these values were correctly\n");
printf(" * declared when calc_errno.c was compiled.\n");
printf(" */\n\n");
printf("/* Initially errno is %d */\n", errno);
printf("/* There are %d entries in sys_errlist[] */\n", sys_nerr);
printf("/* The 2nd sys_errlist entry is \"%s\" */\n\n", sys_errlist[1]);
printf("/*\n");
printf(" * Based on the above, calc_errno now knows\n");
printf(" * how to declare errno and friends.\n");
printf(" */\n\n");
printf("#include <stdio.h>\n");
printf("#include <errno.h>\n");
#elif defined(TRY_ERRNO_OLD_DECL)
extern int errno; /* last system error */
extern char *sys_errlist[]; /* system error messages */
extern int sys_nerr; /* number of system errors*/
printf("/*\n");
printf(" * The following comments were produced by calc_errno\n");
printf(" * in an effort to see if these values were correctly\n");
printf(" * declared when calc_errno.c was compiled.\n");
printf(" */\n\n");
printf("/* Initially errno is %d */\n", errno);
printf("/* There are %d entries in sys_errlist[] */\n", sys_nerr);
printf("/* The 2nd sys_errlist entry is \"%s\" */\n\n", sys_errlist[1]);
printf("/*\n");
printf(" * Based on the above, calc_errno now knows\n");
printf(" * how to declare errno and friends.\n");
printf(" */\n\n");
printf("extern int errno;\t\t/* last system error */\n");
printf("extern char *sys_errlist[];\t"
"/* system error messages */\n");
printf("extern int sys_nerr;\t\t/* number of system errors*/\n");
#else /* assume defined(TRY_ERRNO_STD_DECL) */
extern int errno; /* last system error */
extern const char *const sys_errlist[]; /* system error messages */
extern int sys_nerr; /* number of system errors*/
printf("/*\n");
printf(" * The following comments were produced by calc_errno\n");
printf(" * in an effort to see if these values were correctly\n");
printf(" * declared when calc_errno.c was compiled.\n");
printf(" */\n\n");
printf("/* Initially errno is %d */\n", errno);
printf("/* There are %d entries in sys_errlist[] */\n", sys_nerr);
printf("/* The 2nd sys_errlist entry is \"%s\" */\n\n", sys_errlist[1]);
printf("/*\n");
printf(" * Based on the above, calc_errno now knows\n");
printf(" * how to declare errno and friends.\n");
printf(" */\n\n");
printf("extern int errno;\t\t\t/* last system error */\n");
printf("extern const char *const sys_errlist[];\t"
"/* system error messages */\n");
printf("extern int sys_nerr;\t\t\t/* number of system errors*/\n");
#endif
/* exit(0); */
return 0;
}

View File

@@ -71,5 +71,9 @@ END {
if (error > 0 && havebuf0) {
print buf0;
}
exit (error > 0);
if (error > 0) {
exit(1);
} else {
exit(0);
}
}

View File

@@ -81,8 +81,13 @@ static long getinitlist(void);
void
getcommands(BOOL toplevel)
{
char name[PATHSIZE+1]; /* program name */
char name[MAXCMD+1+1]; /* program name */
/* firewall */
name[0] = '\0';
name[MAXCMD+1] = '\0';
/* getcommands */
if (!toplevel)
enterfilescope();
for (;;) {

View File

@@ -890,7 +890,7 @@ config_copy(CONFIG *src)
/*
* copy over the values
*/
*dest = *src;
memcpy((void *)dest, (void *)src, sizeof(CONFIG));
/*
* clone the pointer values

14
const.c
View File

@@ -27,10 +27,11 @@ initconstants(void)
math_error("Unable to allocate constant table");
/*NOTREACHED*/
}
for (i = 0; i < 8; i++)
for (i = 0; i < INITCONSTCOUNT; i++)
consttable[i] = initnumbs[i];
constcount = 8;
constavail = CONSTALLOCSIZE - 8;
consttable[INITCONSTCOUNT] = NULL; /* firewall */
constcount = INITCONSTCOUNT;
constavail = CONSTALLOCSIZE - INITCONSTCOUNT;
}
@@ -187,10 +188,9 @@ freeconstant(unsigned long index)
void
trimconstants(void)
{
NUMBER **qp;
qp = &consttable[constcount];
while (constcount > 0 && (*--qp)->links == 0) {
while (constcount > 0 &&
(consttable[constcount-1] == NULL ||
consttable[constcount-1]->links == 0)) {
constcount--;
constavail++;
}

View File

@@ -41,13 +41,13 @@
#
# Put your custom calc library files here.
#
CUSTOM_CALC_FILES= argv.cal halflen.cal
CUSTOM_CALC_FILES= argv.cal halflen.cal pzasusb8.cal
# The custom help files to install
#
# Put your custom help files here.
#
CUSTOM_HELP= argv devnull help sysinfo
CUSTOM_HELP= argv devnull help sysinfo pzasusb8
# Any .h files that are needed by programs that use libcustcalc.a
#
@@ -63,7 +63,7 @@ CUSTOM_H_SRC=
#
# Put your custom .c files here.
#
CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c
CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c
# Any .o files that are needed by program that use libcustcalc.a.
# Don't put ${REQUIRED_OBJ} files in this list.
@@ -72,7 +72,7 @@ CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c
#
# Put your custom .o files here.
#
CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o
CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o
##############################################################################
#-=-=-=-=-=-=- Defaults in case you want to build from this dir -=-=-=-=-=-=-#
@@ -470,7 +470,8 @@ install: all
else \
true; \
fi
${Q}for i in ${INSTALL_H_SRC}; do \
${Q}for i in ${INSTALL_H_SRC} /dev/null; do \
if [ X$$i = X/dev/null ]; then continue; fi; \
echo rm -f ${CUSTOMLIBDIR}/$$i; \
rm -f ${CUSTOMLIBDIR}/$$i; \
echo cp $$i ${CUSTOMLIBDIR}; \
@@ -589,6 +590,11 @@ c_help.o: ../string.h
c_help.o: ../value.h
c_help.o: ../zmath.h
c_help.o: c_help.c
c_pzasusb8.o: ../custom.h
c_pzasusb8.o: ../have_const.h
c_pzasusb8.o: ../value.h
c_pzasusb8.o: ../zmath.h
c_pzasusb8.o: c_pzasusb8.c
c_sysinfo.o: ../alloc.h
c_sysinfo.o: ../block.h
c_sysinfo.o: ../byteswap.h

70
custom/c_pzasusb8.c Normal file
View File

@@ -0,0 +1,70 @@
/*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted.
*
* Ernest Bowen, following Landon Curt Noll
*/
#if defined(CUSTOM)
#include <stdio.h>
#include "../have_const.h"
#include "../value.h"
#include "../custom.h"
#include "../zmath.h"
/*
* c_pzasusb8 - print numereator of real as if its array of HALFs were
* a string of USB8s
*
* given:
* count = 1;
* vals[0] real number;
*
* returns:
* null
*/
/*ARGSUSED*/
VALUE
c_pzasusb8(char *name, int count, VALUE **vals)
{
VALUE result; /* what we will return */
ZVALUE z; /* numerator of the value */
long half_cnt; /* number of HALFs in the numerator */
USB8 *h; /* octet pointer */
long half_len; /* length of a half in octets */
long i;
long j;
/*
* arg check
*/
result.v_type = V_NULL;
if (vals[0]->v_type != V_NUM) {
math_error("Non-real argument for pzasusb8");
/*NOTREACHED*/
}
/*
* look at the numerator
*/
z = vals[0]->v_num->num;
half_len = sizeof(HALF);
half_cnt = z.len;
/*
* print the octets
*/
h = (USB8 *) z.v;
for (i=0; i < half_cnt; ++i) {
printf("%d:\t", i);
for (j=0; j < half_len; ++j) {
printf("%02x", (int)(*h++));
}
putchar('\n');
}
return result;
}
#endif /* CUSTOM */

View File

@@ -99,6 +99,7 @@ static struct infoname sys_info[] = {
{"LONGLONG_BITS", "length of a long long, or 0", NULL, (FULL)LONGLONG_BITS},
{"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS},
{"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT},
{"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL, (FULL)MAX_CALCRC},
{"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},
@@ -128,8 +129,6 @@ static struct infoname sys_info[] = {
{"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},
{"PATHSIZE", "max length of path name", NULL, (FULL)PATHSIZE},
{"PATHSIZE", "max length of path name", NULL, (FULL)PATHSIZE},
{"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},
@@ -238,9 +237,10 @@ c_sysinfo(char *name, int count, VALUE **vals)
} else if (vals[0]->v_type == V_STR) {
/* convert vals[0] to upper case string */
buf = (char *)malloc(strlen((char *)vals[0]->v_str)+1);
for (q = (char *)vals[0]->v_str, r = buf; *q; ++q, ++r) {
if (isascii(*q) && islower(*q)) {
buf = (char *)malloc(strlen((char *)vals[0]->v_str->s_str)+1);
for (q = (char *)vals[0]->v_str->s_str, r = buf; *q; ++q, ++r)
{
if (isascii((int)*q) && islower((int)*q)) {
*r = *q - 'a' + 'A';
} else {
*r = *q;
@@ -262,7 +262,7 @@ c_sysinfo(char *name, int count, VALUE **vals)
/* return value as string */
result.v_type = V_STR;
result.v_subtype = V_NOSUBTYPE;
result.v_str = (STRING *)p->str;
result.v_str = makestring(p->str);
}
/* return found infotype as value */

View File

@@ -59,6 +59,7 @@ extern VALUE c_argv(char*, int, VALUE**);
extern VALUE c_devnull(char*, int, VALUE**);
extern VALUE c_help(char*, int, VALUE**);
extern VALUE c_sysinfo(char*, int, VALUE**);
extern VALUE c_pzasusb8(char*, int, VALUE**);
#endif /* CUSTOM */
@@ -108,6 +109,9 @@ CONST struct custom cust[] = {
{ "sysinfo", "return a calc #define value",
0, 1, c_sysinfo },
{ "pzasusb8", "print ZCALUE as USB8",
0, 1, c_pzasusb8 },
#endif /* CUSTOM */

50
custom/pzasusb8 Normal file
View File

@@ -0,0 +1,50 @@
NAME
pzasusb8 - print a number in hex octets
SYNOPSIS
custom("pzasusb8", arg)
TYPES
arg real
return null
DESCRIPTION
This custom function prints out the numerator of a real value
in octets. Each HALF value is printed in a separate line.
NOTE: The output will vary depending on the size of a HALF
and the byte order of the system. See:
custom("sysinfo", "BASEB")
custom("sysinfo", "CALC_BYTE_ORDER")
foe details.
This custom function is intented for testing of the general
custom interface.
EXAMPLE
> custom("pzasusb8", 0x01020304050607080910111213141516);
0: 13141516
1: 09101112
2: 05060708
3: 01020304
> custom("pzasusb8", 10^25)
0: 4a000000
1: 16140148
2: 00084595
> printf("%x\n", 10^25);
0x84595161401484a000000
LIMITS
calc must be built with ALLOW_CUSTOM= -DCUSTOM
calc must be executed with a -C arg.
LIBRARY
none
SEE ALSO
custom

29
custom/pzasusb8.cal Normal file
View File

@@ -0,0 +1,29 @@
/*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted.
*
* Ernest Bowen, following Landon Curt Noll
*/
print "p(n) prints array in which numerator of n is stored as a";
print "sequence of 2-hex-digits representing unsigned characters.";
print "h(n) printx n in hex notation. This should be the same as";
print "p(n) except for (1) its leading 0x, (2) possible trailing zeros";
print "in p(n), and (3) the order of the hex-digit pairs.";
print "The following example show results for n = isqrt(2e100).";
print "";
define p(n) {custom("pzasusb8", n); print;}
define h(n) = printf("%x\n", n);
n = isqrt(2e100);
print "";
p(n);
h(n);
print "";
print "BASEB: ", custom("sysinfo", "BASEB");
print "CALC_BYTE_ORDER: ", custom("sysinfo", "CALC_BYTE_ORDER");
print "BIG_ENDIAN: ", custom("sysinfo", "BIG_ENDIAN");
print "LITTLE_ENDIAN: ", custom("sysinfo", "LITTLE_ENDIAN");
print "LONG_BITS: ", custom("sysinfo", "LONG_BITS");
print "LONGLONG_BITS: ", custom("sysinfo", "LONGLONG_BITS");

View File

@@ -39,41 +39,42 @@
char byte[8] = { (char)0x12, (char)0x36, (char)0x48, (char)0x59,
(char)0x01, (char)0x23, (char)0x45, (char)0x67 };
MAIN
int
main(void)
{
/* pointers into the byte order array */
int *intp = (int *)byte;
/* pointers into the byte order array */
int *intp = (int *)byte;
#if defined(DEBUG)
short *shortp = (short *)byte;
long *longp = (long *)byte;
short *shortp = (short *)byte;
long *longp = (long *)byte;
printf("byte: %02x %02x %02x %02x %02x %02x %02x %02x\n",
byte[0], byte[1], byte[2], byte[3],
byte[4], byte[5], byte[6], byte[7]);
printf("short: %04x %04x %04x %04x\n",
shortp[0], shortp[1], shortp[2], shortp[3]);
printf("int: %08x %08x\n",
intp[0], intp[1]);
printf("long: %08x %08x\n",
longp[0], longp[1]);
printf("byte: %02x %02x %02x %02x %02x %02x %02x %02x\n",
byte[0], byte[1], byte[2], byte[3],
byte[4], byte[5], byte[6], byte[7]);
printf("short: %04x %04x %04x %04x\n",
shortp[0], shortp[1], shortp[2], shortp[3]);
printf("int: %08x %08x\n",
intp[0], intp[1]);
printf("long: %08x %08x\n",
longp[0], longp[1]);
#endif
/* Print the standard <machine/endian.h> defines */
printf("#define BIG_ENDIAN\t4321\n");
printf("#define LITTLE_ENDIAN\t1234\n");
/* Print the standard <machine/endian.h> defines */
printf("#define BIG_ENDIAN\t4321\n");
printf("#define LITTLE_ENDIAN\t1234\n");
/* Determine byte order */
if (intp[0] == 0x12364859) {
/* Most Significant Byte first */
printf("#define CALC_BYTE_ORDER\tBIG_ENDIAN\n");
} else if (intp[0] == 0x59483612) {
/* Least Significant Byte first */
printf("#define CALC_BYTE_ORDER\tLITTLE_ENDIAN\n");
} else {
fprintf(stderr,
"Unknown int Byte Order, set CALC_BYTE_ORDER in Makefile\n");
exit(1);
}
exit(0);
/* Determine byte order */
if (intp[0] == 0x12364859) {
/* Most Significant Byte first */
printf("#define CALC_BYTE_ORDER\tBIG_ENDIAN\n");
} else if (intp[0] == 0x59483612) {
/* Least Significant Byte first */
printf("#define CALC_BYTE_ORDER\tLITTLE_ENDIAN\n");
} else {
fprintf(stderr,
"Unknown int Byte Order, set CALC_BYTE_ORDER in Makefile\n");
exit(1);
}
/* exit(0); */
return 0;
}

13
file.c
View File

@@ -1141,6 +1141,7 @@ rewindall(void)
*
* NOTE: Does not support negative file positions.
*/
/*ARGSUSED*/
static ZVALUE
filepos2z(FILEPOS pos)
{
@@ -1493,6 +1494,7 @@ setloc(FILEID id, ZVALUE zpos)
* returns:
* file size as a ZVALUE
*/
/*ARGSUSED*/
static ZVALUE
off_t2z(off_t siz)
{
@@ -1555,6 +1557,7 @@ dev2z(dev_t dev)
* returns:
* file size as a ZVALUE
*/
/*ARGSUSED*/
static ZVALUE
inode2z(ino_t inode)
{
@@ -1841,7 +1844,8 @@ getscanfield(FILE *fp, BOOL skip, unsigned int width, int scannum, char *scanptr
if (c == EOF || c == '\0')
break;
chnum++;
if(scannum && (memchr(scanptr,c,scannum)==NULL) ^ comp)
if(scannum &&
((memchr(scanptr,c,scannum)==NULL) ^ comp))
break;
if (!skip) {
*b++ = c;
@@ -1918,7 +1922,7 @@ getscanwhite(FILE *fp, BOOL skip, unsigned int width, int scannum, char **strptr
if (c == EOF || c == '\0')
break;
chnum++;
if(scannum && !isspace(c) ^ comp)
if(scannum && (!isspace(c) ^ comp))
break;
if (!skip) {
*b++ = c;
@@ -1980,11 +1984,11 @@ fscanfile(FILE *fp, char *fmt, int count, VALUE **vals)
for (;;) {
for (;;) {
f = *fmt++;
if (isspace(f)) {
if (isspace((int)f)) {
getscanwhite(fp,1,0,6,NULL);
do {
f = *fmt++;
} while (isspace(f));
} while (isspace((int)f));
}
c = fgetc(fp);
if (c == EOF)
@@ -2267,6 +2271,7 @@ freadnum(FILE *fp, VALUE *valptr)
num = newnum;
zden = newden;
}
zfree(div);
}
q = qalloc();
q->num = num;

View File

@@ -60,7 +60,7 @@
char *program; /* our name */
MAIN
int
main(int argc, char **argv)
{
int stsizelen; /* bit length of st_size in buf */
@@ -225,5 +225,6 @@ main(int argc, char **argv)
printf("#define SWAP_HALF_IN_INODE(dest, src)\t%s%d%s\n",
"memcpy((void *)(dest), (void *)(src), sizeof(",inodelen,"))");
#endif /* CALC_BYTE_ORDER == BIG_ENDIAN */
exit(0);
/* exit(0); */
return 0;
}

44
func.c
View File

@@ -13,11 +13,12 @@
#if defined(FUNCLIST)
#include <stdio.h>
#define CONST /* disabled for FUNCLIST in case NATIVE_CC doesn't have it */
#else /* FUNCLIST */
#include "calc_errno.h"
#include "have_unistd.h"
#if defined(HAVE_UNISTD_H)
#include <unistd.h>
@@ -77,9 +78,6 @@ static VALUE f_fsize(VALUE *vp);
/*
* external declarations
*/
extern int errno; /* last system error */
extern char *sys_errlist[]; /* system error messages */
extern int sys_nerr; /* number of system errors */
extern char cmdbuf[]; /* command line expression */
extern CONST char *error_table[E__COUNT+2]; /* calc coded error messages */
extern void matrandperm(MATRIX *M);
@@ -232,33 +230,34 @@ f_str(VALUE *vp)
switch (vp->v_type) {
case V_STR:
result.v_str = stringcopy(vp->v_str);
return result;
break;
case V_NULL:
result.v_str = slink(&_nullstring_);
return result;
break;
case V_OCTET:
result.v_str = charstring(*vp->v_octet);
return result;
break;
case V_NUM:
math_divertio();
qprintnum(vp->v_num, MODE_DEFAULT);
cp = math_getdivertedio();
result.v_str = makestring(cp);
break;
case V_COM:
math_divertio();
comprint(vp->v_com);
cp = math_getdivertedio();
result.v_str = makestring(cp);
break;
default:
return error_value(E_STR);
}
result.v_str = makestring(cp);
return result;
}
static VALUE
f_name (VALUE *vp)
f_name(VALUE *vp)
{
VALUE result;
char *cp;
@@ -769,6 +768,13 @@ f_nextcand(int count, NUMBER **vals)
}
static NUMBER *
f_seed(void)
{
return pseudo_seed();
}
static NUMBER *
f_rand(int count, NUMBER **vals)
{
@@ -1244,6 +1250,7 @@ minlistitems(LIST *lp)
VALUE min;
min.v_type = V_NULL;
term.v_type = V_NULL;
for (ep = lp->l_first; ep; ep = ep->e_next) {
vp = &ep->e_value;
@@ -1293,6 +1300,7 @@ maxlistitems(LIST *lp)
VALUE max;
max.v_type = V_NULL;
term.v_type = V_NULL;
for (ep = lp->l_first; ep; ep = ep->e_next) {
vp = &ep->e_value;
@@ -1341,6 +1349,8 @@ f_min(int count, VALUE **vals)
VALUE rel;
min.v_type = V_NULL;
term.v_type = V_NULL;
while (count-- > 0) {
vp = *vals++;
switch(vp->v_type) {
@@ -1392,6 +1402,7 @@ f_max(int count, VALUE **vals)
VALUE rel;
max.v_type = V_NULL;
term.v_type = V_NULL;
while (count-- > 0) {
vp = *vals++;
@@ -1496,6 +1507,7 @@ sumlistitems(LIST *lp)
VALUE sum;
sum.v_type = V_NULL;
term.v_type = V_NULL;
for (ep = lp->l_first; ep; ep = ep->e_next) {
vp = &ep->e_value;
@@ -1536,6 +1548,8 @@ f_sum(int count, VALUE **vals)
VALUE *vp;
sum.v_type = V_NULL;
term.v_type = V_NULL;
while (count-- > 0) {
vp = *vals++;
switch(vp->v_type) {
@@ -4838,14 +4852,14 @@ strscan(char *s, int count, VALUE **vals)
while (*s != '\0') {
s--;
while ((ch = *++s)) {
if (!isspace(ch))
if (!isspace((int)ch))
break;
}
if (ch == '\0' || count-- == 0)
return n;
s0 = s;
while ((ch = *++s)) {
if (isspace(ch))
if (isspace((int)ch))
break;
}
chtmp = ch;
@@ -5171,11 +5185,14 @@ f_strprintf(int count, VALUE **vals)
math_divertio();
i = idprintf(FILEID_STDOUT, vals[0]->v_str->s_str,
count - 1, vals + 1);
if (i)
if (i) {
free(math_getdivertedio());
return error_value(E_STRPRINTF2);
}
cp = math_getdivertedio();
result.v_type = V_STR;
result.v_str = makenewstring(cp);
free(cp);
return result;
}
@@ -5919,6 +5936,7 @@ f_putenv(int count, VALUE **vals)
/* return putenv result */
result.v_type = V_NUM;
result.v_num = itoq((long) putenv(putenv_str));
free(putenv_str);
return result;
}
@@ -7138,6 +7156,8 @@ static CONST struct builtin builtins[] = {
"sec of a within accuracy b"},
{"sech", 1, 2, 0, OP_NOP, 0, f_sech,
"hyperbolic secant of a within accuracy b"},
{"seed", 0, 0, 0, OP_NOP, f_seed, 0,
"return a 64 bit seed for a psuedo-random generator"},
{"segment", 2, 3, 0, OP_NOP, 0, f_segment,
"specified segment of specified list"},
{"select", 2, 2, 0, OP_NOP, 0, f_select,

59
hash.c
View File

@@ -147,13 +147,13 @@ hash_free(HASH *state)
HASH *
hash_copy(HASH *state)
{
HASH *new; /* copy of state */
HASH *hnew; /* copy of state */
/*
* malloc new state
*/
new = (HASH *)malloc(sizeof(HASH));
if (new == NULL) {
hnew = (HASH *)malloc(sizeof(HASH));
if (hnew == NULL) {
math_error("hash_init: cannot malloc HASH");
/*NOTREACHED*/
}
@@ -161,8 +161,8 @@ hash_copy(HASH *state)
/*
* duplicate state
*/
memcpy((void *)new, (void *)state, sizeof(HASH));
return new;
memcpy((void *)hnew, (void *)state, sizeof(HASH));
return hnew;
}
@@ -391,8 +391,8 @@ hash_zvalue(int type, ZVALUE zval, HASH *state)
*/
if (zval.len > full_lim) {
for (j=0; j < zval.len-full_lim-1; j += 2) {
half[j] = zval.v[full_lim+i+1];
half[j+1] = zval.v[full_lim+i];
half[j] = zval.v[full_lim+j+1];
half[j+1] = zval.v[full_lim+j];
}
if (j < zval.len-full_lim) {
half[j] = (HALF)0;
@@ -562,7 +562,7 @@ hash_complex(int type, void *c, HASH *state)
/*
* hash_str - hash a string
* hash_str - hash a null-terminated string
*
* given:
* type - hash type (see hash.h)
@@ -604,6 +604,47 @@ hash_str(int type, char *str, HASH *state)
*/
return state;
}
/*
* hash_STR - hash a STRING
*
* given:
* type - hash type (see hash.h)
* str - the STRING
* state - the state to hash or NULL
*
* returns:
* the new state
*/
HASH *
hash_STR(int type, STRING *str, HASH *state)
{
/*
* initialize if state is NULL
*/
if (state == NULL) {
state = hash_init(type, NULL);
}
/*
* setup for the string hash
*/
if (!state->bytes) {
(state->chkpt)(state);
state->bytes = TRUE;
}
/*
* hash the string
*/
(state->update)(state, (USB8*) str->s_str, (USB32) str->s_len);
/*
* all done
*/
return state;
}
/*
@@ -720,7 +761,7 @@ hash_value(int type, void *v, HASH *state)
/* strings have no setup */
/* hash this type */
state = hash_str(type, value->v_str->s_str, state);
state = hash_STR(type, value->v_str, state);
break;
case V_MAT:

View File

@@ -42,7 +42,7 @@
#include <stdio.h>
MAIN
int
main(void)
{
#if defined(HAVE_NO_CONST)
@@ -56,5 +56,6 @@ main(void)
printf("#undef CONST\n");
printf("#define CONST %s /* yes */\n", str);
#endif /* HAVE_NO_CONST */
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -32,22 +32,23 @@
#include <stdio.h>
MAIN
int
main(void)
{
#if !defined(HAVE_NO_FPOS)
fpos_t pos; /* file position */
fpos_t pos; /* file position */
/* get the current position */
(void) fgetpos(stdin, &pos);
/* get the current position */
(void) fgetpos(stdin, &pos);
/* set the current position */
(void) fsetpos(stdin, &pos);
/* set the current position */
(void) fsetpos(stdin, &pos);
/* print a have_fpos.h body that says we have the functions */
printf("#undef HAVE_FPOS\n");
printf("#define HAVE_FPOS 1 /* yes */\n\n");
printf("typedef fpos_t FILEPOS;\n");
/* print a have_fpos.h body that says we have the functions */
printf("#undef HAVE_FPOS\n");
printf("#define HAVE_FPOS 1 /* yes */\n\n");
printf("typedef fpos_t FILEPOS;\n");
#endif
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -44,7 +44,7 @@
char src[] = "chongo was here";
char dest[MOVELEN+1];
MAIN
int
main(void)
{
#if defined(HAVE_NO_MEMMOVE)
@@ -54,5 +54,6 @@ main(void)
printf("#define HAVE_MEMMOVE /* yes */\n");
#endif /* HAVE_NO_MEMMOVE */
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -46,7 +46,7 @@
char src[] = "chongo was here";
char dest[MOVELEN+1];
MAIN
int
main(void)
{
#if defined(HAVE_NO_NEWSTR)
@@ -58,5 +58,6 @@ main(void)
printf("#define HAVE_NEWSTR /* yes */\n");
#endif /* HAVE_NO_NEWSTR */
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -45,7 +45,7 @@
#include <sys/types.h>
#include <sys/stat.h>
MAIN
int
main(void)
{
#if !defined(OFF_T_NON_SCALAR)
@@ -79,5 +79,6 @@ main(void)
#else
printf("#undef HAVE_OFF_T_SCALAR /* off_t is not a simple value */\n");
#endif
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -46,7 +46,7 @@
#include <sys/stat.h>
#include "have_fpos.h"
MAIN
int
main(void)
{
#if !defined(FILEPOS_NON_SCALAR)
@@ -80,5 +80,6 @@ main(void)
#else
printf("#undef HAVE_FILEPOS_SCALAR /* FILEPOS is not a simple value */\n");
#endif
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -54,86 +54,88 @@ char buf[BUFSIZ];
void
try(char *fmt, ...)
try_this(char *fmt, ...)
{
va_list ap;
va_list ap;
va_start(ap, fmt);
va_start(ap, fmt);
#if !defined(DONT_HAVE_VSPRINTF)
vsprintf(buf, fmt, ap);
vsprintf(buf, fmt, ap);
#else
sprintf(buf, fmt, ap);
sprintf(buf, fmt, ap);
#endif
va_end(ap);
va_end(ap);
}
MAIN
int
main(void)
{
/*
* setup
*/
buf[0] = '\0';
/*
* setup
*/
buf[0] = '\0';
/*
* test variable args and vsprintf/sprintf
*/
try("@%d:%s:%d@", 1, "hi", 2);
if (strcmp(buf, "@1:hi:2@") != 0) {
/*
* test variable args and vsprintf/sprintf
*/
try_this("@%d:%s:%d@", 1, "hi", 2);
if (strcmp(buf, "@1:hi:2@") != 0) {
#if !defined(DONT_HAVE_VSPRINTF)
/* <stdarg.h> with vsprintf() didn't work */
/* <stdarg.h> with vsprintf() didn't work */
#else
/* <stdarg.h> with sprintf() simulating vsprintf() didn't work */
/* <stdarg.h> with sprintf() simulating vsprintf() didn't work */
#endif
exit(1);
}
try("%s %d%s%d%d %s",
"Landon Noll 1st proved that", 2, "^", 23209, -1, "was prime");
if (strcmp(buf, "Landon Noll 1st proved that 2^23209-1 was prime") != 0) {
exit(1);
}
try_this("%s %d%s%d%d %s",
"Landon Noll 1st proved that", 2, "^", 23209, -1, "was prime");
if (strcmp(buf,
"Landon Noll 1st proved that 2^23209-1 was prime") != 0) {
#if !defined(DONT_HAVE_VSPRINTF)
/* <stdarg.h> with vsprintf() didn't work */
/* <stdarg.h> with vsprintf() didn't work */
#else
/* <stdarg.h> with sprintf() simulating vsprintf() didn't work */
/* <stdarg.h> with sprintf() simulating vsprintf() didn't work */
#endif
exit(1);
}
exit(1);
}
/*
* report the result
*/
puts("/* what type of variable args do we have? */");
/*
* report the result
*/
puts("/* what type of variable args do we have? */");
#if defined(DONT_HAVE_VSPRINTF)
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(" * define STDARG (if using ANSI C) or VARARGS.");
puts(" */");
puts("typedef char *va_list;");
puts("#define va_start(ap,parmn) (void)((ap) = (char*)(&(parmn) + 1))");
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("/*");
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(" * define STDARG (if using ANSI C) or VARARGS.");
puts(" */");
puts("typedef char *va_list;");
puts("#define va_start(ap,parmn) (void)((ap) = (char*)(&(parmn) + 1))");
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> */");
#else
puts("#define STDARG /* use <stdarg.h> */");
puts("#include <stdarg.h>");
puts("#define STDARG /* use <stdarg.h> */");
puts("#include <stdarg.h>");
#endif
puts("\n/* should we use vsprintf()? */");
puts("\n/* should we use vsprintf()? */");
#if !defined(DONT_HAVE_VSPRINTF)
puts("#define HAVE_VS /* yes */");
puts("#define HAVE_VS /* yes */");
#else
puts("/*");
puts(" * Hack aleart!!!");
puts(" *");
puts(" * Systems that do not have vsprintf() need something. In some");
puts(" * cases the sprintf function will deal correctly with the");
puts(" * va_alist 3rd arg. Hope for the best!");
puts(" */");
puts("#define vsprintf sprintf");
puts("#undef HAVE_VS");
puts("/*");
puts(" * Hack aleart!!!");
puts(" *");
puts(" * Systems that do not have vsprintf() need something. In some");
puts(" * cases the sprintf function will deal correctly with the");
puts(" * va_alist 3rd arg. Hope for the best!");
puts(" */");
puts("#define vsprintf sprintf");
puts("#undef HAVE_VS");
#endif
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -47,7 +47,7 @@
#include <sys/types.h>
#endif /* ! HAVE_NO_UID_T */
MAIN
int
main(void)
{
#if defined(HAVE_NO_UID_T)
@@ -60,5 +60,6 @@ main(void)
printf("#define HAVE_UID_T /* yes */\n");
#endif /* HAVE_NO_UID_T */
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -52,7 +52,7 @@ char buf[BUFSIZ];
#include <varargs.h>
void
try(char *fmt, ...)
try_this(char *fmt, ...)
{
va_list ap;
@@ -68,7 +68,7 @@ try(char *fmt, ...)
#else
void
try(char *a, int b, char *c, int d)
try_this(char *a, int b, char *c, int d)
{
return;
}
@@ -76,56 +76,58 @@ try(char *a, int b, char *c, int d)
#endif
MAIN
int
main(void)
{
/*
* setup
*/
buf[0] = '\0';
/*
* setup
*/
buf[0] = '\0';
/*
* test variable args and vsprintf/sprintf
*/
try("@%d:%s:%d@", 1, "hi", 2);
if (strcmp(buf, "@1:hi:2@") != 0) {
/*
* test variable args and vsprintf/sprintf
*/
try_this("@%d:%s:%d@", 1, "hi", 2);
if (strcmp(buf, "@1:hi:2@") != 0) {
#if !defined(DONT_HAVE_VSPRINTF)
/* <varargs.h> with vsprintf() didn't work */
/* <varargs.h> with vsprintf() didn't work */
#else
/* <varargs.h> with sprintf() simulating vsprintf() didn't work */
/* <varargs.h> with sprintf() simulating vsprintf() didn't work */
#endif
exit(1);
}
try("%s %d%s%d%d %s",
"Landon Noll 1st proved that", 2, "^", 23209, -1, "was prime");
if (strcmp(buf, "Landon Noll 1st proved that 2^23209-1 was prime") != 0) {
exit(1);
}
try_this("%s %d%s%d%d %s",
"Landon Noll 1st proved that", 2, "^", 23209, -1, "was prime");
if (strcmp(buf,
"Landon Noll 1st proved that 2^23209-1 was prime") != 0) {
#if !defined(DONT_HAVE_VSPRINTF)
/* <stdarg.h> with vsprintf() didn't work */
/* <stdarg.h> with vsprintf() didn't work */
#else
/* <stdarg.h> with sprintf() simulating vsprintf() didn't work */
/* <stdarg.h> with sprintf() simulating vsprintf() didn't work */
#endif
exit(1);
}
exit(1);
}
/*
* report the result
*/
puts("/* what type of variable args do we have? */");
puts("#define VARARGS /* use <varargs.h> */");
puts("#include <varargs.h>");
puts("\n/* should we use vsprintf()? */");
/*
* report the result
*/
puts("/* what type of variable args do we have? */");
puts("#define VARARGS /* use <varargs.h> */");
puts("#include <varargs.h>");
puts("\n/* should we use vsprintf()? */");
#if !defined(DONT_HAVE_VSPRINTF)
puts("#define HAVE_VS /* yes */");
puts("#define HAVE_VS /* yes */");
#else
puts("/*");
puts(" * Hack aleart!!!");
puts(" *");
puts(" * Systems that do not have vsprintf() need something. In some");
puts(" * cases the sprintf function will deal correctly with the");
puts(" * va_alist 3rd arg. Hope for the best!");
puts(" */");
puts("#define vsprintf sprintf");
puts("#undef HAVE_VS");
puts("/*");
puts(" * Hack aleart!!!");
puts(" *");
puts(" * Systems that do not have vsprintf() need something. In some");
puts(" * cases the sprintf function will deal correctly with the");
puts(" * va_alist 3rd arg. Hope for the best!");
puts(" */");
puts("#define vsprintf sprintf");
puts("#undef HAVE_VS");
#endif
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -124,7 +124,7 @@ DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd append \
pmod polar poly pop popcnt power prevcand prevprime printf prompt \
protect ptest push putenv quo quomod rand randbit random randombit \
randperm rcin rcmul rcout rcpow rcsq re remove reverse rewind rm root \
round rsearch runtime saveval scale scan scanf search sec sech \
round rsearch runtime saveval scale scan scanf search sec sech seed \
segment select sgn sha sha1 sin sinh size sizeof sort sqrt srand \
srandom ssq str strcat strerror strlen strpos strprintf strscan \
strscanf substr sum swap system tail tan tanh test time trunc xor

View File

@@ -25,7 +25,7 @@ LIBRARY
none
SEE ALSO
rand, srand, randbit,
seed, rand, srand, randbit,
isassoc, isatty, isblk, isconfig, isdefined, iserror, iseven, isfile,
ishash, isident, isint, islist, ismat, ismult, isnull, isnum, isobj,
isobjtype, isodd, isprime, israndom, isreal, isrel,

View File

@@ -27,7 +27,7 @@ LIBRARY
none
SEE ALSO
random, srandom, randombit,
seed, random, srandom, randombit,
isassoc, isatty, isblk, isconfig, isdefined, iserror, iseven, isfile,
ishash, isident, isint, islist, ismat, ismult, isnull, isnum, isobj,
isobjtype, isodd, isprime, isrand, isreal, isrel,

View File

@@ -230,4 +230,4 @@ LIBRARY
long irand(long max)
SEE ALSO
srand, randbit, isrand, random, srandom, israndom
seed, srand, randbit, isrand, random, srandom, israndom

View File

@@ -40,4 +40,4 @@ LIBRARY
void zrand(long cnt, ZVALUE *res)
SEE ALSO
srand, randbit, isrand, random, srandom, israndom
seed, srand, randbit, isrand, random, srandom, israndom

View File

@@ -154,4 +154,4 @@ LIBRARY
long irandom(long max)
SEE ALSO
srand, randbit, isrand, rand, srandom, israndom
seed, srand, randbit, isrand, rand, srandom, israndom

View File

@@ -39,4 +39,4 @@ LIBRARY
void zrandom(long cnt, ZVALUE *res)
SEE ALSO
srand, randbit, isrand, rand, srandom, israndom
seed, srand, randbit, isrand, rand, srandom, israndom

52
help/seed Normal file
View File

@@ -0,0 +1,52 @@
NAME
seed - return a value that may be used to seed a pseudo-random generator
SYNOPSIS
seed()
TYPES
return integer
DESCRIPTION
Generate a pseudo-random seed based on a collection of system and process
information. The seed() builtin function returns a value:
0 <= seed < 2^64
IMPORTANT WARNING:
It should be pointed out that the information collected by seed
is almost certainly non-chaotic. This function is likely not
suitable for applications (such as cryptographic applications)
where the unpredictability of seeds is critical. For such critical
applications, lavarand should be used. Seed:
http://lavarand.sgi.com
for information about seeding a pseudo-random number generator
(such as rand() or random()) with the cryptographic hash of the
digitization of chaotic system.
Given the above warning, this builtin function produces a seed that is
suitable for most applications that desire a different pseudo-random
sequence each time they are run.
The return value of this builtin function should NOT be considered
a random or pseudo-random value. The return value should be used
as an argument to a seed function such as srand() or srandom().
EXAMPLE
> print srand(seed())
RAND state
> print srandom(seed())
RAND state
LIMITS
none
LIBRARY
NUMBER *pseudo_seed(void)
SEE ALSO
seed, srand, randbit, isrand, rand, random, srandom, israndom

View File

@@ -148,4 +148,4 @@ LIBRARY
RAND *zsetrand(RAND *state)
SEE ALSO
srandom, randbit, isrand, random, srandom, israndom
seed, srandom, randbit, isrand, random, srandom, israndom

View File

@@ -337,4 +337,4 @@ LIBRARY
RAND *zsetrandom(RAND *state)
SEE ALSO
srand, randbit, isrand, random, srandom, israndom
seed, srand, randbit, isrand, random, srandom, israndom

View File

@@ -235,3 +235,9 @@ Needed enhancements
One should make available a the fundimental math operations
on ZVALUE, NUMBER and perhaps COMPLEX (without all of the
other stuff) in a separate library.
* improve the coverage in the 'SEE ALSO' help file lists
* where reasonable, be sure that regress.cal tests builtin functions
* clean the source code and document it better

26
hist.c
View File

@@ -421,12 +421,12 @@ do_map_line(char *line)
char *map_name;
cp = line;
while (isspace(*cp))
while (isspace((int)*cp))
cp++;
if (*cp == '\0')
return NULL;
map_name = cp;
while ((*cp != '\0') && !isspace(*cp))
while ((*cp != '\0') && !isspace((int)*cp))
cp++;
*cp = '\0';
return find_map(map_name);
@@ -461,7 +461,7 @@ do_bind_line(KEY_MAP *map, char *line)
else if (key == '\\')
key = *cp++;
while (isspace(*cp))
while (isspace((int)*cp))
cp++;
if (*cp == '\0') {
unbind_key(map, key);
@@ -469,11 +469,11 @@ do_bind_line(KEY_MAP *map, char *line)
}
func_name = cp;
while ((*cp != '\0') && !isspace(*cp))
while ((*cp != '\0') && !isspace((int)*cp))
cp++;
if (*cp) {
*cp++ = '\0';
while (isspace(*cp))
while (isspace((int)*cp))
cp++;
}
func = find_func(func_name);
@@ -488,11 +488,11 @@ do_bind_line(KEY_MAP *map, char *line)
next = base_map;
} else {
next_name = cp;
while ((*cp != '\0') && !isspace(*cp))
while ((*cp != '\0') && !isspace((int)*cp))
cp++;
if (*cp) {
*cp++ = '\0';
while (isspace(*cp))
while (isspace((int)*cp))
cp++;
}
next = find_map(next_name);
@@ -515,18 +515,18 @@ do_default_line(KEY_MAP *map, char *line)
if (map == NULL)
return;
cp = line;
while (isspace(*cp))
while (isspace((int)*cp))
cp++;
if (*cp == '\0')
return;
func_name = cp;
while ((*cp != '\0') && !isspace(*cp))
while ((*cp != '\0') && !isspace((int)*cp))
cp++;
if (*cp != '\0')
{
*cp++ = '\0';
while (isspace(*cp))
while (isspace((int)*cp))
cp++;
}
func = find_func(func_name);
@@ -538,12 +538,12 @@ do_default_line(KEY_MAP *map, char *line)
else
{
next_name = cp;
while ((*cp != '\0') && !isspace(*cp))
while ((*cp != '\0') && !isspace((int)*cp))
cp++;
if (*cp != '\0')
{
*cp++ = '\0';
while (isspace(*cp))
while (isspace((int)*cp))
cp++;
}
next = find_map(next_name);
@@ -577,7 +577,7 @@ read_bindings(FILE *fp)
while (fgets(line, sizeof(line) - 1, fp)) {
cp = line;
while (isspace(*cp))
while (isspace((int)*cp))
cp++;
if ((*cp == '\0') || (*cp == '#') || (*cp == '\n'))

1
hist.h
View File

@@ -30,7 +30,6 @@
#define DOTCHAR '.' /* char which indicates current directory */
#define PATHCHAR '/' /* char which separates path components */
#define LISTCHAR ':' /* char which separates paths in a list */
#define PATHSIZE 1024 /* maximum length of path name */
/*

78
input.c
View File

@@ -91,20 +91,51 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once)
{
int i;
char *cp;
char path[PATHSIZE+1]; /* name being searched for */
char *path; /* name being searched for */
struct stat statbuf; /* stat of the path */
unsigned long namelen; /* length of name */
unsigned long extlen; /* length of the extension if non-NULL or 0 */
unsigned long pathlen; /* length of the pathlist if non-NULL or 0 */
/*
* allocate storage for the longest name being searched for
*
* We will allocate more than we could ever want/need.
* The longest we could ever need would be:
*
* pathlist (as a single long string)
* /
* name
* .
* extenstion
* \0
* guard byte
*/
namelen = strlen(name);
if (extension != NULL) {
extlen = strlen(extension);
} else {
extlen = 0;
}
if (pathlist != NULL) {
pathlen = strlen(pathlist);
} else {
pathlen = 0;
}
path = malloc(pathlen+1 + 1 + namelen+1 + extlen+1 + 1 + 1);
if (path == NULL) {
math_error("Cannot allocate filename path buffer");
/*NOTREACHED*/
}
/*
* Don't try the extension if the filename already contains it.
*/
if (extension) {
unsigned long namelen = strlen(name);
unsigned long extlen = strlen(extension);
if (namelen >= extlen &&
strcmp(&name[namelen-extlen], extension) == 0)
extension = NULL;
if (extension != NULL && namelen >= extlen &&
strcmp(&name[namelen-extlen], extension) == 0) {
extension = NULL;
}
/*
* If the name is absolute, or if there is no path list, then
* make one which just searches for the name straight. Then
@@ -127,21 +158,26 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once)
*cp++ = PATHCHAR;
strcpy(cp, name);
i = openfile(path);
if ((i < 0) && (extension != NULL && extension[0] != '\0')) {
if ((i < 0) &&
(extension != NULL && extension[0] != '\0')) {
strcat(path, extension);
i = openfile(path);
}
} while ((i < 0) && *pathlist);
/* examine what our search produced */
if (i < 0)
if (i < 0) {
free(path);
return i;
}
if (cip->i_fp == NULL) {
/* cannot find a file to open */
free(path);
return -3;
}
if (fstat(fileno(cip->i_fp), &statbuf) < 0) {
/* unable to fstat the open file */
free(path);
return -4;
}
@@ -149,6 +185,7 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once)
if (rd_once == TRUE && isinoderead(&statbuf) >= 0) {
/* file is in readset and reopen is false */
closeinput();
free(path);
return 1;
}
@@ -156,10 +193,12 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once)
if (addreadset(name, path, &statbuf) < 0) {
/* cannot add to readset */
closeinput();
free(path);
return -1;
}
/* file was added to/updated in readset */
free(path);
return 0;
}
@@ -189,7 +228,7 @@ homeexpand(char *name)
char *home2; /* fullpath of the home directory */
char *fullpath; /* the malloced expanded path */
char *after; /* after the ~user or ~ */
char username[PATHSIZE+1]; /* extratced username */
char *username; /* extratced username */
/* firewall */
if (name[0] != HOMECHAR)
@@ -217,11 +256,15 @@ homeexpand(char *name)
}
/* just malloc the home directory and return it */
fullpath = (char *)malloc(strlen(ent->pw_dir)+1);
if (fullpath == NULL) {
return NULL;
}
strcpy(fullpath, ent->pw_dir);
return fullpath;
}
if (after-name > PATHSIZE+1) {
/* username is too big */
username = (char *) malloc(after-name + 1 + 1);
if (username == NULL) {
/* failed to malloc username */
return NULL;
}
strncpy(username, name+1, after-name-1);
@@ -229,6 +272,7 @@ homeexpand(char *name)
/* get that user's home directory */
ent = (struct passwd *)getpwnam(username);
free(username);
if (ent == NULL) {
/* unknown user */
return NULL;
@@ -241,6 +285,9 @@ homeexpand(char *name)
* build the fullpath given the home directory
*/
fullpath = (char *)malloc(strlen(home2)+strlen(after)+1);
if (fullpath == NULL) {
return NULL;
}
sprintf(fullpath, "%s%s", home2, after);
return fullpath;
}
@@ -333,6 +380,9 @@ openfile(char *name)
cip->i_fp = fp;
cip->i_line = 1;
cip->i_name = (char *)malloc(strlen(name) + 1);
if (cip->i_name == NULL) {
return -1;
}
strcpy(cip->i_name, name);
return 0;
}
@@ -658,7 +708,7 @@ reread(void)
void
runrcfiles(void)
{
char path[PATHSIZE+1]; /* name being searched for */
char path[MAX_CALCRC+1+1]; /* name being searched for */
char *cp;
char *newcp;
char *p;

View File

@@ -1,4 +1,4 @@
# Copyright (c) 1997 David I. Bell and Landon Curt Noll
# Copyright (c) 1999 David I. Bell and Landon Curt Noll
# Permission is granted to use, distribute, or modify this source,
# provided that this copyright notice remains intact.
@@ -8,13 +8,12 @@ them to be useful!
If you write something that you think is useful, please send it to:
dbell@auug.org.au
chongo@toad.com {uunet,pyramid,sun}!hoptoad!chongo
calc-tester@postofc.corp.sgi.com
By convention, a lib file only defines and/or initializes functions,
objects and variables. (The regression test is an exception.) Also by
convention, the a usage message regarding each important object and
function is printed at the time of the read.
objects and variables. (The regress.cal and testxxx.cal regression test
suite is an exception.) Also by convention, an additional usage message
regarding important object and functions is printed.
If a lib file needs to load another lib file, it should use the -once
version of read:
@@ -45,16 +44,23 @@ global variable. By convention, "lib_debug" has the following meanings:
printed at the time of the read in addition
to other debug messages
To conform to the above convention, your lib files should end with
lines of the form:
When config("lib_debug") >= 0, function names and their arg are
printed as they are defined. Sometimes this printing is not enough
information. For example:
* useful obj definitions
* functions with optional args
* functions with optional args where the param() interface is used
For these cases we suggest that you place at the bottom of your code
something like:
if (config("lib_debug") >= 0) {
print "obj xyz defined";
print "funcA(side_a, side_b, side_c) defined";
print "funcB(size, mass) defined";
print "funcA([val1 [, val2]]) defined";
print "funcB(size, mass, ...) defined";
}
=-=
beer.cal
@@ -100,7 +106,7 @@ deg.cal
ellip.cal
factor(iN, ia, B, force)
efactor(iN, ia, B, force)
Attempt to factor using the elliptic functions: y^2 = x^3 + a*x + b.
@@ -160,7 +166,7 @@ mfactor.cal
mod.cal
mod(a)
lmod(a)
mod_print(a)
mod_one()
mod_cmp(a, b)
@@ -250,7 +256,7 @@ pix.cal
pollard.cal
factor(N, N, ai, af)
pfactor(N, N, ai, af)
Factor using Pollard's p-1 method.
@@ -520,6 +526,20 @@ test3400.cal
This script is used by regress.cal to test trig functions.
containing objects.
test3500.cal
global defaultverbose
global err
testfrem(x, y, verbose)
testgcdrem(x, y, verbose)
testf(str, n, verbose)
testg(str, n, verbose)
testh(str, n, N, verbose)
test3500(verbose, n, N)
This script is used by regress.cal to test the functions frem,
fcnt, gcdrem.
test4000.cal
global defaultverbose
@@ -617,7 +637,7 @@ varargs.cal
xx_print.cal
isoctet(a) defined
is_octet(a) defined
list_print(a) defined
mat_print (a) defined
octet_print(a) defined

View File

@@ -20,7 +20,3 @@ for (i=99; i > 0;) {
bottles = (i!=1) ? "bottles" : "bottle";
print less, bottles, "of beer on the wall!\n";
}
if (config("lib_debug") >= 0) {
/* nothing to do! */
}

View File

@@ -60,7 +60,3 @@ define B(n)
Bnmax = n;
return Bn[n];
}
if (config("lib_debug") >= 0) {
print "B(n) defined";
}

View File

@@ -25,7 +25,3 @@ define bigprime(a, m, p)
print " " : n;
}
}
if (config("lib_debug") >= 0) {
print "bigprime(a, m, p) defined";
}

View File

@@ -113,11 +113,4 @@ define fixdms(a)
if (config("lib_debug") >= 0) {
print "obj dms {deg, min, sec} defined";
print "dms(deg, min, sec) defined";
print "dms_add(a, b) defined";
print "dms_neg(a) defined";
print "dms_sub(a, b) defined";
print "dms_mul(a, b) defined";
print "dms_print(a) defined";
print "dms_abs(a) defined";
}

View File

@@ -24,7 +24,7 @@
* only an approximation, read "A Course in Number Theory and Cryptography"
* by Neal Koblitz for a good explanation.
*
* factor(iN, ia, B, force)
* efactor(iN, ia, B, force)
* iN is the number to be factored.
* ia is the initial value of a in the equation, and each successive
* value of a is an independent attempt at factoring (default 1).
@@ -66,7 +66,7 @@ global b; /* second coefficient */
global f; /* found factor */
define factor(iN, ia, B, force)
define efactor(iN, ia, B, force)
{
local C, x, p;
@@ -165,7 +165,3 @@ define point_pow(p, pow)
}
return r;
}
if (config("lib_debug") >= 0) {
print "factor(N, I, B, force) defined";
}

View File

@@ -6,7 +6,3 @@
*/
while(1) print "Hello World!";
if (config("lib_debug") >= 0) {
/* nothing to do */
}

View File

@@ -1029,7 +1029,3 @@ ldebug(funct, str)
}
return;
}
if (config("lib_debug") >= 0) {
print "lucas(h, n) defined";
}

View File

@@ -374,7 +374,3 @@ lucas_chk(high_n, quiet)
return 0;
}
}
if (config("lib_debug") >= 0) {
print "lucas_chk(high_n) defined";
}

View File

@@ -31,7 +31,3 @@ define mersenne(p)
/* 2^p-1 is prime iff u(p) = 0 mod 2^p-1 */
return (u == 0);
}
if (config("lib_debug") >= 0) {
print "mersenne(p) defined";
}

View File

@@ -12,12 +12,12 @@ obj mod {a}; /* definition of the object */
global mod_value = 100; /* modulus value (value of N) */
define mod(a)
define lmod(a)
{
local obj mod x;
if (!isreal(a) || !isint(a))
quit "Bad argument for mod function";
quit "Bad argument for lmod function";
x.a = a % mod_value;
return x;
}
@@ -34,7 +34,7 @@ define mod_print(a)
define mod_one()
{
return mod(1);
return lmod(1);
}
@@ -51,9 +51,9 @@ define mod_cmp(a, b)
define mod_rel(a, b)
{
if (isnum(a))
a = mod(a);
a = lmod(a);
if (isnum(b))
b = mod(b);
b = lmod(b);
if (a.a < b.a)
return -1;
return a.a != b.a;
@@ -163,9 +163,9 @@ define mod_div(a, b)
obj mod x, y;
if (isnum(a))
a = mod(a);
a = lmod(a);
if (isnum(b))
b = mod(b);
b = lmod(b);
c = gcd(a.a, b.a);
x.a = a.a / c;
y.a = b.a / c;
@@ -191,20 +191,6 @@ define mod_pow(a, b)
if (config("lib_debug") >= 0) {
print "obj mod {a} defined";
print "mod(a) defined";
print "mod_print(a) defined";
print "mod_one(a) defined";
print "mod_cmp(a, b) defined";
print "mod_rel(a, b) defined";
print "mod_add(a, b) defined";
print "mod_sub(a, b) defined";
print "mod_mod(a, b) defined";
print "mod_square(a) defined";
print "mod_inc(a) defined";
print "mod_dec(a) defined";
print "mod_inv(a) defined";
print "mod_div(a, b) defined";
print "mod_pow(a, b) defined";
print "mod_value defined";
print "set mod_value as needed";
}

View File

@@ -592,41 +592,3 @@ define set_print(a)
}
local N, M; /* End scope of static variables N, M */
if (config("lib_debug") >= 0) {
print "isset(a) defined";
print "setbound(n) defined";
print "empty() defined";
print "full() defined";
print "isin(a, b) defined";
print "addmember(a, n) defined";
print "rmmember(a, n) defined";
print "set() defined";
print "mkset(s) defined";
print "primes(a, b) defined";
print "set_max(a) defined";
print "set_min(a) defined";
print "set_not(a) defined";
print "set_cmp(a, b) defined";
print "set_rel(a, b) defined";
print "set_or(a, b) defined";
print "set_and(a, b) defined";
print "set_comp(a) defined";
print "set_setminus(a, b) defined";
print "set_xor(a,b) defined";
print "set_content(a) defined";
print "set_add(a, b) defined";
print "set_sub(a, b) defined";
print "set_mul(a, b) defined";
print "set_square(a) defined";
print "set_pow(a, n) defined";
print "set_sum(a) defined";
print "set_plus(a) defined";
print "interval(a, b) defined";
print "isinterval(a) defined";
print "set_mod(a, b) defined";
print "randset(n, a, b) defined";
print "polyvals(L, A) defined";
print "polyvals2(L, A, B) defined";
print "set_print(a) defined";
}

View File

@@ -66,8 +66,3 @@ define pellx(D)
}
return Q1;
}
if (config("lib_debug") >= 0) {
print "pell(D) defined";
print "pellx(D) defined";
}

View File

@@ -47,7 +47,3 @@ define qpi(epsilon)
}
return (bround(1/an, bits));
}
if (config("lib_debug") >= 0) {
print "qpi(epsilon) defined";
}

View File

@@ -38,7 +38,3 @@ define pi_of_x(x)
}
return primes;
}
if (config("lib_debug") >= 0) {
print "pi_of_x(x) defined";
}

View File

@@ -6,7 +6,7 @@
* Factor using Pollard's p-1 method.
*/
define factor(N, B, ai, af)
define pfactor(N, B, ai, af)
{
local a, k, i, d;
@@ -28,7 +28,3 @@ define factor(N, B, ai, af)
}
return 1;
}
if (config("lib_debug") >= 0) {
print "factor(N, B, ai, af) defined";
}

View File

@@ -689,39 +689,4 @@ c=pol(1+2i,3+4i,5+6i);
if (config("lib_debug") >= 0) {
print "obj poly {p} defined";
print "pol() defined";
print "poly_print(a) defined";
print "poly_add(a, b) defined";
print "poly_sub(a, b) defined";
print "poly_mul(a, b) defined";
print "poly_div(a, b) defined";
print "poly_quo(a,b) defined";
print "poly_mod(a,b) defined";
print "poly_neg(a) defined";
print "poly_conj(a) defined";
print "poly_cmp(a,b) defined";
print "iszero(a) defined";
print "plist(a) defined";
print "listmul(a,b) defined";
print "ev(a,t) defined";
print "evp(s,t) defined";
print "ispoly(a) defined";
print "isstring(a) defined";
print "var(name) defined";
print "pcoeff(a) defined";
print "pterm(a,n) defined";
print "deg(a) defined";
print "polydiv(a,b) defined";
print "D(a,n) defined";
print "Dp(a,n) defined";
print "pgcd(a,b) defined";
print "plcm(a,b) defined";
print "monic(a) defined";
print "pfgcd(a,b) defined";
print "interp(X,Y,x) defined";
print "makediffs(X,Y) defined";
print "evalfd(T,x) defined";
print "mdet(A) defined";
print "M(A,n,I,J) defined";
print "mprint(A) defined";
}

View File

@@ -94,8 +94,3 @@ define showvalues(str) {
print "\t":eval(str);
}
}
if (config("lib_debug") >= 0) {
print "adder() defined";
print "showvalues(str) defined";
}

View File

@@ -48,8 +48,3 @@ define psqrt(u, p)
}
return min(v, p - v);
}
if (config("lib_debug") >= 0) {
print "psqrt(u, p) defined";
}

View File

@@ -197,19 +197,4 @@ define quat_shift(a, b)
if (config("lib_debug") >= 0) {
print "obj quat {s, v} defined";
print "quat(a, b, c, d) defined";
print "quat_print(a) defined";
print "quat_norm(a) defined";
print "quat_abs(a, e) defined";
print "quat_conj(a) defined";
print "quat_add(a, e) defined";
print "quat_sub(a, e) defined";
print "quat_inc(a) defined";
print "quat_dec(a) defined";
print "quat_neg(a) defined";
print "quat_mul(a, b) defined";
print "quat_div(a, b) defined";
print "quat_inv(a) defined";
print "quat_scale(a, b) defined";
print "quat_shift(a, b) defined";
}

View File

@@ -112,7 +112,3 @@ define randbitrun(run_cnt)
printf("length>%d\t\t\t\t\tcount=%d\n", MAX_RUN, long_run_cnt);
printf("max length=%d\n", max_run);
}
if (config("lib_debug") >= 0) {
print "randbitrun([run_length]) defined";
}

View File

@@ -129,7 +129,3 @@ randmprime(bits, seed, dbg)
}
return ret;
}
if (config("lib_debug") >= 0) {
print "randmprime(bits, seed [,dbg]) defined";
}

View File

@@ -112,7 +112,3 @@ define randombitrun(run_cnt)
printf("length>%d\t\t\t\t\tcount=%d\n", MAX_RUN, long_run_cnt);
printf("max length=%d\n", max_run);
}
if (config("lib_debug") >= 0) {
print "randombitrun([run_length]) defined";
}

View File

@@ -121,7 +121,3 @@ define randomrun(run_cnt)
printf("length>%d\t\t\t\t\tcount=%d\n", MAX_RUN, long_run_cnt);
printf("max length=%d\n", max_run);
}
if (config("lib_debug") >= 0) {
print "randomrun([run_length]) defined";
}

View File

@@ -702,6 +702,8 @@ define test_functions()
{
local a, b;
local pi;
local h, n, r, m, v;
local n2, m2, v2;
print '700: Beginning test_functions';
@@ -1163,7 +1165,31 @@ define test_functions()
vrfy(popcnt(pi(1e-20),0) == 69, '1101: popcnt(pi(1e-20),0) == 69');
vrfy(popcnt(17^777) == 1593, '1102: popcnt(17^777) == 1593');
print '1103: Ending test_functions';
/*
* more hnrmod testing
*/
vrfy(hnrmod(21<<100+5,3,100,1) == (21<<100+5)%(3<<100+1),
'1103: hnrmod(21<<100+5,3,100,1) == (21<<100+5)%(3<<100+1)');
vrfy(hnrmod(21<<500+7,3,500,1) == (21<<500+7)%(3<<500+1),
'1104: hnrmod(21<<500+7,3,500,1) == (21<<500+7)%(3<<500+1)');
vrfy(hnrmod(-767256,84,1,0) == (-767256)%(84<<1+0),
'1105: hnrmod(-767256,84,1,0) == (-767256)%(84<<1+0)');
vrfy(hnrmod(-831150,75,1,0) == (-831150)%(75<<1+0),
'1106: hnrmod(-831150,75,1,0) == (-831150)%(75<<1+0)');
vrfy(hnrmod(-767256,84,1,1) == (-767256)%(84<<1+1),
'1107: hnrmod(-767256,84,1,1) == (-767256)%(84<<1+1)');
vrfy(hnrmod(-831150,75,1,1) == (-831150)%(75<<1+1),
'1108: hnrmod(-831150,75,1,1) == (-831150)%(75<<1+1)');
vrfy(hnrmod(-767256,84,1,-1) == (-767256)%(84<<1-1),
'1109: hnrmod(-767256,84,1,-1) == (-767256)%(84<<1-1)');
vrfy(hnrmod(-831150,75,1,-1) == (-831150)%(75<<1-1),
'1110: hnrmod(-831150,75,1,-1) == (-831150)%(75<<1-1)');
vrfy(hnrmod(21<<100+5,3,100,0) == (21<<100+5)%(3<<100+0),
'1111: hnrmod(21<<100+5,3,100,0) == (21<<100+5)%(3<<100+0)');
vrfy(hnrmod(21<<500+7,3,500,-1) == (21<<500+7)%(3<<500-1),
'1112: hnrmod(21<<500+7,3,500,-1) == (21<<500+7)%(3<<500-1)');
print '1113: Ending test_functions';
}
print '017: parsed test_functions()';
@@ -1529,7 +1555,12 @@ define test_rand()
vrfy(randbit() == 1, '1567: randbit() == 1');
vrfy(randbit() == 0, '1568: randbit() == 0');
print '1569: Ending rand test';
/* test seed() as best as we can */
vrfy(seed() >= 0, '1569: seed() >= 0');
vrfy(seed() < 2^64, '1570: seed() < 2^64');
vrfy(isrand(srand(seed())), '1571: isrand(srand(seed()))');
print '1572: Ending rand test';
}
print '025: parsed test_rand()';
@@ -4384,7 +4415,12 @@ define test_random()
vrfy(randombit(123) == 0x2058f802dd42b3aee4e734eacc13057, \
'5463: randombit(123) == 0x2058f802dd42b3aee4e734eacc13057');
print '5464: Ending test_random';
/* test seed() as best as we can */
vrfy(seed() >= 0, '5464: seed() >= 0');
vrfy(seed() < 2^64, '5465: seed() < 2^64');
vrfy(israndom(srandom(seed())), '5466: israndom(srandom(seed()))');
print '5467: Ending test_random';
}
print '137: parsed test_random()';
@@ -5881,8 +5917,10 @@ define test_is()
*/
blkfree("blk5900");
print '6663: blkfree("blk5900")';
fclose(ofd);
print '6664: fclose(ofd)';
print '6664: Ending test_is';
print '6665: Ending test_is';
}
print '168: test_is()';
@@ -6972,7 +7010,7 @@ define test_bigcomb()
{
local a, b, n, i, v1, v2;
print '7900: Starting test_bigcomb()';
print '7900: Starting test_bigcomb';
a = 1234/4321;
print '7901: a = 1234/4321';
b = 3456/6543;
@@ -6995,7 +7033,7 @@ define test_bigcomb()
vrfy(f7900(-7/4,33/4,-2) == g7900(-7/4,33/4,-2),
'7913: f7900(-7/4,33/4,-2) == g7900(-7/4,33/4,-2)');
print '7914: Ending test_bigcomb()';
print '7914: Ending test_bigcomb';
}
print '186: parsed test_bigcomb()';
@@ -7010,7 +7048,7 @@ define test_natnumset()
{
local A, B, C, D, P, P1, L1, L2;
print '8000: Starting test_natnumset()';
print '8000: Starting test_natnumset';
A = set(17, 2, 0, 24, 2);
print '8101: A = set(17, 2, 0, 24, 2);';
@@ -7067,7 +7105,7 @@ define test_natnumset()
vrfy(polyvals2(L2,C,D) == set(12,16,21,27,45,55,77,91),
'8135: polyvals(L2,C,D) == set(12,16,21,27,45,55,77,91)');
print '8136: Ending test_natnumset()';
print '8136: Ending test_natnumset';
}
print '188: parsed test_natnumset()';
@@ -7077,7 +7115,7 @@ print '188: parsed test_natnumset()';
*/
define test_somenew()
{
print '8200: Starting test_somenew()';
print '8200: Starting test_somenew';
vrfy(char(-1) == char(255), '8201: char(-1) == char(255)');
vrfy(char(258) == char(2), '8202: char(258) == char(2)');
@@ -7101,7 +7139,7 @@ define test_somenew()
vrfy(1/(1/0) == 0, '8215: 1/(1/0) == 0');
vrfy(inverse(1/0) == 0, '8216: inverse(1/0) == 0');
print '8217: Ending test_somenew()';
print '8217: Ending test_somenew';
}
print '189: parsed test_somenew()';
@@ -7118,7 +7156,7 @@ print '200: Reserved for top level test use';
define count_errors()
{
if (prob == 0) {
print "9998: passed all tests /\\../\\";
print "9997: passed all tests /\\../\\";
} else {
print "****", prob, "error(s) found \\/++\\/";
}
@@ -7354,6 +7392,94 @@ return test_natnumset();
print;
return test_somenew();
/*
* read various calc libs
*
* We read most of the calc libs shipped with the distribution.
* There are a few lib files that are not read:
*
* beer.cal - prints a bunch of things when loaded
* hello.cal - designed to go into an infinite loop
* lucal.cal - already read by this file
* lucas_chk.cal - already read by this file
* lucas_tbl.cal - duplicatres code already read by another file
* regress.cal - this file
* surd.cal - already read by this file
* testXXXX.cal - already read by this file
* xx_print.cal - prints a bunch of things when loaded
*
* We want to do this 2nd to last; ahead of any final cleanup and behind
* all of real actions of regress.cal.
*/
print;
print '9800: Starting read of selected calc libs';
read -once bernoulli;
print '9801: read -once bernoulli';
read -once bigprime;
print '9802: read -once bigprime';
read -once chrem;
print '9803: read -once chrem';
read -once deg;
print '9804: read -once deg';
read -once ellip;
print '9805: read -once ellip';
read -once mersenne;
print '9806: read -once mersenne';
read -once mfactor;
print '9807: read -once mfactor';
read -once mod;
print '9808: read -once mod';
read -once natnumset;
print '9809: read -once natnumset';
read -once pell;
print '9810: read -once pell';
read -once pi;
print '9811: read -once pi';
read -once pix;
print '9812: read -once pix';
read -once pollard;
print '9813: read -once pollard';
read -once poly;
print '9814: read -once poly';
read -once prompt;
print '9815: read -once prompt';
read -once psqrt;
print '9816: read -once psqrt';
read -once quat;
print '9817: read -once quat';
read -once randbitrun;
print '9818: read -once randbitrun';
read -once randmprime;
print '9819: read -once randmprime';
read -once randombitrun;
print '9820: read -once randombitrun';
read -once randomrun;
print '9821: read -once randomrun';
read -once randrun;
print '9822: read -once randrun';
read -once seedrandom;
print '9823: read -once seedrandom';
read -once solve;
print '9824: read -once solve';
read -once sumsq;
print '9825: read -once sumsq';
read -once unitfrac;
print '9826: read -once unitfrac';
read -once varargs;
print '9827: read -once varargs';
print '9828: Ending read of selected calc libs';
/*
* cleanup and report the results
*/
print;
freeredc();
print '9995: freeredc()';
freestatics();
print '9996: freestatics()';
return count_errors();
freeglobals();
print '9998: freeglobals()';
print '9999: Ending regression tests';

View File

@@ -41,7 +41,3 @@ define solve(low, high, epsilon)
}
}
}
if (config("lib_debug") >= 0) {
print "solve(low, high, epsilon) defined";
}

View File

@@ -37,7 +37,3 @@ define ss(p)
}
print a : "^2 +" , b : "^2 =" , a^2 + b^2;
}
if (config("lib_debug") >= 0) {
print "ss(p) defined";
}

View File

@@ -263,25 +263,6 @@ define surd_rel(a, b)
if (config("lib_debug") >= 0) {
print "obj surd {a, b} defined";
print "surd(a, b) defined";
print "surd_print(a) defined";
print "surd_conj(a) defined";
print "surd_norm(a) defined";
print "surd_value(a, xepsilon) defined";
print "surd_add(a, b) defined";
print "surd_sub(a, b) defined";
print "surd_inc(a) defined";
print "surd_dec(a) defined";
print "surd_neg(a) defined";
print "surd_mul(a, b) defined";
print "surd_square(a) defined";
print "surd_scale(a, b) defined";
print "surd_shift(a, b) defined";
print "surd_div(a, b) defined";
print "surd_inv(a) defined";
print "surd_sgn(a) defined";
print "surd_cmp(a, b) defined";
print "surd_rel(a, b) defined";
print "surd_type defined";
print "set surd_type as needed";
}

View File

@@ -10,7 +10,3 @@
*/
++value;
if (config("lib_debug") >= 0) {
/* nothing to do */
}

View File

@@ -95,7 +95,3 @@ define ckmat()
/* args match the matrix in the object */
return 1;
}
if (config("lib_debug") >= 0) {
/* nothing to do */
}

View File

@@ -491,25 +491,3 @@ define test2600(verbose, tnum)
}
return tnum;
}
if (config("lib_debug") >= 0) {
print "global defaultverbose defined";
print "global err defined";
print "testismult(str,n,verbose) defined";
print "testsqrt(str,n,eps,verbose) defined";
print "testexp(str,n,eps,verbose) defined";
print "testln(str,n,eps,verbose) defined";
print "testpower(str,n,b,eps,verbose) defined";
print "testgcd(str,n,verbose) defined";
print "cpow(x,n,eps) defined";
print "cexp(x,eps) defined";
print "cln(x,eps) defined";
print "mkreal() defined";
print "mkcomplex() defined";
print "mkbigreal() defined";
print "mksmallreal() defined";
print "testappr(str,n,verbose) defined";
print "checkappr(x,y,z,verbose) defined";
print "checkresult(x,y,z,a) defined";
print "test2600(verbose,tnum) defined";
}

View File

@@ -308,23 +308,3 @@ define test2700(verbose, tnum)
}
return tnum;
}
if (config("lib_debug") >= 0) {
print "global defaultverbose defined";
print "global err defined";
print "mknonnegreal() defined";
print "mkposreal() defined";
print "mkreal_2700() defined";
print "mknonzeroreal() defined";
print "mkposfrac() defined";
print "mkfrac() defined";
print "mksquarereal() defined";
print "mknonsquarereal() defined";
print "mkcomplex_2700() defined";
print "testcsqrt(str,n,verbose) defined";
print "checksqrt(x,y,z,v) defined";
print "checkavrem(A,B,X,eps) defined";
print "checkrounding(s,n,t,u,z) defined";
print "iscomsq(x) defined";
print "test2700(verbose,tnum) defined";
}

View File

@@ -17,14 +17,3 @@ define res_mul(a,b) {local obj res v = {(a.r * b.r) % md}; return v;};
define res_neg(a) {local obj res v = {(-a.r) % md}; return v;};
define res_inv(a) {local obj res v = {minv(a.r, md)}; return v;};
define res(x) {local obj res v = {x % md}; return v;};
if (config("lib_debug") >= 0) {
print "obj res defined";
print "global md defined";
print "res_test(a) defined";
print "res_sub(a, b) defined";
print "res_mul(a, b) defined";
print "res_neg(a) defined";
print "res_inv(a) defined";
print "res(x) defined";
}

View File

@@ -122,11 +122,3 @@ define test3300(verbose, tnum)
}
return tnum;
}
if (config("lib_debug") >= 0) {
print "global defaultverbose defined";
print "global err defined";
print "testi(str, n, N, verbose) defined";
print "testr(str, n, N, verbose) defined";
print "test3300(verbose, tnum) defined";
}

View File

@@ -299,15 +299,3 @@ define test3400(verbose, tnum)
}
return tnum;
}
if (config("lib_debug") >= 0) {
print "global defaultverbose defined";
print "global err defined";
print "test3401(str, n, eps, verbose) defined";
print "test3402(str, n, eps, verbose) defined";
print "test3403(str, n, eps, verbose) defined";
print "test3404(str, n, eps, verbose) defined";
print "test3405(str, n, eps, verbose) defined";
print "test3406(str, n, eps, verbose) defined";
print "test3400(verbose, tnum) defined";
}

View File

@@ -272,14 +272,3 @@ define test3500(verbose, tnum, n, N)
}
return tnum;
}
if (config("lib_debug") >= 0) {
print "global defaultverbose defined";
print "global err defined";
print "testfrem(x, y, verbose) defined";
print "testgcdrem(x, y, verbose) defined";
print "testf(str, n, verbose) defined";
print "testg(str, n, verbose) defined";
print "testh(str, n, N, verbose) defined";
print "test3500(verbose, n, N) defined";
}

View File

@@ -452,32 +452,3 @@ define test4000(v, tnum)
}
return tnum;
}
if (config("lib_debug") >= 0) {
print "global defaultverbose";
print "global err";
print "global BASEB";
print "global BASE";
print "global COUNT";
print "global SKIP";
print "global RESIDUE";
print "global MODULUS";
print "global K1";
print "global H1";
print "global K2";
print "global H2";
print "global K3";
print "global H3";
print "plen(N) defined";
print "clen(N) defined";
print "ptimes(str, N, n, count, skip, verbose) defined";
print "ctimes(str, N, n, count, skip, verbose) defined";
print "crtimes(str, a, b, n, count, skip, verbose) defined";
print "ntimes(str, N, n, count, skip, residue, mod, verbose) defined";
print "testnextcand(str, N, n, cnt, skip, res, mod, verbose) defined";
print "testnext1(x, y, count, skip, residue, modulus) defined";;
print "testprevcand(str, N, n, cnt, skip, res, mod, verbose) defined";
print "testprev1(x, y, count, skip, residue, modulus) defined";
print "test4000(verbose, tnum) defined";
}

View File

@@ -472,20 +472,3 @@ define test4100(v, tnum)
}
return tnum;
}
if (config("lib_debug") >= 0) {
print "global defaultverbose";
print "global err";
print "global K1";
print "global K2";
print "global BASEB";
print "global BASE";
print "rlen_4100(N) defined";
print "olen(N) defined";
print "test4101(x, y, m, k, z1, z2) defined";
print "testall(str, n, N, M, verbose) defined";
print "times(str, N, n, verbose) defined";
print "powtimes(str, N1, N2, n, verbose) defined";
print "inittimes(str, N, n, verbose) defined";
print "test4100(verbose, tnum) defined";
}

View File

@@ -223,6 +223,11 @@ define ttest(str, m, n, verbose)
return 1;
}
}
if (iserror(fclose(f))) {
print 'failed';
printf("**** Failure 6 for i = %d\n", i);
return 1;
}
i = rm("junk4600");
if (verbose > 0) {
printf("passed\n");
@@ -299,12 +304,3 @@ define test4600(v, tnum)
}
return tnum;
}
if (config("lib_debug") >= 0) {
print "stest(str [, verbose]) defined";
print "ttest([m, [n [,verbose]]]) defined";
print "sprint(x) defined";
print "findline(f,s) defined";
print "findlineold(f,s) defined";
print "test4600(verbose, tnum) defined";
}

View File

@@ -48,9 +48,3 @@ define test5100(x)
}
global a5100 = a5100, b5100 = b5100;
}
if (config("lib_debug") >= 0) {
print "global a5100";
print "global b5100";
print "test5100(x) defined";
}

View File

@@ -30,11 +30,3 @@ static a5200 = 20;
define f5200(x) = a5200 + x;
define g5200(x) {global a5200 = 30; return a5200 + x;}
define h5200(x) = a5200 + x;
if (config("lib_debug") >= 0) {
print "global a5200";
print "static a5200";
print "f5200(x) defined";
print "g5200(x) defined";
print "h5200(x) defined";
}

View File

@@ -27,8 +27,3 @@ define unitfrac(x)
} while ((num(x) > 1) || (x == di) || (x == 1));
print ' [1/1]',, x;
}
if (config("lib_debug") >= 0) {
print "unitfrac(x) defined";
}

View File

@@ -21,7 +21,7 @@ print "global blkmax defined, assigned value 8";
print;
B = blk();
define isoctet(a) = istype(a, B[0]);
define is_octet(a) = istype(a, B[0]);
define list_print(a) {
local i;
@@ -131,7 +131,7 @@ define strchar(a) {
if (isstr(a))
a = ord(a);
else if (isoctet(a))
else if (is_octet(a))
a = a; /* This converts octet to number */
else if (!isint(a) || a < 0 || a > 255)
@@ -269,15 +269,3 @@ define octet_print(a) {
print "Here is the earlier block with a new octet_print()";
print B1;
print;
if (config("lib_debug") >= 0) {
print "isoctet(a) defined";
print "list_print(a) defined";
print "mat_print (a) defined";
print "octet_print(a) defined";
print "blk_print(a) defined";
print "nblk_print (a) defined";
print "strchar(a) defined";
print "file_print(a) defined";
print "error_print(a) defined";
}

View File

@@ -65,7 +65,7 @@ BOOL inputwait; /* TRUE if in a terminal input wait */
jmp_buf jmpbuf; /* for errors */
int start_done = FALSE; /* TRUE => start up processing finished */
char *program = "calc"; /* our name */
char cmdbuf[MAXCMD+1]; /* command line expression */
char cmdbuf[MAXCMD+1+1+1]; /* command line expression + "\n\0" + guard */
/*
@@ -94,6 +94,7 @@ char *home; /* $HOME or default */
char *pager; /* $PAGER or default */
char *shell; /* $SHELL or default */
int stdin_tty = FALSE; /* TRUE if stdin is a tty */
int interactive = FALSE; /* TRUE if interactive session (no cmd args) */
int post_init = FALSE; /* TRUE setjmp for math_error is readready */
int no_env = FALSE; /* TRUE (-e) => ignore env vars on startup */
@@ -281,6 +282,11 @@ initenv(void)
if (calcrc == NULL) {
calcrc = DEFAULTCALCRC;
}
if (strlen(calcrc) > MAX_CALCRC) {
math_error("The $CALCRC variable is longer than %d chars",
MAX_CALCRC);
/*NOTREACHED*/
}
/* determine the $CALCBINDINGS value */
calcbindings = (no_env ? NULL : getenv(CALCBINDINGS));

View File

@@ -241,8 +241,8 @@ convhex2z(char *hex)
/* slen is even now */
/* eat two hex chars at a time until the HALF is full */
for (; (slen % (BASEB/4)) != 0; slen -= 2) {
*hp = ((*hp<<8) | hex2bin(*sp++, *sp++));
for (; (slen % (BASEB/4)) != 0; slen -= 2, sp += 2) {
*hp = ((*hp<<8) | hex2bin(sp[0], sp[1]));
}
/* move on to the next HALF */

View File

@@ -97,9 +97,15 @@
#include "longlong.h"
#if defined(__linux)
# if !defined(isascii)
extern int isascii(int c);
# endif /* !isascii */
#endif /* __linux */
char *program; /* our name */
MAIN
int
main(int argc, char **argv)
{
int exitcode = 0; /* how we will exit */
@@ -118,7 +124,7 @@ main(int argc, char **argv)
case 2:
/* ignore empty or leading space args */
if (argv[1][0] == '\0' ||
(isascii(argv[1][0]) && isspace(argv[1][0]))) {
(isascii((int)argv[1][0]) && isspace((int)argv[1][0]))) {
long_bits = sizeof(long)*8;
/* process the forced size arg */
} else {
@@ -200,7 +206,7 @@ main(int argc, char **argv)
'/', "* signed 64 bits *", '/');
putchar('\n');
printf("%c%s%c\n", '/',"* how to form 64 bit constants *",'/');
#if defined(__STDC__) && __STDC__ != 0
#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
@@ -316,7 +322,7 @@ main(int argc, char **argv)
'/', "* signed 64 bits *", '/');
putchar('\n');
printf("%c%s%c\n", '/',"* how to form 64 bit constants *",'/');
#if defined(__STDC__) && __STDC__ != 0
#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
@@ -335,7 +341,7 @@ main(int argc, char **argv)
'/', "* signed 64 bits *", '/');
putchar('\n');
printf("%c%s%c\n", '/',"* how to form 64 bit constants *",'/');
#if defined(__STDC__) && __STDC__ != 0
#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
@@ -356,5 +362,6 @@ main(int argc, char **argv)
}
/* all done */
exit(exitcode);
/* exit(exitcode); */
return exitcode;
}

View File

@@ -66,7 +66,7 @@ unsigned long long val = 4294967297ULL;
long long val2 = -4294967297LL;
MAIN
int
main(int argc, char **argv)
{
int longlong_bits; /* bits in a long long, or <=0 => dont use */
@@ -100,5 +100,6 @@ main(int argc, char **argv)
longlong_bits);
}
}
exit(0);
/* exit(0); */
return 0;
}

View File

@@ -640,9 +640,8 @@ o_elemaddr(FUNC *fp, long index)
math_error("Non-existent element for matrix");
/*NOTREACHED*/
}
stack->v_type = V_ADDR;
stack->v_addr = &mp->m_table[index];
return;
vp = &mp->m_table[index];
break;
case V_OBJ:
op = vp->v_obj;
offset = objoffset(op, index);
@@ -650,13 +649,21 @@ o_elemaddr(FUNC *fp, long index)
math_error("Non-existent element for object");
/*NOTREACHED*/
}
stack->v_type = V_ADDR;
stack->v_addr = &op->o_table[offset];
return;
vp = &op->o_table[offset];
break;
case V_LIST:
vp = listfindex(vp->v_list, index);
if (vp == NULL) {
math_error("Index out of bounds for list");
/*NOTREACHED*/
}
break;
default:
math_error("Not indexing matrix or object");
math_error("Not initializing matrix, object or list");
/*NOTREACHED*/
}
stack->v_type = V_ADDR;
stack->v_addr = vp;
}
@@ -746,8 +753,10 @@ o_assign(void)
math_error("No-assign-from source for assign");
/*NOTREACHED*/
}
tmp.v_subtype = V_NOSUBTYPE;
copyvalue(vp, &tmp);
} else if (vp->v_type == V_OCTET) {
tmp.v_subtype = V_NOSUBTYPE;
copyvalue(vp, &tmp);
} else {
tmp = *vp;

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