Compare commits

...

3 Commits

Author SHA1 Message Date
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
41 changed files with 797 additions and 292 deletions

82
BUGS
View File

@@ -1,8 +1,8 @@
If you notice something wrong, strange or broken, try rereading: If you notice something wrong, strange or broken, try rereading:
README.FIRST README.FIRST
README HOWTO.INSTALL
BUGS (in particular the bottom problems or mis-features section) BUGS (this file)
If that does not help, cd to the calc source directory and try: 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 If you made and modifications to calc beyond the simple Makefile
configuration, try backing them out and see if things get better. 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 To be sure that your version of calc is up to date, check out:
distributions may be obtained from the official calc repository:
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 The calc web site is located at:
version that is more advanced than what is in the ftp archive.
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 * the type of compiler you were using
* any compiler warnings or erros that you saw
* cd to the calc source directory, and type: * cd to the calc source directory, and type:
make debug > debug.out 2>&1 (sh, ksh, bash users) 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: Send any comments, compiler warning messages, suggestions and most
importantly, fixes (in the form of a context diff patch) to:
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:
calc-tester@postofc.corp.sgi.com calc-tester@postofc.corp.sgi.com
@@ -89,3 +77,51 @@ Known problems or mis-features:
* There is some places in the source with obscure variable names * 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 not much in the way of comments. We need some major cleanup
and documentation. and documentation.
* On a Dec Alpha, make check for version 2.11.0t1 core dumps:
From vandermj@molbio.sbphrd.com Fri Sep 24 06:15:28 1999
Subject: Re: calc version 2.11.0t1
Date: Fri, 24 Sep 1999 09:15:02 -0400
It dies as follows:
...
1802: a = surd(2,3)
1803: a == surd(2,3)
1804: surd_value(a) == 2+3i
Segmentation fault
dbx shows:
signal Segmentation fault at [objcall:155 +0xc,0x1200507b4] index = oap->actions[action];
(dbx) where
> 0 objcall(action = 14, v1 = 0x1400203d0, v2 = 0x1400203e0, v3 = (nil)) ["obj.c":155, 0x1200507b4]
1 comparevalue(v1 = 0x1400203d0, v2 = 0x1400203e0) ["value.c":2329, 0x12007f250]
2 o_eq() ["opcodes.c":2659, 0x12003728c]
3 calculate(fp = 0x14007fce0) ["opcodes.c":3614, 0x12003942c]
4 o_usercall(fp = 0x14007fce0, index = 39, argcount = 0) ["opcodes.c":2602, 0x120037080]
5 calculate(fp = 0x14003bfa0) ["opcodes.c":3622, 0x120039488]
6 evaluate(nestflag = 14) ["codegen.c":210, 0x120028768]
7 getcommands(toplevel = 536864560) ["codegen.c":158, 0x1200285bc]
8 getcommands(toplevel = 536864560) ["codegen.c":122, 0x1200284dc]
9 main() ["calc.c":279, 0x12001f61c]
Michel van der List reports that he was using the Dec compiler.
However On 25-Sep-99 9:18, Ernest Bowen wrote:
Last night I downloaded 2.11.0t1 and without changing Makefile
or anything else did a make and make check. Absolutely no
reported errors or warnings and the check "passed all tests".
The machine I'm using is a Dec 20 alpha running Digitial
UNIX V4.0B (Rev 564).
Ernest Bowen was using gcc.
We definitely want to hunt down this Dec's cc compiler issue. It
could very well be that gcc is letting something slide where as
Dec's cc compiler is compiling it faithfully into core dumping code.
The fault could very well be the calc code and not the compiler.
Any more information on calc core dumps compiled with Dec's cc compiler
would be most appreciated!

80
CHANGES
View File

@@ -1,16 +1,86 @@
Following is the change from calc version 2.11.0t1 to date: Following is the change from calc version 2.11.0t1 to date:
Fixed BSDI compile problems related to sys_errlist. Removed the makefile symbol MAIN. Now forcing all functions to correctly
be declared main. To satisfy some old broken compilers, a return 0;
Removed the makefile symbol MAIN. Now forcing all funcions to correctly
be reclared main. To passify some old broken compilers, a return 0;
(instead of an exit(0);) is used at the end of main(). (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 A few of files that were added to calc used 4 character indentation
whereas most of calc uses 8 character indentation. These imported whereas most of calc uses 8 character indentation. These imported
sources have been changed to conform better with the calc style. sources have been changed to conform better with the calc style.
Fixed misc compile warnings. 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. Avoiding symbols such as new
or try for example.
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.
Updated README.FIRST 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.
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}.
Fixed misc compile warnings and notices.
Following is the change from calc version 2.10.3t5.38 to 2.11.0t0: Following is the change from calc version 2.10.3t5.38 to 2.11.0t0:

53
HOWTO.INSTALL Normal file
View File

@@ -0,0 +1,53 @@
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.
3) test calc:
make check
==> If you run into problems, follow the instructions in the BUGS file
4) install calc:
make install

314
Makefile
View File

