mirror of
https://github.com/lcn2/calc.git
synced 2025-08-16 01:03:29 +03:00
Release calc version 2.11.0t4
This commit is contained in:
23
BUGS
23
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 <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
45
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
|
||||
<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.
|
||||
|
||||
|
||||
|
47
Makefile
47
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 ""
|
||||
|
6
alloc.h
6
alloc.h
@@ -17,7 +17,7 @@
|
||||
#ifdef HAVE_MALLOC_H
|
||||
# include <malloc.h>
|
||||
#else
|
||||
# if defined(__STDC__) && __STDC__ != 0
|
||||
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
|
||||
extern void *malloc();
|
||||
extern void *realloc();
|
||||
extern void free();
|
||||
@@ -36,7 +36,7 @@
|
||||
# if defined(HAVE_NEWSTR)
|
||||
extern void *memcpy();
|
||||
extern void *memset();
|
||||
# if defined(__STDC__) && __STDC__ != 0
|
||||
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
|
||||
extern size_t strlen();
|
||||
# else
|
||||
extern long strlen();
|
||||
@@ -65,7 +65,7 @@ extern int strcmp();
|
||||
|
||||
#if !defined(HAVE_MEMMOVE)
|
||||
# undef CALC_SIZE_T
|
||||
# if defined(__STDC__) && __STDC__ != 0
|
||||
#if defined(FORCE_STDC) || (defined(__STDC__) && __STDC__ != 0) || defined(__cplusplus)
|
||||
# define CALC_SIZE_T size_t
|
||||
# else
|
||||
# define CALC_SIZE_T long
|
||||
|
5
calc.c
5
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
|
||||
|
2
calc.h
2
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 */
|
||||
|
@@ -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 (;;) {
|
||||
|
14
const.c
14
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++;
|
||||
}
|
||||
|
@@ -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 */
|
||||
|
@@ -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
|
||||
|
1
hist.h
1
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 */
|
||||
|
||||
|
||||
/*
|
||||
|
78
input.c
78
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;
|
||||
|
@@ -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()';
|
||||
|
||||
|
@@ -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));
|
||||
|
@@ -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
|
||||
|
14
qmath.c
14
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*/
|
||||
|
2
qmath.h
2
qmath.h
@@ -13,6 +13,8 @@
|
||||
|
||||
#include "zmath.h"
|
||||
|
||||
#define INITCONSTCOUNT 8 /* number of initnumbs[] pre-defined constants */
|
||||
|
||||
|
||||
/*
|
||||
* Rational arithmetic definitions.
|
||||
|
12
string.c
12
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*/
|
||||
|
10
version.c
10
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) {
|
||||
|
2
zmath.c
2
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;
|
||||
}
|
||||
|
4
zmath.h
4
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! */
|
||||
|
2
zmod.c
2
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);
|
||||
|
4
zrand.h
4
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
|
||||
|
Reference in New Issue
Block a user