Release calc version 2.11.0t4

This commit is contained in:
Landon Curt Noll
1999-09-30 02:01:00 -07:00
parent 1ce630ac19
commit 97e9429000
23 changed files with 225 additions and 106 deletions

23
BUGS
View File

@@ -125,26 +125,3 @@ Known problems or mis-features:
Any more information on calc core dumps compiled with Dec's cc compiler Any more information on calc core dumps compiled with Dec's cc compiler
would be most appreciated! would be most appreciated!
* To compile calc using the Solaris cc, the -Xc flag is required.
Unfortunately this change results in the loss of 'long long' and
the resulting code runs slower.
Dr.D.J.Picton <dave@aps5.ph.bham.ac.uk> reports that -Xc is
required for at compiling zrand.c.
* Calc compiled with Solaris cc -Xc results in some test failures:
CALCPATH=./lib ./calc -i -q read regress 2>&1 | nawk -f check.awk
**** Non-true result (0): 7120: sha(sha(isqrt(2e1000)==0x6db8d9cf0b018b8f9cbbf5aa1edb8066d19e1bb0
**** Non-true result (0): 7122: sha(sha("this is", 7^19-8, ..., "hash")) == 0x21e4...
**** Non-true result (0): 7124: sha(z) == 0x36dcca3e51865c30a2cf738023cda446f1368340
**** Non-true result (0): 7209: sha1(sha1("this is",7^19-8,"a composit",3i+4.5,"hash")) == ...
**** Non-true result (0): 7211: sha1(z) == 0xc19e7317675dbf71e293b4c41e117169e9da5b6f
**** Non-true result (0): 7227: sha1(sha1(isqrt(2e1000)))==0x6852a1365c51050c3d039e3c5d9cf29c12283ef4
**** Non-true result (0): 7310: md5(md5("this is", 7^19-8, "a composit", 3i+4.5, "hash")) == ...
**** Non-true result (0): 7312: md5(z) == 0x63d2b2fccae2de265227c30b05abb6b5
**** Non-true result (0): 7328: md5(md5(isqrt(2e1000))) == 0xe56ac4b8cad869e738a04fedc97058f3
**** 9 error(s) found \/++\/
9999: Ending regression tests

45
CHANGES
View File

@@ -1,7 +1,7 @@
Following is the change from calc version 2.11.0t1 to date: Following is the change from calc version 2.11.0t1 to date:
Removed the makefile symbol MAIN. Now forcing all funcions to correctly Removed the makefile symbol MAIN. Now forcing all functions to correctly
be reclared main. To passify some old broken compilers, a return 0; be declared main. To satisfy 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
@@ -39,6 +39,47 @@ Following is the change from calc version 2.11.0t1 to date:
Reordered cc Makefile variable sets in the main Makefile. 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. Fixed misc compile warnings and notices.

View File

@@ -517,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
@@ -542,7 +541,6 @@ 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}
@@ -565,7 +563,6 @@ 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}
@@ -586,7 +583,6 @@ 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}
@@ -618,7 +614,6 @@ CC= ${PURIFY} gcc
#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}
@@ -644,7 +639,6 @@ 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}
@@ -664,7 +658,6 @@ 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}
@@ -674,20 +667,22 @@ CC= ${PURIFY} gcc
# #
### ###
# #
# Solaris 2.x Sun cc compiler # Solaris Sun cc compiler set
# #
# 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}
@@ -710,13 +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
#
###
#
# 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 -=-=-=-=-=-=-=-=-#
@@ -968,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
@@ -2323,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 ""

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

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 */

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 */

View File

@@ -240,6 +240,4 @@ Needed enhancements
* where reasonable, be sure that regress.cal tests builtin functions * where reasonable, be sure that regress.cal tests builtin functions
* add mod h*2^n+/-1 function for integers
* clean the source code and document it better * 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

@@ -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

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.

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 "3" /* 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) {

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) || defined(__cplusplus) # 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) || defined(__cplusplus) # 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

@@ -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) || defined(__cplusplus) # 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) || defined(__cplusplus) # 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