@@ -206,6 +206,39 @@ HAVE_MEMMOVE=
ALIGN32= -DMUST_ALIGN32 ALIGN32= -DMUST_ALIGN32
#ALIGN32= -UMUST_ALIGN32 #ALIGN32= -UMUST_ALIGN32
# 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;
#
# 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 # where to install binary files
# #
BINDIR= /usr/local/bin BINDIR= /usr/local/bin
@@ -281,7 +314,8 @@ CATEXT= 1
# The cat page is not built or installed # The cat page is not built or installed
# #
# If in doubt and you don't want to fool with man pages, set MANDIR # 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= nroff
#NROFF= #NROFF=
@@ -483,7 +517,6 @@ ALLOW_CUSTOM= -DCUSTOM
# ICFLAGS are given to ${CC} for intermediate progs # ICFLAGS are given to ${CC} for intermediate progs
# #
# CCMAIN are flags for ${CC} when files with main() instead of CFLAGS # 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} # LCFLAGS are CC-style flags for ${LINT}
# LDFLAGS are flags given to ${CC} for linking .o files # LDFLAGS are flags given to ${CC} for linking .o files
@@ -493,6 +526,53 @@ ALLOW_CUSTOM= -DCUSTOM
# #
### ###
# #
# Linux set
#
# 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}
#
LCFLAGS=
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
ILDFLAGS=
#
CC= ${PURIFY} gcc
#
###
#
# gcc set (some call it gcc2, some call it gcc)
#
# 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}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} gcc
#CC= ${PURIFY} gcc2
#
###
#
# common cc set # common cc set
# #
#CCWARN= #CCWARN=
@@ -503,38 +583,6 @@ ALLOW_CUSTOM= -DCUSTOM
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS} #CCMAIN= ${ICFLAGS}
#CCSHS= ${CFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} cc
#
###
#
# SGI IRIX5.3 (or earlier) -o32 C Compiler
#
# You must set above:
# RANLIB=:
# LONGLONG_BITS= 0
#
# for better performance, set the following above:
# DEBUG= -O2 -g3
#
# 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
#CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC= -use_readonly_const
#
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC}
#
#CCMAIN= ${ICFLAGS}
#CCSHS= ${CFLAGS}
# #
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
@@ -566,7 +614,6 @@ ALLOW_CUSTOM= -DCUSTOM
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS} #CCMAIN= ${ICFLAGS}
#CCSHS=
# #
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
@@ -592,7 +639,6 @@ ALLOW_CUSTOM= -DCUSTOM
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS} #CCMAIN= ${ICFLAGS}
#CCSHS= ${CFLAGS}
# #
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
@@ -612,7 +658,6 @@ ALLOW_CUSTOM= -DCUSTOM
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS} #CCMAIN= ${ICFLAGS}
#CCSHS= ${CFLAGS}
# #
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
@@ -622,43 +667,22 @@ ALLOW_CUSTOM= -DCUSTOM
# #
### ###
# #
# BSDI's BSD/OS 2.0 (or later) set # Solaris Sun cc compiler 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}
#CCSHS= ${CFLAGS}
#
#LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS=
#
#CC= ${PURIFY} shlicc2
#
###
#
# Solaris 2.x Sun cc compiler
# #
# for better performance, set the following above: # for better performance, set the following above:
# DEBUG= -O # 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= #CCWARN=
#CCOPT= ${DEBUG} ${NO_SHARED} #CCOPT= ${DEBUG} ${NO_SHARED}
#CCMISC=-Xc #CCMISC= -DFORCE_STDC
# #
#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS} #CCMAIN= ${ICFLAGS}
#CCSHS= ${CFLAGS}
# #
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
@@ -668,30 +692,7 @@ ALLOW_CUSTOM= -DCUSTOM
# #
### ###
# #
# Red Hat Linux 6.0 # 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=
#
CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC}
ICFLAGS= ${CCWARN} ${CCMISC}
#
CCMAIN= ${ICFLAGS}
CCSHS= ${CFLAGS}
#
LCFLAGS=
LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
ILDFLAGS=
#
CC= ${PURIFY} gcc
#
###
#
# gcc set (some call it gcc2, some call it gcc)
# #
# for better performance, set the following above: # for better performance, set the following above:
# DEBUG= -O2 # DEBUG= -O2
@@ -704,14 +705,34 @@ CC= ${PURIFY} gcc
#ICFLAGS= ${CCWARN} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC}
# #
#CCMAIN= ${ICFLAGS} #CCMAIN= ${ICFLAGS}
#CCSHS= ${CFLAGS}
# #
#LCFLAGS= #LCFLAGS=
#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED}
#ILDFLAGS= #ILDFLAGS=
# #
#CC= ${PURIFY} gcc #CC= ${PURIFY} gcc
#CC= ${PURIFY} gcc2 #
###
#
# 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 -=-=-=-=-=-=-=-=-# #-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#
@@ -798,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 \ fposval.h have_const.h have_fpos.h have_malloc.h \
have_memmv.h have_newstr.h have_offscl.h have_posscl.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_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 # we build these .c files during the make
# #
@@ -810,7 +831,7 @@ BUILD_C_SRC= calcerr.c
# #
UTIL_C_SRC= align32.c endian.c longbits.c have_newstr.c have_uid_t.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 \ 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 # these awk and sed tools are used in the process of building BUILD_H_SRC
# and BUILD_C_SRC # and BUILD_C_SRC
@@ -824,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 \ 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_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 # 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 # these utility progs may be used in the process of building BUILD_H_SRC
# #
UTIL_PROGS= align32 fposval have_uid_t longlong have_const \ 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. # These files are required by the regress.cal regression test.
# #
@@ -909,7 +931,7 @@ C_SRC= ${LIBSRC} ${CALCSRC} ${UTIL_C_SRC}
# These files are found (but not built) in the distribution # These files are found (but not built) in the distribution
# #
DISTLIST= ${C_SRC} ${H_SRC} ${MAKE_FILE} BUGS CHANGES LIBRARY README \ 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.FIRST HOWTO.INSTALL ${UTIL_MISC_SRC}
# complete list of .o files # complete list of .o files
# #
@@ -962,17 +984,11 @@ calc.o: calc.c ${MAKE_FILE}
${CC} ${CCMAIN} ${CCOPT} ${ALLOW_CUSTOM} -c calc.c ${CC} ${CCMAIN} ${CCOPT} ${ALLOW_CUSTOM} -c calc.c
custom.o: custom.c ${MAKE_FILE} 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} hist.o: hist.c ${MAKE_FILE}
${CC} ${CFLAGS} ${TERMCONTROL} -c hist.c ${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} func.o: func.c ${MAKE_FILE}
${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c func.c ${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c func.c
@@ -1804,6 +1820,98 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
true; \ true; \
fi 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} calcerr.h: calcerr.tbl calcerr_h.sed calcerr_h.awk ${MAKE_FILE}
-${Q}rm -f calerr.h -${Q}rm -f calerr.h
${Q}echo 'forming calcerr.h' ${Q}echo 'forming calcerr.h'
@@ -2190,6 +2298,7 @@ env:
@echo "HAVE_UID_T=${HAVE_UID_T}"; echo "" @echo "HAVE_UID_T=${HAVE_UID_T}"; echo ""
@echo "HAVE_NEWSTR=${HAVE_NEWSTR}"; echo "" @echo "HAVE_NEWSTR=${HAVE_NEWSTR}"; echo ""
@echo "ALIGN32=${ALIGN32}"; echo "" @echo "ALIGN32=${ALIGN32}"; echo ""
@echo "ERRNO_DECL=${ERRNO_DECL}"; echo ""
@echo "BINDIR=${BINDIR}"; echo "" @echo "BINDIR=${BINDIR}"; echo ""
@echo "TOPDIR=${TOPDIR}"; echo "" @echo "TOPDIR=${TOPDIR}"; echo ""
@echo "LIBDIR=${LIBDIR}"; echo "" @echo "LIBDIR=${LIBDIR}"; echo ""
@@ -2224,7 +2333,6 @@ env:
@echo "CFLAGS=${CFLAGS}"; echo "" @echo "CFLAGS=${CFLAGS}"; echo ""
@echo "ICFLAGS=${ICFLAGS}"; echo "" @echo "ICFLAGS=${ICFLAGS}"; echo ""
@echo "CCMAIN=${CCMAIN}"; echo "" @echo "CCMAIN=${CCMAIN}"; echo ""
@echo "CCSHS=${CCSHS}"; echo ""
@echo "LCFLAGS=${LCFLAGS}"; echo "" @echo "LCFLAGS=${LCFLAGS}"; echo ""
@echo "LDFLAGS=${LDFLAGS}"; echo "" @echo "LDFLAGS=${LDFLAGS}"; echo ""
@echo "ILDFLAGS=${ILDFLAGS}"; echo "" @echo "ILDFLAGS=${ILDFLAGS}"; echo ""

5
README
View File

@@ -4,6 +4,11 @@
# #
# Arbitrary precision calculator. # Arbitrary precision calculator.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NOTE: This is an old historic README. We recommend that you
read README.FIRST and HOWTO.INSTALL for more info.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I am allowing this calculator to be freely distributed for your enjoyment. I am allowing this calculator to be freely distributed for your enjoyment.
Like all multi-precision programs, you should not depend absolutely on Like all multi-precision programs, you should not depend absolutely on
its results, since bugs in such programs can be insidious and only rarely its results, since bugs in such programs can be insidious and only rarely

View File

@@ -1,12 +1,17 @@
Dear alpha tester, Dear calc user,
Thanks for taking the time to try out this alpha version of calc! We are See the HOWTO.INSTALL file for information on how to build and install calc.
interested in any/all feedback that you may have on this version. In
particular we would like to hear about:
To be sure that your version of calc is up to date, check out:
http://reality.sgi.com/chongo/calc/calc-download.html
We are interested in any/all feedback on recent versions of calc.
In particular we would like to hear about:
* compiler warnings
* compile problems * compile problems
* regression test problems (try: make check) * regression test problems (try: make check)
* compiler warnings
* special compile flags/options that you needed * special compile flags/options that you needed
* Makefile problems * Makefile problems
* help file problems * help file problems
@@ -15,38 +20,35 @@ particular we would like to hear about:
We would like to offer a clean compile across a wide verity of platforms, 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! so if you can test on several, so much the better!
Calc distributions may be obtained from: If you run into problems, see the BUGS file.
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: See the file:
* improve the coverage in the 'SEE ALSO' help file lists help/todo
* where reasonable, be sure that regress.cal tests builtin functions or run:
* add the Blum-Blum-Shub random() generator code calc 'help todo'
* add code to allow of the reading, writing and processing of binary data for a wish/todo list. Code contributions are welcome.
* add shs, shs-1 and md5 hashing functions. Use align32.h. =-=
* add mod h*2^n+/-1 function for integers To join the calc-tester mailing list. Send a request to:
* be sure that CHANGES is up to date, calc-tester-request@postofc.corp.sgi.com
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 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

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

48
block.c
View File

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

5
calc.c
View File

@@ -212,7 +212,7 @@ main(int argc, char **argv)
/* /*
* if allowed or needed, print version and setup bindings * if allowed or needed, print version and setup bindings
*/ */
if (*str == '\0') { if (str >= cmdbuf+MAXCMD || *str == '\0') {
/* /*
* check for pipe mode and/or non-tty stdin * check for pipe mode and/or non-tty stdin
*/ */
@@ -349,7 +349,8 @@ math_error(char *fmt, ...)
if (post_init) { if (post_init) {
longjmp(jmpbuf, 1); longjmp(jmpbuf, 1);
} else { } 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 * don't call libcalc_call_me_last() -- we might loop
* and besides ... this is an unusual internal error case * and besides ... this is an unusual internal error case

2
calc.h
View File

@@ -26,7 +26,7 @@
#define DEFAULTCALCHELP "help" /* help file that -h prints */ #define DEFAULTCALCHELP "help" /* help file that -h prints */
#define DEFAULTSHELL "sh" /* default shell to use */ #define DEFAULTSHELL "sh" /* default shell to use */
#define CALCEXT ".cal" /* extension for files read in */ #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 HOMECHAR '~' /* char which indicates home directory */
#define DOTCHAR '.' /* char which indicates current directory */ #define DOTCHAR '.' /* char which indicates current directory */
#define PATHCHAR '/' /* char which separates path components */ #define PATHCHAR '/' /* char which separates path components */

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) { if (error > 0 && havebuf0) {
print buf0; print buf0;
} }
exit (error > 0); if (error > 0) {
exit(1);
} else {
exit(0);
}
} }

View File

@@ -81,8 +81,13 @@ static long getinitlist(void);
void void
getcommands(BOOL toplevel) 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) if (!toplevel)
enterfilescope(); enterfilescope();
for (;;) { for (;;) {

14
const.c
View File

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

View File

@@ -99,6 +99,7 @@ static struct infoname sys_info[] = {
{"LONGLONG_BITS", "length of a long long, or 0", NULL, (FULL)LONGLONG_BITS}, {"LONGLONG_BITS", "length of a long long, or 0", NULL, (FULL)LONGLONG_BITS},
{"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS}, {"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS},
{"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT}, {"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT},
{"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL, (FULL)MAX_CALCRC},
{"MAXCMD", "max length of command invocation", NULL, (FULL)MAXCMD}, {"MAXCMD", "max length of command invocation", NULL, (FULL)MAXCMD},
{"MAXDIM", "max number of dimensions in matrices", NULL, (FULL)MAXDIM}, {"MAXDIM", "max number of dimensions in matrices", NULL, (FULL)MAXDIM},
{"MAXERROR", "max length of error message string", NULL, (FULL)MAXERROR}, {"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_MAP_PRIME", "smallest odd prime not in pr_map", NULL, (FULL)NXT_MAP_PRIME},
{"NXT_PFACT_VAL", "next prime for higher pfact values", NULL, (FULL)NXT_PFACT_VAL}, {"NXT_PFACT_VAL", "next prime for higher pfact values", NULL, (FULL)NXT_PFACT_VAL},
{"OFF_T_BITS", "file offset size in bits", NULL, (FULL)OFF_T_BITS}, {"OFF_T_BITS", "file offset size in bits", NULL, (FULL)OFF_T_BITS},
{"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}, {"PIX_32B", "max pix() value", NULL, (FULL)PIX_32B},
{"POW_ALG2", "default size for using REDC for powers", NULL, (FULL)POW_ALG2}, {"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}, {"REDC_ALG2", "default size using alternative REDC alg", NULL, (FULL)REDC_ALG2},
@@ -238,8 +237,9 @@ c_sysinfo(char *name, int count, VALUE **vals)
} else if (vals[0]->v_type == V_STR) { } else if (vals[0]->v_type == V_STR) {
/* convert vals[0] to upper case string */ /* convert vals[0] to upper case string */
buf = (char *)malloc(strlen((char *)vals[0]->v_str)+1); buf = (char *)malloc(strlen((char *)vals[0]->v_str->s_str)+1);
for (q = (char *)vals[0]->v_str, r = buf; *q; ++q, ++r) { for (q = (char *)vals[0]->v_str->s_str, r = buf; *q; ++q, ++r)
{
if (isascii(*q) && islower(*q)) { if (isascii(*q) && islower(*q)) {
*r = *q - 'a' + 'A'; *r = *q - 'a' + 'A';
} else { } else {
@@ -262,7 +262,7 @@ c_sysinfo(char *name, int count, VALUE **vals)
/* return value as string */ /* return value as string */
result.v_type = V_STR; result.v_type = V_STR;
result.v_subtype = V_NOSUBTYPE; result.v_subtype = V_NOSUBTYPE;
result.v_str = (STRING *)p->str; result.v_str = makestring(p->str);
} }
/* return found infotype as value */ /* return found infotype as value */

8
file.c
View File

@@ -1141,6 +1141,7 @@ rewindall(void)
* *
* NOTE: Does not support negative file positions. * NOTE: Does not support negative file positions.
*/ */
/*ARGSUSED*/
static ZVALUE static ZVALUE
filepos2z(FILEPOS pos) filepos2z(FILEPOS pos)
{ {
@@ -1493,6 +1494,7 @@ setloc(FILEID id, ZVALUE zpos)
* returns: * returns:
* file size as a ZVALUE * file size as a ZVALUE
*/ */
/*ARGSUSED*/
static ZVALUE static ZVALUE
off_t2z(off_t siz) off_t2z(off_t siz)
{ {
@@ -1555,6 +1557,7 @@ dev2z(dev_t dev)
* returns: * returns:
* file size as a ZVALUE * file size as a ZVALUE
*/ */
/*ARGSUSED*/
static ZVALUE static ZVALUE
inode2z(ino_t inode) 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') if (c == EOF || c == '\0')
break; break;
chnum++; chnum++;
if(scannum && (memchr(scanptr,c,scannum)==NULL) ^ comp) if(scannum &&
((memchr(scanptr,c,scannum)==NULL) ^ comp))
break; break;
if (!skip) { if (!skip) {
*b++ = c; *b++ = c;
@@ -1918,7 +1922,7 @@ getscanwhite(FILE *fp, BOOL skip, unsigned int width, int scannum, char **strptr
if (c == EOF || c == '\0') if (c == EOF || c == '\0')
break; break;
chnum++; chnum++;
if(scannum && !isspace(c) ^ comp) if(scannum && (!isspace(c) ^ comp))
break; break;
if (!skip) { if (!skip) {
*b++ = c; *b++ = c;

4
func.c
View File

@@ -10,15 +10,15 @@
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <sys/types.h> #include <sys/types.h>
#include <errno.h>
#if defined(FUNCLIST) #if defined(FUNCLIST)
#include <stdio.h>
#define CONST /* disabled for FUNCLIST in case NATIVE_CC doesn't have it */ #define CONST /* disabled for FUNCLIST in case NATIVE_CC doesn't have it */
#else /* FUNCLIST */ #else /* FUNCLIST */
#include "calc_errno.h"
#include "have_unistd.h" #include "have_unistd.h"
#if defined(HAVE_UNISTD_H) #if defined(HAVE_UNISTD_H)
#include <unistd.h> #include <unistd.h>

10
hash.c
View File

@@ -147,13 +147,13 @@ hash_free(HASH *state)
HASH * HASH *
hash_copy(HASH *state) hash_copy(HASH *state)
{ {
HASH *new; /* copy of state */ HASH *hnew; /* copy of state */
/* /*
* malloc new state * malloc new state
*/ */
new = (HASH *)malloc(sizeof(HASH)); hnew = (HASH *)malloc(sizeof(HASH));
if (new == NULL) { if (hnew == NULL) {
math_error("hash_init: cannot malloc HASH"); math_error("hash_init: cannot malloc HASH");
/*NOTREACHED*/ /*NOTREACHED*/
} }
@@ -161,8 +161,8 @@ hash_copy(HASH *state)
/* /*
* duplicate state * duplicate state
*/ */
memcpy((void *)new, (void *)state, sizeof(HASH)); memcpy((void *)hnew, (void *)state, sizeof(HASH));
return new; return hnew;
} }

View File

@@ -54,7 +54,7 @@ char buf[BUFSIZ];
void void
try(char *fmt, ...) try_this(char *fmt, ...)
{ {
va_list ap; va_list ap;
@@ -79,7 +79,7 @@ main(void)
/* /*
* test variable args and vsprintf/sprintf * test variable args and vsprintf/sprintf
*/ */
try("@%d:%s:%d@", 1, "hi", 2); try_this("@%d:%s:%d@", 1, "hi", 2);
if (strcmp(buf, "@1:hi:2@") != 0) { if (strcmp(buf, "@1:hi:2@") != 0) {
#if !defined(DONT_HAVE_VSPRINTF) #if !defined(DONT_HAVE_VSPRINTF)
/* <stdarg.h> with vsprintf() didn't work */ /* <stdarg.h> with vsprintf() didn't work */
@@ -88,7 +88,7 @@ main(void)
#endif #endif
exit(1); exit(1);
} }
try("%s %d%s%d%d %s", try_this("%s %d%s%d%d %s",
"Landon Noll 1st proved that", 2, "^", 23209, -1, "was prime"); "Landon Noll 1st proved that", 2, "^", 23209, -1, "was prime");
if (strcmp(buf, if (strcmp(buf,
"Landon Noll 1st proved that 2^23209-1 was prime") != 0) { "Landon Noll 1st proved that 2^23209-1 was prime") != 0) {

View File

@@ -52,7 +52,7 @@ char buf[BUFSIZ];
#include <varargs.h> #include <varargs.h>
void void
try(char *fmt, ...) try_this(char *fmt, ...)
{ {
va_list ap; va_list ap;
@@ -68,7 +68,7 @@ try(char *fmt, ...)
#else #else
void void
try(char *a, int b, char *c, int d) try_this(char *a, int b, char *c, int d)
{ {
return; return;
} }
@@ -87,7 +87,7 @@ main(void)
/* /*
* test variable args and vsprintf/sprintf * test variable args and vsprintf/sprintf
*/ */
try("@%d:%s:%d@", 1, "hi", 2); try_this("@%d:%s:%d@", 1, "hi", 2);
if (strcmp(buf, "@1:hi:2@") != 0) { if (strcmp(buf, "@1:hi:2@") != 0) {
#if !defined(DONT_HAVE_VSPRINTF) #if !defined(DONT_HAVE_VSPRINTF)
/* <varargs.h> with vsprintf() didn't work */ /* <varargs.h> with vsprintf() didn't work */
@@ -96,7 +96,7 @@ main(void)
#endif #endif
exit(1); exit(1);
} }
try("%s %d%s%d%d %s", try_this("%s %d%s%d%d %s",
"Landon Noll 1st proved that", 2, "^", 23209, -1, "was prime"); "Landon Noll 1st proved that", 2, "^", 23209, -1, "was prime");
if (strcmp(buf, if (strcmp(buf,
"Landon Noll 1st proved that 2^23209-1 was prime") != 0) { "Landon Noll 1st proved that 2^23209-1 was prime") != 0) {

View File

@@ -235,3 +235,9 @@ Needed enhancements
One should make available a the fundimental math operations One should make available a the fundimental math operations
on ZVALUE, NUMBER and perhaps COMPLEX (without all of the on ZVALUE, NUMBER and perhaps COMPLEX (without all of the
other stuff) in a separate library. 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

1
hist.h
View File

@@ -30,7 +30,6 @@
#define DOTCHAR '.' /* char which indicates current directory */ #define DOTCHAR '.' /* char which indicates current directory */
#define PATHCHAR '/' /* char which separates path components */ #define PATHCHAR '/' /* char which separates path components */
#define LISTCHAR ':' /* char which separates paths in a list */ #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; int i;
char *cp; char *cp;
char path[PATHSIZE+1]; /* name being searched for */ char *path; /* name being searched for */
struct stat statbuf; /* stat of the path */ 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. * Don't try the extension if the filename already contains it.
*/ */
if (extension) { if (extension != NULL && namelen >= extlen &&
unsigned long namelen = strlen(name); strcmp(&name[namelen-extlen], extension) == 0) {
unsigned long extlen = strlen(extension); extension = NULL;
if (namelen >= extlen &&
strcmp(&name[namelen-extlen], extension) == 0)
extension = NULL;
} }
/* /*
* If the name is absolute, or if there is no path list, then * If the name is absolute, or if there is no path list, then
* make one which just searches for the name straight. 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; *cp++ = PATHCHAR;
strcpy(cp, name); strcpy(cp, name);
i = openfile(path); i = openfile(path);
if ((i < 0) && (extension != NULL && extension[0] != '\0')) { if ((i < 0) &&
(extension != NULL && extension[0] != '\0')) {
strcat(path, extension); strcat(path, extension);
i = openfile(path); i = openfile(path);
} }
} while ((i < 0) && *pathlist); } while ((i < 0) && *pathlist);
/* examine what our search produced */ /* examine what our search produced */
if (i < 0) if (i < 0) {
free(path);
return i; return i;
}
if (cip->i_fp == NULL) { if (cip->i_fp == NULL) {
/* cannot find a file to open */ /* cannot find a file to open */
free(path);
return -3; return -3;
} }
if (fstat(fileno(cip->i_fp), &statbuf) < 0) { if (fstat(fileno(cip->i_fp), &statbuf) < 0) {
/* unable to fstat the open file */ /* unable to fstat the open file */
free(path);
return -4; return -4;
} }
@@ -149,6 +185,7 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once)
if (rd_once == TRUE && isinoderead(&statbuf) >= 0) { if (rd_once == TRUE && isinoderead(&statbuf) >= 0) {
/* file is in readset and reopen is false */ /* file is in readset and reopen is false */
closeinput(); closeinput();
free(path);
return 1; return 1;
} }
@@ -156,10 +193,12 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once)
if (addreadset(name, path, &statbuf) < 0) { if (addreadset(name, path, &statbuf) < 0) {
/* cannot add to readset */ /* cannot add to readset */
closeinput(); closeinput();
free(path);
return -1; return -1;
} }
/* file was added to/updated in readset */ /* file was added to/updated in readset */
free(path);
return 0; return 0;
} }
@@ -189,7 +228,7 @@ homeexpand(char *name)
char *home2; /* fullpath of the home directory */ char *home2; /* fullpath of the home directory */
char *fullpath; /* the malloced expanded path */ char *fullpath; /* the malloced expanded path */
char *after; /* after the ~user or ~ */ char *after; /* after the ~user or ~ */
char username[PATHSIZE+1]; /* extratced username */ char *username; /* extratced username */
/* firewall */ /* firewall */
if (name[0] != HOMECHAR) if (name[0] != HOMECHAR)
@@ -217,11 +256,15 @@ homeexpand(char *name)
} }
/* just malloc the home directory and return it */ /* just malloc the home directory and return it */
fullpath = (char *)malloc(strlen(ent->pw_dir)+1); fullpath = (char *)malloc(strlen(ent->pw_dir)+1);
if (fullpath == NULL) {
return NULL;
}
strcpy(fullpath, ent->pw_dir); strcpy(fullpath, ent->pw_dir);
return fullpath; return fullpath;
} }
if (after-name > PATHSIZE+1) { username = (char *) malloc(after-name + 1 + 1);
/* username is too big */ if (username == NULL) {
/* failed to malloc username */
return NULL; return NULL;
} }
strncpy(username, name+1, after-name-1); strncpy(username, name+1, after-name-1);
@@ -229,6 +272,7 @@ homeexpand(char *name)
/* get that user's home directory */ /* get that user's home directory */
ent = (struct passwd *)getpwnam(username); ent = (struct passwd *)getpwnam(username);
free(username);
if (ent == NULL) { if (ent == NULL) {
/* unknown user */ /* unknown user */
return NULL; return NULL;
@@ -241,6 +285,9 @@ homeexpand(char *name)
* build the fullpath given the home directory * build the fullpath given the home directory
*/ */
fullpath = (char *)malloc(strlen(home2)+strlen(after)+1); fullpath = (char *)malloc(strlen(home2)+strlen(after)+1);
if (fullpath == NULL) {
return NULL;
}
sprintf(fullpath, "%s%s", home2, after); sprintf(fullpath, "%s%s", home2, after);
return fullpath; return fullpath;
} }
@@ -333,6 +380,9 @@ openfile(char *name)
cip->i_fp = fp; cip->i_fp = fp;
cip->i_line = 1; cip->i_line = 1;
cip->i_name = (char *)malloc(strlen(name) + 1); cip->i_name = (char *)malloc(strlen(name) + 1);
if (cip->i_name == NULL) {
return -1;
}
strcpy(cip->i_name, name); strcpy(cip->i_name, name);
return 0; return 0;
} }
@@ -658,7 +708,7 @@ reread(void)
void void
runrcfiles(void) runrcfiles(void)
{ {
char path[PATHSIZE+1]; /* name being searched for */ char path[MAX_CALCRC+1+1]; /* name being searched for */
char *cp; char *cp;
char *newcp; char *newcp;
char *p; char *p;

View File

@@ -702,6 +702,8 @@ define test_functions()
{ {
local a, b; local a, b;
local pi; local pi;
local h, n, r, m, v;
local n2, m2, v2;
print '700: Beginning test_functions'; 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(pi(1e-20),0) == 69, '1101: popcnt(pi(1e-20),0) == 69');
vrfy(popcnt(17^777) == 1593, '1102: popcnt(17^777) == 1593'); 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()'; print '017: parsed test_functions()';

View File

@@ -65,7 +65,7 @@ BOOL inputwait; /* TRUE if in a terminal input wait */
jmp_buf jmpbuf; /* for errors */ jmp_buf jmpbuf; /* for errors */
int start_done = FALSE; /* TRUE => start up processing finished */ int start_done = FALSE; /* TRUE => start up processing finished */
char *program = "calc"; /* our name */ char *program = "calc"; /* our name */
char cmdbuf[MAXCMD+1]; /* command line expression */ char cmdbuf[MAXCMD+1+1]; /* command line expression */
/* /*
@@ -281,6 +281,11 @@ initenv(void)
if (calcrc == NULL) { if (calcrc == NULL) {
calcrc = DEFAULTCALCRC; calcrc = DEFAULTCALCRC;
} }
if (strlen(calcrc) > MAX_CALCRC) {
math_error("The $CALCRC variable is longer than %d chars",
MAX_CALCRC);
/*NOTREACHED*/
}
/* determine the $CALCBINDINGS value */ /* determine the $CALCBINDINGS value */
calcbindings = (no_env ? NULL : getenv(CALCBINDINGS)); calcbindings = (no_env ? NULL : getenv(CALCBINDINGS));

View File

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

View File

@@ -206,7 +206,7 @@ main(int argc, char **argv)
'/', "* signed 64 bits *", '/'); '/', "* signed 64 bits *", '/');
putchar('\n'); putchar('\n');
printf("%c%s%c\n", '/',"* how to form 64 bit constants *",'/'); 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 U(x) x ## ULL\n");
printf("#define L(x) x ## LL\n"); printf("#define L(x) x ## LL\n");
#else #else
@@ -322,7 +322,7 @@ main(int argc, char **argv)
'/', "* signed 64 bits *", '/'); '/', "* signed 64 bits *", '/');
putchar('\n'); putchar('\n');
printf("%c%s%c\n", '/',"* how to form 64 bit constants *",'/'); 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 U(x) x ## UL\n");
printf("#define L(x) x ## L\n"); printf("#define L(x) x ## L\n");
#else #else
@@ -341,7 +341,7 @@ main(int argc, char **argv)
'/', "* signed 64 bits *", '/'); '/', "* signed 64 bits *", '/');
putchar('\n'); putchar('\n');
printf("%c%s%c\n", '/',"* how to form 64 bit constants *",'/'); 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 U(x) x ## ULL\n");
printf("#define L(x) x ## LL\n"); printf("#define L(x) x ## LL\n");
#else #else

View File

@@ -1284,7 +1284,7 @@ qcfsim(NUMBER *q, long rnd)
zmodinv(q->num, q->den, &den1); zmodinv(q->num, q->den, &den1);
if (s >= 0) { if (s >= 0) {
zsub(q->den, den1, &den2); zsub(q->den, den1, &den2);
if (s > 0 || ((zrel(den1, den2) < 0) ^ !(rnd & 16))) { if (s > 0 || ((zrel(den1, den2) < 0) ^ (!(rnd & 16)))) {
zfree(den1); zfree(den1);
res->den = den2; res->den = den2;
zmul(den2, q->num, &tmp1); zmul(den2, q->num, &tmp1);

14
qmath.c
View File

@@ -21,8 +21,6 @@ NUMBER _qnegone_ = { { _oneval_, 1, 1 }, { _oneval_, 1, 0 }, 1, NULL };
NUMBER _qonehalf_ = { { _oneval_, 1, 0 }, { _twoval_, 1, 0 }, 1, NULL }; NUMBER _qonehalf_ = { { _oneval_, 1, 0 }, { _twoval_, 1, 0 }, 1, NULL };
NUMBER _qonesqbase_ = { { _oneval_, 1, 0 }, { _sqbaseval_, 2, 0 }, 1, NULL }; NUMBER _qonesqbase_ = { { _oneval_, 1, 0 }, { _sqbaseval_, 2, 0 }, 1, NULL };
#define INITCONSTCOUNT 8
NUMBER * initnumbs[INITCONSTCOUNT] = {&_qzero_, &_qone_, &_qtwo_, &_qthree_, NUMBER * initnumbs[INITCONSTCOUNT] = {&_qzero_, &_qone_, &_qtwo_, &_qthree_,
&_qfour_, &_qten_, &_qnegone_, &_qonehalf_}; &_qfour_, &_qten_, &_qnegone_, &_qonehalf_};
@@ -1365,8 +1363,8 @@ qcmpi(NUMBER *q, long n)
#define NNALLOC 1000 #define NNALLOC 1000
static NUMBER *freeNum; static NUMBER *freeNum = NULL;
static NUMBER **firstNums; static NUMBER **firstNums = NULL;
static long blockcount = 0; static long blockcount = 0;
@@ -1389,8 +1387,12 @@ qalloc(void)
temp->links = 0; temp->links = 0;
} }
blockcount++; blockcount++;
newfn = (NUMBER **) if (firstNums == NULL) {
realloc(firstNums, blockcount * sizeof(NUMBER *)); newfn = (NUMBER **) malloc(blockcount * sizeof(NUMBER *));
} else {
newfn = (NUMBER **)
realloc(firstNums, blockcount * sizeof(NUMBER *));
}
if (newfn == NULL) { if (newfn == NULL) {
math_error("Cannot allocate new number block"); math_error("Cannot allocate new number block");
/*NOTREACHED*/ /*NOTREACHED*/

View File

@@ -13,6 +13,8 @@
#include "zmath.h" #include "zmath.h"
#define INITCONSTCOUNT 8 /* number of initnumbs[] pre-defined constants */
/* /*
* Rational arithmetic definitions. * Rational arithmetic definitions.

2
shs.c
View File

@@ -598,7 +598,7 @@ shs_final_state(HASH *state)
/* /*
* load ZVALUE * load ZVALUE
*/ */
#if BASEB == 16 #if BASEB == 16 && CALC_BYTE_ORDER == LITTLE_ENDIAN
for (i=0; i < ret.len; i+=2) { for (i=0; i < ret.len; i+=2) {
ret.v[ret.len-i-1] = ((HALF*)dig->digest)[i+1]; ret.v[ret.len-i-1] = ((HALF*)dig->digest)[i+1];
ret.v[ret.len-i-2] = ((HALF*)dig->digest)[i]; ret.v[ret.len-i-2] = ((HALF*)dig->digest)[i];

2
shs1.c
View File

@@ -574,7 +574,7 @@ shs1_final_state(HASH *state)
/* /*
* load ZVALUE * load ZVALUE
*/ */
#if BASEB == 16 #if BASEB == 16 && CALC_BYTE_ORDER == LITTLE_ENDIAN
for (i=0; i < ret.len; i+=2) { for (i=0; i < ret.len; i+=2) {
ret.v[ret.len-i-1] = ((HALF*)dig->digest)[i+1]; ret.v[ret.len-i-1] = ((HALF*)dig->digest)[i+1];
ret.v[ret.len-i-2] = ((HALF*)dig->digest)[i]; ret.v[ret.len-i-2] = ((HALF*)dig->digest)[i];

View File

@@ -960,8 +960,8 @@ stringrsearch(STRING *s1, STRING *s2, long start, long end, ZVALUE *index)
#define STRALLOC 100 #define STRALLOC 100
static STRING *freeStr; static STRING *freeStr = NULL;
static STRING **firstStrs; static STRING **firstStrs = NULL;
static long blockcount = 0; static long blockcount = 0;
@@ -984,8 +984,12 @@ stralloc(void)
temp->s_links = 0; temp->s_links = 0;
} }
blockcount++; blockcount++;
newfn = (STRING **) if (firstStrs == NULL) {
realloc(firstStrs, blockcount * sizeof(STRING *)); newfn = (STRING **) malloc( blockcount * sizeof(STRING *));
} else {
newfn = (STRING **)
realloc(firstStrs, blockcount * sizeof(STRING *));
}
if (newfn == NULL) { if (newfn == NULL) {
math_error("Cannot allocate new string block"); math_error("Cannot allocate new string block");
/*NOTREACHED*/ /*NOTREACHED*/

View File

@@ -12,7 +12,7 @@
#define MAJOR_VER 2 /* major version */ #define MAJOR_VER 2 /* major version */
#define MINOR_VER 11 /* minor version */ #define MINOR_VER 11 /* minor version */
#define MAJOR_PATCH 0 /* patch level or 0 if no patch */ #define MAJOR_PATCH 0 /* patch level or 0 if no patch */
#define MINOR_PATCH "1" /* test number or empty string if no patch */ #define MINOR_PATCH "4" /* test number or empty string if no patch */
/* /*
* calc version constants * calc version constants
@@ -35,7 +35,7 @@ static char *stored_version = NULL; /* version formed if != NULL */
* This function returns a malloced version string. This version * This function returns a malloced version string. This version
* string does not contain the title, just: * string does not contain the title, just:
* *
* x.y.ztsomething * x.y.ztw
* x.y.z * x.y.z
* x.y * x.y
*/ */
@@ -56,17 +56,17 @@ version(void)
*/ */
if (sizeof(MINOR_PATCH) > 1) { if (sizeof(MINOR_PATCH) > 1) {
sprintf(verbuf, sprintf(verbuf,
"%d.%d.%d%s", calc_major_ver, calc_minor_ver, "%d.%d.%dt%s", calc_major_ver, calc_minor_ver,
calc_major_patch, calc_minor_patch); calc_major_patch, calc_minor_patch);
} else if (MAJOR_PATCH > 0) { } else if (MAJOR_PATCH > 0) {
sprintf(verbuf, sprintf(verbuf,
"%d.%d.%s", calc_major_ver, calc_minor_ver, calc_minor_patch); "%d.%d.%d", calc_major_ver, calc_minor_ver, calc_major_patch);
} else { } else {
sprintf(verbuf, "%d.%d", calc_major_ver, calc_minor_ver); sprintf(verbuf, "%d.%d", calc_major_ver, calc_minor_ver);
} }
/* /*
* same the versions string into a newly malloced buffer * save the versions string into a newly malloced buffer
*/ */
stored_version = (char *)malloc(strlen(verbuf)+1); stored_version = (char *)malloc(strlen(verbuf)+1);
if (stored_version == NULL) { if (stored_version == NULL) {

42
zfunc.c
View File

@@ -1522,7 +1522,7 @@ zsqrt(ZVALUE z, ZVALUE *dest, long rnd)
u = (HALF)(s ? BASE1 : 0); u = (HALF)(s ? BASE1 : 0);
if (k < BASEB) { if (k < BASEB) {
A[m1 - 1] = (HALF)(e >> (BASEB - 1)); A[m1 - 1] = (HALF)(e >> (BASEB - 1));
A[m1 - 2] = (HALF)(e << 1 | (s > 0)); A[m1 - 2] = ((HALF)(e << 1) | (HALF)(s > 0));
A[m1 - 3] = (HALF)(f >> BASEB); A[m1 - 3] = (HALF)(f >> BASEB);
A[m1 - 4] = (HALF)f; A[m1 - 4] = (HALF)f;
m = m1 - 2; m = m1 - 2;
@@ -1531,7 +1531,7 @@ zsqrt(ZVALUE z, ZVALUE *dest, long rnd)
else { else {
A[m1 - 1] = 1; A[m1 - 1] = 1;
A[m1 - 2] = (HALF)(e >> (BASEB - 1)); A[m1 - 2] = (HALF)(e >> (BASEB - 1));
A[m1 - 3] = (HALF)(e << 1 | (s > 0)); A[m1 - 3] = ((HALF)(e << 1) | (HALF)(s > 0));
A[m1 - 4] = u; A[m1 - 4] = u;
A[m1 - 5] = (HALF)(f >> BASEB); A[m1 - 5] = (HALF)(f >> BASEB);
A[m1 - 6] = (HALF)f; A[m1 - 6] = (HALF)f;
@@ -1585,7 +1585,7 @@ zsqrt(ZVALUE z, ZVALUE *dest, long rnd)
if (x & TOPHALF) if (x & TOPHALF)
a[1] |= 1; a[1] |= 1;
} }
*a = (HALF)((x << 1) | (u > 0)); *a = ((HALF)(x << 1) | (HALF)(u > 0));
} }
else else
*a = u; *a = u;
@@ -1683,7 +1683,7 @@ done: if (s == 0) {
void void
zroot(ZVALUE z1, ZVALUE z2, ZVALUE *dest) zroot(ZVALUE z1, ZVALUE z2, ZVALUE *dest)
{ {
ZVALUE try, quo, old, temp, temp2; ZVALUE ztry, quo, old, temp, temp2;
ZVALUE k1; /* holds k - 1 */ ZVALUE k1; /* holds k - 1 */
int sign; int sign;
long i; long i;
@@ -1733,12 +1733,12 @@ zroot(ZVALUE z1, ZVALUE z2, ZVALUE *dest)
* is unimportant. * is unimportant.
*/ */
highbit = (highbit + k - 1) / k; highbit = (highbit + k - 1) / k;
try.len = (highbit / BASEB) + 1; ztry.len = (highbit / BASEB) + 1;
try.v = alloc(try.len); ztry.v = alloc(ztry.len);
zclearval(try); zclearval(ztry);
try.v[try.len-1] = ((HALF)1 << (highbit % BASEB)); ztry.v[ztry.len-1] = ((HALF)1 << (highbit % BASEB));
try.sign = 0; ztry.sign = 0;
old.v = alloc(try.len); old.v = alloc(ztry.len);
old.len = 1; old.len = 1;
zclearval(old); zclearval(old);
old.sign = 0; old.sign = 0;
@@ -1746,10 +1746,10 @@ zroot(ZVALUE z1, ZVALUE z2, ZVALUE *dest)
* Main divide and average loop * Main divide and average loop
*/ */
for (;;) { for (;;) {
zpowi(try, k1, &temp); zpowi(ztry, k1, &temp);
zquo(z1, temp, &quo, 0); zquo(z1, temp, &quo, 0);
zfree(temp); zfree(temp);
i = zrel(try, quo); i = zrel(ztry, quo);
if (i <= 0) { if (i <= 0) {
/* /*
* Current try is less than or equal to the root since it is * Current try is less than or equal to the root since it is
@@ -1758,24 +1758,24 @@ zroot(ZVALUE z1, ZVALUE z2, ZVALUE *dest)
* we are done since no improvement occurred. * we are done since no improvement occurred.
* If not, save the improved value and loop some more. * If not, save the improved value and loop some more.
*/ */
if ((i == 0) || (zcmp(old, try) == 0)) { if ((i == 0) || (zcmp(old, ztry) == 0)) {
zfree(quo); zfree(quo);
zfree(old); zfree(old);
try.sign = (BOOL)((HALF)sign); ztry.sign = (BOOL)((HALF)sign);
zquicktrim(try); zquicktrim(ztry);
*dest = try; *dest = ztry;
return; return;
} }
old.len = try.len; old.len = ztry.len;
zcopyval(try, old); zcopyval(ztry, old);
} }
/* average current try and quotent for the new try */ /* average current try and quotent for the new try */
zmul(try, k1, &temp); zmul(ztry, k1, &temp);
zfree(try); zfree(ztry);
zadd(quo, temp, &temp2); zadd(quo, temp, &temp2);
zfree(temp); zfree(temp);
zfree(quo); zfree(quo);
zquo(temp2, z2, &try, 0); zquo(temp2, z2, &ztry, 0);
zfree(temp2); zfree(temp2);
} }
} }

View File

@@ -1117,7 +1117,7 @@ zmodi(ZVALUE z, long n)
val = 0; val = 0;
while (len--) while (len--)
val = ((val << BASEB) + ((FULL) *h1--)) % n; val = ((val << BASEB) + ((FULL) *h1--)) % n;
if (z.sign) if (val && z.sign)
val = n - val; val = n - val;
return (long)val; return (long)val;
} }

View File

@@ -577,7 +577,7 @@ typedef struct {
*/ */
#if FULL_BITS == 64 #if FULL_BITS == 64
# if defined(__STDC__) && __STDC__ != 0 # if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
# define HVAL(a,b) (HALF)(0x ## a ## b) # define HVAL(a,b) (HALF)(0x ## a ## b)
# else # else
# define HVAL(a,b) (HALF)(0x/**/a/**/b) # define HVAL(a,b) (HALF)(0x/**/a/**/b)
@@ -585,7 +585,7 @@ typedef struct {
#elif 2*FULL_BITS == 64 #elif 2*FULL_BITS == 64
# if defined(__STDC__) && __STDC__ != 0 # if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
# define HVAL(a,b) (HALF)0x##b, (HALF)0x##a # define HVAL(a,b) (HALF)0x##b, (HALF)0x##a
# else # else
/* NOTE: Due to a SunOS cc bug, don't put spaces in the HVAL call! */ /* NOTE: Due to a SunOS cc bug, don't put spaces in the HVAL call! */

2
zmod.c
View File

@@ -2337,7 +2337,7 @@ zhnrmod(ZVALUE v, ZVALUE zh, ZVALUE zn, ZVALUE zr, ZVALUE *res)
/* ret = ((ret < 0) ? ret+modlus : ((ret == modulus) ? 0 : ret)); */ /* ret = ((ret < 0) ? ret+modlus : ((ret == modulus) ? 0 : ret)); */
if (ret.sign) { if (ret.sign) {
zadd(ret, modulus, &t); zadd(ret, modulus, &t);
zfree(t); zfree(ret);
ret = t; ret = t;
} else if (zrelval == 0) { } else if (zrelval == 0) {
zfree(ret); zfree(ret);

View File

@@ -778,8 +778,8 @@ small_factor(ZVALUE z, FULL limit)
#if BASEB == 32 #if BASEB == 32
div.v[0] = (HALF)factor; div.v[0] = (HALF)factor;
#else #else
div.v[0] = (factor & BASE1); div.v[0] = (HALF)(factor & BASE1);
div.v[1] = (factor >> BASEB); div.v[1] = (HALF)(factor >> BASEB);
#endif #endif
if (zdivides(z, div)) if (zdivides(z, div))
@@ -1483,8 +1483,8 @@ zlowfactor(ZVALUE z, long count)
#if BASEB == 32 #if BASEB == 32
div.v[0] = (HALF)factor; div.v[0] = (HALF)factor;
#else #else
div.v[0] = (factor & BASE1); div.v[0] = (HALF)(factor & BASE1);
div.v[1] = (factor >> BASEB); div.v[1] = (HALF)(factor >> BASEB);
#endif #endif
if (zdivides(z, div)) if (zdivides(z, div))

View File

@@ -142,7 +142,7 @@
#if FULL_BITS == SBITS #if FULL_BITS == SBITS
# define SLEN 1 /* a 64 bit slot can be held in a FULL */ # define SLEN 1 /* a 64 bit slot can be held in a FULL */
# if defined(__STDC__) && __STDC__ != 0 # if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
# define SVAL(a,b) (FULL)U(0x ## a ## b) # define SVAL(a,b) (FULL)U(0x ## a ## b)
# define SHVAL(a,b,c,d) (HALF)0x ## c ## d, (HALF)0x ## a ## b # define SHVAL(a,b,c,d) (HALF)0x ## c ## d, (HALF)0x ## a ## b
# else # else
@@ -166,7 +166,7 @@
#elif 2*FULL_BITS == SBITS #elif 2*FULL_BITS == SBITS
# define SLEN 2 /* a 64 bit slot needs 2 FULLs */ # define SLEN 2 /* a 64 bit slot needs 2 FULLs */
# if defined(__STDC__) && __STDC__ != 0 # if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
# define SVAL(a,b) (FULL)0x##b, (FULL)0x##a # define SVAL(a,b) (FULL)0x##b, (FULL)0x##a
# define SHVAL(a,b,c,d) (HALF)0x##d, (HALF)0x##c, \ # define SHVAL(a,b,c,d) (HALF)0x##d, (HALF)0x##c, \
(HALF)0x##b, (HALF)0x##a (HALF)0x##b, (HALF)0x##a

View File

@@ -1733,7 +1733,7 @@ zsrandom2(CONST ZVALUE seed, CONST ZVALUE newn)
math_error("srandom newn == 0 reserved for future use"); math_error("srandom newn == 0 reserved for future use");
/*NOTREACHED*/ /*NOTREACHED*/
} }
set = z1tol(newn); set = (HALF)z1tol(newn);
if (!zistiny(newn) || set > BLUM_PREGEN) { if (!zistiny(newn) || set > BLUM_PREGEN) {
math_error("srandom small newn must be [1,20]"); math_error("srandom small newn must be [1,20]");
/*NOTREACHED*/ /*NOTREACHED*/