diff --git a/BUGS b/BUGS index 701a646..7d02834 100644 --- a/BUGS +++ b/BUGS @@ -125,26 +125,3 @@ Known problems or mis-features: Any more information on calc core dumps compiled with Dec's cc compiler 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 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 diff --git a/CHANGES b/CHANGES index a6cf520..6bb63e8 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,7 @@ Following is the change from calc version 2.11.0t1 to date: - Removed the makefile symbol MAIN. Now forcing all funcions to correctly - be reclared main. To passify some old broken compilers, a return 0; + Removed the makefile symbol MAIN. Now forcing all functions to correctly + be declared main. To satisfy some old broken compilers, a return 0; (instead of an exit(0);) is used at the end of main(). A few of files that were added to calc used 4 character indentation @@ -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. + Fixed a bug and applied a fix that was reported by Ernest Bowen + . 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 + . + + 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 + 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. diff --git a/Makefile b/Makefile index 401b6de..05a923e 100644 --- a/Makefile +++ b/Makefile @@ -517,7 +517,6 @@ ALLOW_CUSTOM= -DCUSTOM # ICFLAGS are given to ${CC} for intermediate progs # # CCMAIN are flags for ${CC} when files with main() instead of CFLAGS -# CCSHS are flags given to ${CC} for compiling shs.c & shs1.c instead of CFLAGS # # LCFLAGS are CC-style flags for ${LINT} # LDFLAGS are flags given to ${CC} for linking .o files @@ -542,7 +541,6 @@ CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} ICFLAGS= ${CCWARN} ${CCMISC} # CCMAIN= ${ICFLAGS} -CCSHS= ${CFLAGS} # LCFLAGS= LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} @@ -565,7 +563,6 @@ CC= ${PURIFY} gcc #ICFLAGS= ${CCWARN} ${CCMISC} # #CCMAIN= ${ICFLAGS} -#CCSHS= ${CFLAGS} # #LCFLAGS= #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} @@ -586,7 +583,6 @@ CC= ${PURIFY} gcc #ICFLAGS= ${CCWARN} ${CCMISC} # #CCMAIN= ${ICFLAGS} -#CCSHS= ${CFLAGS} # #LCFLAGS= #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} @@ -618,7 +614,6 @@ CC= ${PURIFY} gcc #ICFLAGS= ${CCWARN} ${CCMISC} # #CCMAIN= ${ICFLAGS} -#CCSHS= # #LCFLAGS= #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} @@ -644,7 +639,6 @@ CC= ${PURIFY} gcc #ICFLAGS= ${CCWARN} ${CCMISC} # #CCMAIN= ${ICFLAGS} -#CCSHS= ${CFLAGS} # #LCFLAGS= #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} @@ -664,7 +658,6 @@ CC= ${PURIFY} gcc #ICFLAGS= ${CCWARN} ${CCMISC} # #CCMAIN= ${ICFLAGS} -#CCSHS= ${CFLAGS} # #LCFLAGS= #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: # DEBUG= -O # +# We need -DFORCE_STDC to make use of ANSI-C like features and +# to avoid the use of -Xc (which as a lose performance wise). +# #CCWARN= #CCOPT= ${DEBUG} ${NO_SHARED} -#CCMISC=-Xc +#CCMISC= -DFORCE_STDC # #CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} #ICFLAGS= ${CCWARN} ${CCMISC} # #CCMAIN= ${ICFLAGS} -#CCSHS= ${CFLAGS} # #LCFLAGS= #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} @@ -710,13 +705,34 @@ CC= ${PURIFY} gcc #ICFLAGS= ${CCWARN} ${CCMISC} # #CCMAIN= ${ICFLAGS} -#CCSHS= ${CFLAGS} # #LCFLAGS= #LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} #ILDFLAGS= # #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 -=-=-=-=-=-=-=-=-# @@ -968,17 +984,11 @@ calc.o: calc.c ${MAKE_FILE} ${CC} ${CCMAIN} ${CCOPT} ${ALLOW_CUSTOM} -c calc.c custom.o: custom.c ${MAKE_FILE} - ${CC} ${CCOPT} ${ALLOW_CUSTOM} -c custom.c + ${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c custom.c hist.o: hist.c ${MAKE_FILE} ${CC} ${CFLAGS} ${TERMCONTROL} -c hist.c -shs.o: shs.c ${MAKE_FILE} - ${CC} ${CCSHS} -c shs.c - -shs1.o: shs1.c ${MAKE_FILE} - ${CC} ${CCSHS} -c shs1.c - func.o: func.c ${MAKE_FILE} ${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c func.c @@ -2323,7 +2333,6 @@ env: @echo "CFLAGS=${CFLAGS}"; echo "" @echo "ICFLAGS=${ICFLAGS}"; echo "" @echo "CCMAIN=${CCMAIN}"; echo "" - @echo "CCSHS=${CCSHS}"; echo "" @echo "LCFLAGS=${LCFLAGS}"; echo "" @echo "LDFLAGS=${LDFLAGS}"; echo "" @echo "ILDFLAGS=${ILDFLAGS}"; echo "" diff --git a/alloc.h b/alloc.h index c2bbebc..509e518 100644 --- a/alloc.h +++ b/alloc.h @@ -17,7 +17,7 @@ #ifdef HAVE_MALLOC_H # include #else -# if defined(__STDC__) && __STDC__ != 0 +#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) extern void *malloc(); extern void *realloc(); extern void free(); @@ -36,7 +36,7 @@ # if defined(HAVE_NEWSTR) extern void *memcpy(); extern void *memset(); -# if defined(__STDC__) && __STDC__ != 0 +#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) extern size_t strlen(); # else extern long strlen(); @@ -65,7 +65,7 @@ extern int strcmp(); #if !defined(HAVE_MEMMOVE) # undef CALC_SIZE_T -# if defined(__STDC__) && __STDC__ != 0 +#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) # define CALC_SIZE_T size_t # else # define CALC_SIZE_T long diff --git a/calc.c b/calc.c index 03fd214..d43e03f 100644 --- a/calc.c +++ b/calc.c @@ -212,7 +212,7 @@ main(int argc, char **argv) /* * 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 */ @@ -349,7 +349,8 @@ math_error(char *fmt, ...) if (post_init) { longjmp(jmpbuf, 1); } else { - fprintf(stderr, "no jmpbuf jumpback point - ABORTING!!!\n"); + fprintf(stderr, "It is too early provide a command line prompt " + "so we must simply exit. Sorry!\n"); /* * don't call libcalc_call_me_last() -- we might loop * and besides ... this is an unusual internal error case diff --git a/calc.h b/calc.h index d7a6ce4..e22034e 100644 --- a/calc.h +++ b/calc.h @@ -26,7 +26,7 @@ #define DEFAULTCALCHELP "help" /* help file that -h prints */ #define DEFAULTSHELL "sh" /* default shell to use */ #define CALCEXT ".cal" /* extension for files read in */ -#define PATHSIZE 1024 /* maximum length of path name */ +#define MAX_CALCRC 1024 /* maximum length of $CALCRC */ #define HOMECHAR '~' /* char which indicates home directory */ #define DOTCHAR '.' /* char which indicates current directory */ #define PATHCHAR '/' /* char which separates path components */ diff --git a/codegen.c b/codegen.c index cd6e9a2..dc8a913 100644 --- a/codegen.c +++ b/codegen.c @@ -81,8 +81,13 @@ static long getinitlist(void); void getcommands(BOOL toplevel) { - char name[PATHSIZE+1]; /* program name */ + char name[MAXCMD+1+1]; /* program name */ + /* firewall */ + name[0] = '\0'; + name[MAXCMD+1] = '\0'; + + /* getcommands */ if (!toplevel) enterfilescope(); for (;;) { diff --git a/const.c b/const.c index 28ca771..263a24f 100644 --- a/const.c +++ b/const.c @@ -27,10 +27,11 @@ initconstants(void) math_error("Unable to allocate constant table"); /*NOTREACHED*/ } - for (i = 0; i < 8; i++) + for (i = 0; i < INITCONSTCOUNT; i++) consttable[i] = initnumbs[i]; - constcount = 8; - constavail = CONSTALLOCSIZE - 8; + consttable[INITCONSTCOUNT] = NULL; /* firewall */ + constcount = INITCONSTCOUNT; + constavail = CONSTALLOCSIZE - INITCONSTCOUNT; } @@ -187,10 +188,9 @@ freeconstant(unsigned long index) void trimconstants(void) { - NUMBER **qp; - - qp = &consttable[constcount]; - while (constcount > 0 && (*--qp)->links == 0) { + while (constcount > 0 && + (consttable[constcount-1] == NULL || + consttable[constcount-1]->links == 0)) { constcount--; constavail++; } diff --git a/custom/c_sysinfo.c b/custom/c_sysinfo.c index 1e74b76..bf31bed 100644 --- a/custom/c_sysinfo.c +++ b/custom/c_sysinfo.c @@ -99,6 +99,7 @@ static struct infoname sys_info[] = { {"LONGLONG_BITS", "length of a long long, or 0", NULL, (FULL)LONGLONG_BITS}, {"LONG_BITS", "bit length of a long", NULL, (FULL)LONG_BITS}, {"MAP_POPCNT", "number of odd primes in pr_map", NULL, (FULL)MAP_POPCNT}, + {"MAX_CALCRC", "maximum allowed length of $CALCRC", NULL, (FULL)MAX_CALCRC}, {"MAXCMD", "max length of command invocation", NULL, (FULL)MAXCMD}, {"MAXDIM", "max number of dimensions in matrices", NULL, (FULL)MAXDIM}, {"MAXERROR", "max length of error message string", NULL, (FULL)MAXERROR}, @@ -128,8 +129,6 @@ static struct infoname sys_info[] = { {"NXT_MAP_PRIME", "smallest odd prime not in pr_map", NULL, (FULL)NXT_MAP_PRIME}, {"NXT_PFACT_VAL", "next prime for higher pfact values", NULL, (FULL)NXT_PFACT_VAL}, {"OFF_T_BITS", "file offset size in bits", NULL, (FULL)OFF_T_BITS}, - {"PATHSIZE", "max length of path name", NULL, (FULL)PATHSIZE}, - {"PATHSIZE", "max length of path name", NULL, (FULL)PATHSIZE}, {"PIX_32B", "max pix() value", NULL, (FULL)PIX_32B}, {"POW_ALG2", "default size for using REDC for powers", NULL, (FULL)POW_ALG2}, {"REDC_ALG2", "default size using alternative REDC alg", NULL, (FULL)REDC_ALG2}, @@ -238,8 +237,9 @@ c_sysinfo(char *name, int count, VALUE **vals) } else if (vals[0]->v_type == V_STR) { /* convert vals[0] to upper case string */ - buf = (char *)malloc(strlen((char *)vals[0]->v_str)+1); - for (q = (char *)vals[0]->v_str, r = buf; *q; ++q, ++r) { + buf = (char *)malloc(strlen((char *)vals[0]->v_str->s_str)+1); + for (q = (char *)vals[0]->v_str->s_str, r = buf; *q; ++q, ++r) + { if (isascii(*q) && islower(*q)) { *r = *q - 'a' + 'A'; } else { @@ -262,7 +262,7 @@ c_sysinfo(char *name, int count, VALUE **vals) /* return value as string */ result.v_type = V_STR; result.v_subtype = V_NOSUBTYPE; - result.v_str = (STRING *)p->str; + result.v_str = makestring(p->str); } /* return found infotype as value */ diff --git a/help/todo b/help/todo index 8c394cd..cc0971e 100644 --- a/help/todo +++ b/help/todo @@ -240,6 +240,4 @@ Needed enhancements * 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 diff --git a/hist.h b/hist.h index f66043b..71c7901 100644 --- a/hist.h +++ b/hist.h @@ -30,7 +30,6 @@ #define DOTCHAR '.' /* char which indicates current directory */ #define PATHCHAR '/' /* char which separates path components */ #define LISTCHAR ':' /* char which separates paths in a list */ -#define PATHSIZE 1024 /* maximum length of path name */ /* diff --git a/input.c b/input.c index 70eb38e..5d36ee4 100644 --- a/input.c +++ b/input.c @@ -91,20 +91,51 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once) { int i; char *cp; - char path[PATHSIZE+1]; /* name being searched for */ + char *path; /* name being searched for */ struct stat statbuf; /* stat of the path */ + unsigned long namelen; /* length of name */ + unsigned long extlen; /* length of the extension if non-NULL or 0 */ + unsigned long pathlen; /* length of the pathlist if non-NULL or 0 */ + + /* + * allocate storage for the longest name being searched for + * + * We will allocate more than we could ever want/need. + * The longest we could ever need would be: + * + * pathlist (as a single long string) + * / + * name + * . + * extenstion + * \0 + * guard byte + */ + namelen = strlen(name); + if (extension != NULL) { + extlen = strlen(extension); + } else { + extlen = 0; + } + if (pathlist != NULL) { + pathlen = strlen(pathlist); + } else { + pathlen = 0; + } + path = malloc(pathlen+1 + 1 + namelen+1 + extlen+1 + 1 + 1); + if (path == NULL) { + math_error("Cannot allocate filename path buffer"); + /*NOTREACHED*/ + } /* * Don't try the extension if the filename already contains it. */ - if (extension) { - unsigned long namelen = strlen(name); - unsigned long extlen = strlen(extension); - - if (namelen >= extlen && - strcmp(&name[namelen-extlen], extension) == 0) - extension = NULL; + if (extension != NULL && namelen >= extlen && + strcmp(&name[namelen-extlen], extension) == 0) { + extension = NULL; } + /* * If the name is absolute, or if there is no path list, then * make one which just searches for the name straight. Then @@ -127,21 +158,26 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once) *cp++ = PATHCHAR; strcpy(cp, name); i = openfile(path); - if ((i < 0) && (extension != NULL && extension[0] != '\0')) { + if ((i < 0) && + (extension != NULL && extension[0] != '\0')) { strcat(path, extension); i = openfile(path); } } while ((i < 0) && *pathlist); /* examine what our search produced */ - if (i < 0) + if (i < 0) { + free(path); return i; + } if (cip->i_fp == NULL) { /* cannot find a file to open */ + free(path); return -3; } if (fstat(fileno(cip->i_fp), &statbuf) < 0) { /* unable to fstat the open file */ + free(path); return -4; } @@ -149,6 +185,7 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once) if (rd_once == TRUE && isinoderead(&statbuf) >= 0) { /* file is in readset and reopen is false */ closeinput(); + free(path); return 1; } @@ -156,10 +193,12 @@ opensearchfile(char *name, char *pathlist, char *extension, int rd_once) if (addreadset(name, path, &statbuf) < 0) { /* cannot add to readset */ closeinput(); + free(path); return -1; } /* file was added to/updated in readset */ + free(path); return 0; } @@ -189,7 +228,7 @@ homeexpand(char *name) char *home2; /* fullpath of the home directory */ char *fullpath; /* the malloced expanded path */ char *after; /* after the ~user or ~ */ - char username[PATHSIZE+1]; /* extratced username */ + char *username; /* extratced username */ /* firewall */ if (name[0] != HOMECHAR) @@ -217,11 +256,15 @@ homeexpand(char *name) } /* just malloc the home directory and return it */ fullpath = (char *)malloc(strlen(ent->pw_dir)+1); + if (fullpath == NULL) { + return NULL; + } strcpy(fullpath, ent->pw_dir); return fullpath; } - if (after-name > PATHSIZE+1) { - /* username is too big */ + username = (char *) malloc(after-name + 1 + 1); + if (username == NULL) { + /* failed to malloc username */ return NULL; } strncpy(username, name+1, after-name-1); @@ -229,6 +272,7 @@ homeexpand(char *name) /* get that user's home directory */ ent = (struct passwd *)getpwnam(username); + free(username); if (ent == NULL) { /* unknown user */ return NULL; @@ -241,6 +285,9 @@ homeexpand(char *name) * build the fullpath given the home directory */ fullpath = (char *)malloc(strlen(home2)+strlen(after)+1); + if (fullpath == NULL) { + return NULL; + } sprintf(fullpath, "%s%s", home2, after); return fullpath; } @@ -333,6 +380,9 @@ openfile(char *name) cip->i_fp = fp; cip->i_line = 1; cip->i_name = (char *)malloc(strlen(name) + 1); + if (cip->i_name == NULL) { + return -1; + } strcpy(cip->i_name, name); return 0; } @@ -658,7 +708,7 @@ reread(void) void runrcfiles(void) { - char path[PATHSIZE+1]; /* name being searched for */ + char path[MAX_CALCRC+1+1]; /* name being searched for */ char *cp; char *newcp; char *p; diff --git a/lib/regress.cal b/lib/regress.cal index eb1d23f..c15503d 100644 --- a/lib/regress.cal +++ b/lib/regress.cal @@ -702,6 +702,8 @@ define test_functions() { local a, b; local pi; + local h, n, r, m, v; + local n2, m2, v2; print '700: Beginning test_functions'; @@ -1163,7 +1165,31 @@ define test_functions() vrfy(popcnt(pi(1e-20),0) == 69, '1101: popcnt(pi(1e-20),0) == 69'); vrfy(popcnt(17^777) == 1593, '1102: popcnt(17^777) == 1593'); - print '1103: Ending test_functions'; + /* + * more hnrmod testing + */ + vrfy(hnrmod(21<<100+5,3,100,1) == (21<<100+5)%(3<<100+1), + '1103: hnrmod(21<<100+5,3,100,1) == (21<<100+5)%(3<<100+1)'); + vrfy(hnrmod(21<<500+7,3,500,1) == (21<<500+7)%(3<<500+1), + '1104: hnrmod(21<<500+7,3,500,1) == (21<<500+7)%(3<<500+1)'); + vrfy(hnrmod(-767256,84,1,0) == (-767256)%(84<<1+0), + '1105: hnrmod(-767256,84,1,0) == (-767256)%(84<<1+0)'); + vrfy(hnrmod(-831150,75,1,0) == (-831150)%(75<<1+0), + '1106: hnrmod(-831150,75,1,0) == (-831150)%(75<<1+0)'); + vrfy(hnrmod(-767256,84,1,1) == (-767256)%(84<<1+1), + '1107: hnrmod(-767256,84,1,1) == (-767256)%(84<<1+1)'); + vrfy(hnrmod(-831150,75,1,1) == (-831150)%(75<<1+1), + '1108: hnrmod(-831150,75,1,1) == (-831150)%(75<<1+1)'); + vrfy(hnrmod(-767256,84,1,-1) == (-767256)%(84<<1-1), + '1109: hnrmod(-767256,84,1,-1) == (-767256)%(84<<1-1)'); + vrfy(hnrmod(-831150,75,1,-1) == (-831150)%(75<<1-1), + '1110: hnrmod(-831150,75,1,-1) == (-831150)%(75<<1-1)'); + vrfy(hnrmod(21<<100+5,3,100,0) == (21<<100+5)%(3<<100+0), + '1111: hnrmod(21<<100+5,3,100,0) == (21<<100+5)%(3<<100+0)'); + vrfy(hnrmod(21<<500+7,3,500,-1) == (21<<500+7)%(3<<500-1), + '1112: hnrmod(21<<500+7,3,500,-1) == (21<<500+7)%(3<<500-1)'); + + print '1113: Ending test_functions'; } print '017: parsed test_functions()'; diff --git a/lib_calc.c b/lib_calc.c index 80d4e71..3386a50 100644 --- a/lib_calc.c +++ b/lib_calc.c @@ -65,7 +65,7 @@ BOOL inputwait; /* TRUE if in a terminal input wait */ jmp_buf jmpbuf; /* for errors */ int start_done = FALSE; /* TRUE => start up processing finished */ char *program = "calc"; /* our name */ -char cmdbuf[MAXCMD+1]; /* command line expression */ +char cmdbuf[MAXCMD+1+1]; /* command line expression */ /* @@ -281,6 +281,11 @@ initenv(void) if (calcrc == NULL) { calcrc = DEFAULTCALCRC; } + if (strlen(calcrc) > MAX_CALCRC) { + math_error("The $CALCRC variable is longer than %d chars", + MAX_CALCRC); + /*NOTREACHED*/ + } /* determine the $CALCBINDINGS value */ calcbindings = (no_env ? NULL : getenv(CALCBINDINGS)); diff --git a/longbits.c b/longbits.c index 308c684..acc015d 100644 --- a/longbits.c +++ b/longbits.c @@ -206,7 +206,7 @@ main(int argc, char **argv) '/', "* signed 64 bits *", '/'); putchar('\n'); printf("%c%s%c\n", '/',"* how to form 64 bit constants *",'/'); -#if defined(__STDC__) && __STDC__ != 0 +#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) printf("#define U(x) x ## ULL\n"); printf("#define L(x) x ## LL\n"); #else @@ -322,7 +322,7 @@ main(int argc, char **argv) '/', "* signed 64 bits *", '/'); putchar('\n'); printf("%c%s%c\n", '/',"* how to form 64 bit constants *",'/'); -#if defined(__STDC__) && __STDC__ != 0 +#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) printf("#define U(x) x ## UL\n"); printf("#define L(x) x ## L\n"); #else @@ -341,7 +341,7 @@ main(int argc, char **argv) '/', "* signed 64 bits *", '/'); putchar('\n'); printf("%c%s%c\n", '/',"* how to form 64 bit constants *",'/'); -#if defined(__STDC__) && __STDC__ != 0 +#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus) printf("#define U(x) x ## ULL\n"); printf("#define L(x) x ## LL\n"); #else diff --git a/qmath.c b/qmath.c index 3b64953..e4b4e5a 100644 --- a/qmath.c +++ b/qmath.c @@ -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 _qonesqbase_ = { { _oneval_, 1, 0 }, { _sqbaseval_, 2, 0 }, 1, NULL }; -#define INITCONSTCOUNT 8 - NUMBER * initnumbs[INITCONSTCOUNT] = {&_qzero_, &_qone_, &_qtwo_, &_qthree_, &_qfour_, &_qten_, &_qnegone_, &_qonehalf_}; @@ -1365,8 +1363,8 @@ qcmpi(NUMBER *q, long n) #define NNALLOC 1000 -static NUMBER *freeNum; -static NUMBER **firstNums; +static NUMBER *freeNum = NULL; +static NUMBER **firstNums = NULL; static long blockcount = 0; @@ -1389,8 +1387,12 @@ qalloc(void) temp->links = 0; } blockcount++; - newfn = (NUMBER **) - realloc(firstNums, blockcount * sizeof(NUMBER *)); + if (firstNums == NULL) { + newfn = (NUMBER **) malloc(blockcount * sizeof(NUMBER *)); + } else { + newfn = (NUMBER **) + realloc(firstNums, blockcount * sizeof(NUMBER *)); + } if (newfn == NULL) { math_error("Cannot allocate new number block"); /*NOTREACHED*/ diff --git a/qmath.h b/qmath.h index 019a354..397272a 100644 --- a/qmath.h +++ b/qmath.h @@ -13,6 +13,8 @@ #include "zmath.h" +#define INITCONSTCOUNT 8 /* number of initnumbs[] pre-defined constants */ + /* * Rational arithmetic definitions. diff --git a/string.c b/string.c index 7a71d1c..a1ebcec 100644 --- a/string.c +++ b/string.c @@ -960,8 +960,8 @@ stringrsearch(STRING *s1, STRING *s2, long start, long end, ZVALUE *index) #define STRALLOC 100 -static STRING *freeStr; -static STRING **firstStrs; +static STRING *freeStr = NULL; +static STRING **firstStrs = NULL; static long blockcount = 0; @@ -984,8 +984,12 @@ stralloc(void) temp->s_links = 0; } blockcount++; - newfn = (STRING **) - realloc(firstStrs, blockcount * sizeof(STRING *)); + if (firstStrs == NULL) { + newfn = (STRING **) malloc( blockcount * sizeof(STRING *)); + } else { + newfn = (STRING **) + realloc(firstStrs, blockcount * sizeof(STRING *)); + } if (newfn == NULL) { math_error("Cannot allocate new string block"); /*NOTREACHED*/ diff --git a/version.c b/version.c index 84f8f53..d850434 100644 --- a/version.c +++ b/version.c @@ -12,7 +12,7 @@ #define MAJOR_VER 2 /* major version */ #define MINOR_VER 11 /* minor version */ #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 @@ -35,7 +35,7 @@ static char *stored_version = NULL; /* version formed if != NULL */ * This function returns a malloced version string. This version * string does not contain the title, just: * - * x.y.ztsomething + * x.y.ztw * x.y.z * x.y */ @@ -56,17 +56,17 @@ version(void) */ if (sizeof(MINOR_PATCH) > 1) { 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); } else if (MAJOR_PATCH > 0) { 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 { 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); if (stored_version == NULL) { diff --git a/zmath.c b/zmath.c index 10b7147..6282d04 100644 --- a/zmath.c +++ b/zmath.c @@ -1117,7 +1117,7 @@ zmodi(ZVALUE z, long n) val = 0; while (len--) val = ((val << BASEB) + ((FULL) *h1--)) % n; - if (z.sign) + if (val && z.sign) val = n - val; return (long)val; } diff --git a/zmath.h b/zmath.h index 80d5372..837b2c2 100644 --- a/zmath.h +++ b/zmath.h @@ -577,7 +577,7 @@ typedef struct { */ #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) # else # define HVAL(a,b) (HALF)(0x/**/a/**/b) @@ -585,7 +585,7 @@ typedef struct { #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 # else /* NOTE: Due to a SunOS cc bug, don't put spaces in the HVAL call! */ diff --git a/zmod.c b/zmod.c index 100fe1a..a79441c 100644 --- a/zmod.c +++ b/zmod.c @@ -2337,7 +2337,7 @@ zhnrmod(ZVALUE v, ZVALUE zh, ZVALUE zn, ZVALUE zr, ZVALUE *res) /* ret = ((ret < 0) ? ret+modlus : ((ret == modulus) ? 0 : ret)); */ if (ret.sign) { zadd(ret, modulus, &t); - zfree(t); + zfree(ret); ret = t; } else if (zrelval == 0) { zfree(ret); diff --git a/zrand.h b/zrand.h index 45a0921..6c86cb8 100644 --- a/zrand.h +++ b/zrand.h @@ -142,7 +142,7 @@ #if FULL_BITS == SBITS # 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 SHVAL(a,b,c,d) (HALF)0x ## c ## d, (HALF)0x ## a ## b # else @@ -166,7 +166,7 @@ #elif 2*FULL_BITS == SBITS # 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 SHVAL(a,b,c,d) (HALF)0x##d, (HALF)0x##c, \ (HALF)0x##b, (HALF)0x##a