From df32e3956daa956e5562962c77e199c3c432753e Mon Sep 17 00:00:00 2001 From: Landon Curt Noll Date: Thu, 4 Nov 1999 11:33:18 -0800 Subject: [PATCH] Release calc version 2.11.0t9.3.1 --- BUGS | 20 ++++++++++++- CHANGES | 32 +++++++++++++++++++++ Makefile | 71 ++++++++++++++++++++++++++++++++-------------- calc.h | 1 - calc.man | 5 +++- check.awk | 7 ++++- codegen.c | 12 +++++--- custom/Makefile | 10 ++----- custom/c_sysinfo.c | 1 - help/Makefile | 10 ++----- help/calclevel | 4 +-- help/environment | 4 +++ help/inputlevel | 6 ++-- hist.c | 69 ++++++++++++++++++++++++++++++++++++++++++-- lib/Makefile | 10 ++----- lib/altbind | 4 +++ lib/bindings | 4 +++ lib/regress.cal | 17 ++++++----- obj.c | 36 ++++++++++++++++------- sample/Makefile | 10 ++----- seed.c | 16 +++++------ value.h | 2 +- version.c | 21 +++++++++++++- 23 files changed, 275 insertions(+), 97 deletions(-) diff --git a/BUGS b/BUGS index e9887bf..312d700 100644 --- a/BUGS +++ b/BUGS @@ -97,7 +97,7 @@ Known bugs: had been executed. * Dec Alpha Linux compiling with gcc-2.95.1 (or gcc-2.95.2) and - -O2 fails the regression test with: + -O2 fails the version 2.11.0t8.10 regression test with: make -s check 000: Beginning regression tests @@ -117,6 +117,24 @@ Known bugs: One work-a-round is to not compile with -O2 (perhaps just -O). Another work-a-round is not use gcc-2.95.1. + * On a Digital UNIX V4.0F (Rev. 1229) on a 500 Mhz 21264, make check + dies a horrible death starting in test 600 and 622 gives 100s of + messages for calc version 2.11.0t9.2 using the Dec's cc with -O2 + and without -std0: + + 600: Beginning test_bignums + 601: muldivcheck 1 + **** abc != acb: 602: muldivcheck 2 + **** acb != bac: 602: muldivcheck 2 + ... + **** t4 != a4: 622: algcheck 1 + **** t5 != a5: 622: algcheck 1 + **** t6 != a6: 622: algcheck 1 + **** t4 != a4: 622: algcheck 1 + ... + + it finally hangs at test 2000. + We are sure some more bugs exist. When you find them, please let us know! See the above for details on how to report and were to EMail your bug reports and hopefully patches to fix them. diff --git a/CHANGES b/CHANGES index 224dd46..160cd5a 100644 --- a/CHANGES +++ b/CHANGES @@ -84,6 +84,38 @@ Following is the change from calc version 2.11.0t8.9.1 to date: 5 Report on changes to the run state of calc. + Fixed portability issue in seed.c relating to /dev/urandom and ustat. + + Added a fix from Martin Buck to detect when + calc aborts early instead of completing the regression test. + Now 'make chk' will require the last line of calc output to + end in the string ``Ending regression tests''. + + Added a patch from Martin Buck to allow use of + GNU-readline. Note that GNU-readline is not shipped with calc. + His patch only provides the hooks to use it. One must comment out: + + USE_READLINE= + READLINE_LIB= + READLINE_INCLUDE= + + and comment in: + + USE_READLINE= -DUSE_READLINE + READLINE_LIB= -lreadline -lhistory + READLINE_INCLUDE= -I/usr/include/readline + + in addition to pre-installing GNU-readline in your system to use + this facility. + + Changed the "object already defined" math_error message to a + scanerror message. + + Removed the limit on the number of object types. + + Calc tarballs are now named calc-version.tar.gz and untar into + a sub-directory called calc-version. + Following is the change from calc version 2.11.0t8 to 2.11.0t8.9: diff --git a/Makefile b/Makefile index ba33d89..19da0cf 100644 --- a/Makefile +++ b/Makefile @@ -414,9 +414,37 @@ CALCRC= ${LIBDIR}/startup:~/.calcrc # ${LIBDIR}/bindings uses ^D for editing # ${LIBDIR}/altbind uses ^D for EOF # +# NOTE: This facility is disabled if USE_READLINE is set to -DUSE_READLINE. +# CALCBINDINGS= bindings #CALCBINDINGS= altbind +# Determine of the GNU-readline facility will be used instead of the +# built-in CALCBINDINGS above. +# +# USE_READLINE= Do not use GNU-readline, use CALCBINDINGS +# USE_READLINE= -DUSE_READLINE Use GNU-readline, do not use CALCBINDINGS +# +# NOTE: If you select the 'USE_READLINE= -DUSE_READLINE' mode, you must set: +# +# READLINE_LIB The flags needed to link in the readline +# and history libs +# READLINE_INCLUDE Where the readline include files reside +# +# NOTE: The GNU-readline code is not shipped with calc. You must have +# the appropriate headers and libs installed on your system in +# order to use it. +# +# If in doubt, set USE_READLINE, READLINE_LIB and READLINE_INCLUDE to nothing. +# +USE_READLINE= +READLINE_LIB= +READLINE_INCLUDE= +# +#USE_READLINE= -DUSE_READLINE +#READLINE_LIB= -lreadline -lhistory +#READLINE_INCLUDE= -I/usr/include/readline + # If $PAGER is not set, use this program to display a help file # CALCPAGER= more @@ -913,7 +941,7 @@ UTIL_OBJS= endian.o longbits.o have_newstr.o have_uid_t.o \ have_const.o fposval.o have_fpos.o longlong.o try_strarg.o \ have_stdvs.o have_varvs.o have_posscl.o have_memmv.o calc_errno.o \ have_ustat.o have_getsid.o have_getpgid.o \ - have_gettime.o have_getprid.o + have_gettime.o have_getprid.o ver_calc.o # these temp files may be created (and removed) during the build of BUILD_C_SRC # @@ -926,7 +954,7 @@ UTIL_TMP= ll_tmp fpos_tmp fposv_tmp const_tmp uid_tmp newstr_tmp vs_tmp \ UTIL_PROGS= align32 fposval have_uid_t longlong have_const \ endian longbits have_newstr have_stdvs have_varvs calc_errno \ have_ustat have_getsid have_getpgid \ - have_gettime have_getprid + have_gettime have_getprid ver_calc # These files are required by the regress.cal regression test. # @@ -984,7 +1012,7 @@ SAMPLE_PASSDOWN= Q="${Q}" \ LCFLAGS="${LCFLAGS}" \ LDFLAGS="${LDFLAGS}" \ ILDFLAGS="${ILDFLAGS}" \ - CALC_LIBS="../libcalc.a ../custom/libcustcalc.a" \ + CALC_LIBS="../libcalc.a ../custom/libcustcalc.a ${READLINE_LIB}" \ LCC="${LCC}" \ CC="${CC}" \ MAKE_FILE=${MAKE_FILE} \ @@ -1032,7 +1060,7 @@ TARGETS= ${CALC_LIBS} custom/.all calc sample/sample \ all: .hsrc ${TARGETS} calc: .hsrc ${CALC_LIBS} ${CALCOBJS} - ${CC} ${LDFLAGS} ${CALCOBJS} ${CALC_LIBS} ${LD_DEBUG} -o calc + ${CC} ${LDFLAGS} ${CALCOBJS} ${CALC_LIBS} ${LD_DEBUG} ${READLINE_LIB} -o calc libcalc.a: ${LIBOBJS} ${MAKE_FILE} -rm -f libcalc.a @@ -1059,7 +1087,7 @@ custom.o: custom.c ${MAKE_FILE} ${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c custom.c hist.o: hist.c ${MAKE_FILE} - ${CC} ${CFLAGS} ${TERMCONTROL} -c hist.c + ${CC} ${CFLAGS} ${TERMCONTROL} ${USE_READLINE} ${READLINE_INCLUDE} -c hist.c func.o: func.c ${MAKE_FILE} ${CC} ${CFLAGS} ${ALLOW_CUSTOM} -c func.c @@ -2505,6 +2533,12 @@ h_list: echo $$i; \ done +# print the calc version +# +ver_calc: version.c + -rm -f $@ + ${LCC} ${ICFLAGS} -DCALC_VER ${ILDFLAGS} version.c -o $@ + ## # # File distribution list generation. You can ignore this section. @@ -2516,34 +2550,27 @@ h_list: distlist: ${DISTLIST} ${Q}(for i in ${DISTLIST}; do \ - echo calc/$$i; \ + echo $$i; \ done; \ (cd help; ${MAKE} distlist \ MAKE_FILE=${MAKE_FILE} TOPDIR=${TOPDIR} LIBDIR=${LIBDIR} \ HELPDIR=${HELPDIR} SORT=${SORT}); \ (cd lib; ${MAKE} distlist \ MAKE_FILE=${MAKE_FILE} TOPDIR=${TOPDIR} LIBDIR=${LIBDIR} \ - HELPDIR=${HELPDIR} SORT=${SORT}) ) | ${SORT}; \ + HELPDIR=${HELPDIR} SORT=${SORT}); \ (cd custom; ${MAKE} ${CUSTOM_PASSDOWN} distlist); \ - (cd sample; ${MAKE} ${SAMPLE_PASSDOWN} distlist) | ${SORT} + (cd sample; ${MAKE} ${SAMPLE_PASSDOWN} distlist)) | ${SORT} -# The bsdi distribution has generated files as well as distributed files. -# The the .h files are placed under calc/gen_h. -# -bsdilist: ${DISTLIST} ${BUILD_H_SRC} calc.1 - ${Q}(for i in ${DISTLIST}; do \ - echo calc/$$i; \ - done; \ - for i in ${BUILD_H_SRC}; do \ - echo calc/gen_h/$$i; \ - done; \ - echo calc/calc.1; \ - (cd help; ${MAKE} bsdilist \ +distdir: + ${Q}(echo .; \ + (cd help; ${MAKE} distdir \ MAKE_FILE=${MAKE_FILE} TOPDIR=${TOPDIR} LIBDIR=${LIBDIR} \ HELPDIR=${HELPDIR} SORT=${SORT}); \ - (cd lib; ${MAKE} bsdilist \ + (cd lib; ${MAKE} distdir \ MAKE_FILE=${MAKE_FILE} TOPDIR=${TOPDIR} LIBDIR=${LIBDIR} \ - HELPDIR=${HELPDIR} SORT=${SORT}) ) | ${SORT} + HELPDIR=${HELPDIR} SORT=${SORT}); \ + (cd custom; ${MAKE} ${CUSTOM_PASSDOWN} distdir); \ + (cd sample; ${MAKE} ${SAMPLE_PASSDOWN} distdir)) | ${SORT} ## # diff --git a/calc.h b/calc.h index 266dc8f..fc31663 100644 --- a/calc.h +++ b/calc.h @@ -38,7 +38,6 @@ #define SYMBOLSIZE 256 /* maximum symbol name size */ #define MAXINDICES 20 /* maximum number of indices for objects */ #define MAXLABELS 100 /* maximum number of user labels in function */ -#define MAXOBJECTS 128 /* maximum number of object types */ #define MAXSTRING 1024 /* maximum size of string constant */ #define MAXSTACK 1000 /* maximum depth of evaluation stack */ #define MAXFILES 20 /* maximum number of opened files */ diff --git a/calc.man b/calc.man index 561888e..65f07d3 100644 --- a/calc.man +++ b/calc.man @@ -212,7 +212,7 @@ This flag sets the permission mode of It controls the ability for .B calc to open files and execute programs. -.I Mode +.I Mode may be a number from 0 to 7. .sp 1 The mode value is interpreted in a way similar to that @@ -559,6 +559,9 @@ by this environment variable. .sp Default value: ${CALCBINDINGS} .sp +This variable is not used if calc was compiled with GNU-readline support. +In that case, the standard readline mechanisms (see readline(3)) are used. +.sp .SH CREDIT \& .br diff --git a/check.awk b/check.awk index 8189dfa..1b5512b 100644 --- a/check.awk +++ b/check.awk @@ -11,6 +11,7 @@ BEGIN { havebuf2=0; buf2=0; error = 0; + end_seen = 0; } NF == 0 { @@ -29,6 +30,10 @@ NF == 0 { next; } +/: Ending regression tests$/ { + end_seen = 1; +} + $1 ~ /^[0-9]+:/ { if (error > 0) { if (havebuf2) { @@ -71,7 +76,7 @@ END { if (error > 0 && havebuf0) { print buf0; } - if (error > 0) { + if (error > 0 || !end_seen) { exit(1); } else { exit(0); diff --git a/codegen.c b/codegen.c index 70361fd..bacda4a 100644 --- a/codegen.c +++ b/codegen.c @@ -382,7 +382,7 @@ getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaul return; case T_EOF: - scanerror(T_SEMICOLON, "End-of-file in function body"); + scanerror(T_NULL, "End-of-file in function body"); return; default: @@ -995,7 +995,11 @@ getobjdeclaration(int symtype) /*FALLTHRU*/ case T_RIGHTBRACE: (void) tokenmode(oldmode); - (void) defineobject(name, indices, count); + if (defineobject(name, indices, count)) { + scanerror(T_NULL, + "Object type \"%s\" is already defined", name); + return; + } getobjvars(name, symtype); return; case T_NEWLINE: @@ -1350,7 +1354,7 @@ getopassignment(void) return type; } if (isrvalue(type)) { - scanerror(T_NULL, "Illegal assignment in getopassignment"); + scanerror(T_NULL, "Illegal assignment"); (void) getopassignment(); return (EXPR_RVALUE | EXPR_ASSIGN); } @@ -1443,7 +1447,7 @@ getassignment (void) return type; } if (isrvalue(type)) { - scanerror(T_SEMICOLON, "Illegal assignment in getassignment"); + scanerror(T_SEMICOLON, "Illegal assignment"); (void) getassignment(); return (EXPR_RVALUE | EXPR_ASSIGN); } diff --git a/custom/Makefile b/custom/Makefile index 92bbcbc..5c4a3bf 100644 --- a/custom/Makefile +++ b/custom/Makefile @@ -337,15 +337,11 @@ libcustcalc.a: ${CUSTCALC_OBJ} ${MAKE_FILE} ../Makefile distlist: ${DISTLIST} ${Q}for i in ${DISTLIST}; do \ - echo calc/custom/$$i; \ + echo custom/$$i; \ done -# The bsdi distribution has generated files as well as distributed files. -# -bsdilist: ${DISTLIST} - ${Q}for i in ${DISTLIST}; do \ - echo calc/custom/$$i; \ - done +distdir: + ${Q}echo custom ## # diff --git a/custom/c_sysinfo.c b/custom/c_sysinfo.c index 6023baa..1b22ef0 100644 --- a/custom/c_sysinfo.c +++ b/custom/c_sysinfo.c @@ -108,7 +108,6 @@ static struct infoname sys_info[] = { {"MAXLABELS", "max number of user labels in function", NULL, (FULL)MAXLABELS}, {"MAXLEN", "longest storage size allowed", NULL, (FULL)MAXLEN}, {"MAXLONG", "largest long val", NULL, (FULL)MAXLONG}, - {"MAXOBJECTS", "max number of object types", NULL, (FULL)MAXOBJECTS}, {"MAXPRINT_DEFAULT", "default number of elements printed", NULL, (FULL)MAXPRINT_DEFAULT}, {"MAXREDC", "number of entries in REDC cache", NULL, (FULL)MAXREDC}, {"MAXSCANCOUNT", "default max scan errors before an abort", NULL, (FULL)MAXSCANCOUNT}, diff --git a/help/Makefile b/help/Makefile index 977c094..8e62d41 100644 --- a/help/Makefile +++ b/help/Makefile @@ -394,15 +394,11 @@ builtin: builtin.top builtin.end ../func.c funclist.sed distlist: ${DISTLIST} ${Q}for i in ${DISTLIST}; do \ - echo calc/help/$$i; \ + echo help/$$i; \ done | ${SORT} -# The bsdi distribution has generated files as well as distributed files. -# -bsdilist: ${DISTLIST} ${BLT_HELP_FILES} - ${Q}for i in ${DISTLIST} ${BLT_HELP_FILES}; do \ - echo calc/help/$$i; \ - done | ${SORT} +distdir: + ${Q}echo help # The BSDI cdrom makefile expects all help files to be pre-built. This rule # creats these fils so that the release can be shipped off to BSDI. You can diff --git a/help/calclevel b/help/calclevel index b7c3f3a..d9c8f4d 100644 --- a/help/calclevel +++ b/help/calclevel @@ -2,7 +2,7 @@ NAME calclevel - current calculation level SYNOPSIS - calclevel() + calclevel() TYPES return nonnegative integer @@ -11,7 +11,7 @@ DESCRIPTION This function returns the calculation level at which it is called. When a command is being read from a terminal or from a file, calc is at calculation level zero. The level is increased - by 1 each time calculation starts of a user-defined function + by 1 each time calculation starts of a user-defined function or of eval(S) for some expression S which evaluates to a string. It decreases to zero if an error occurs or a quit or abort statement is executed. Otherwise, it decreases by 1 when the calculation diff --git a/help/environment b/help/environment index 696bed1..7ba0b7c 100644 --- a/help/environment +++ b/help/environment @@ -58,6 +58,10 @@ Environment variables a terminal, then calc will still run, but fancy command line editing is disabled. + NOTE: If calc was compiled with GNU-readline support, the + CALCBINDINGS facility is ignored and the standard + readline mechanisms (see readline(3)) are used. + HOME This value is taken to be the home directory of the diff --git a/help/inputlevel b/help/inputlevel index a0da8ce..e67d5de 100644 --- a/help/inputlevel +++ b/help/inputlevel @@ -2,7 +2,7 @@ NAME inputlevel - current input level SYNOPSIS - inputlevel() + inputlevel() TYPES return nonnegative integer @@ -18,10 +18,10 @@ DESCRIPTION decreases to zero if an abort statement is encountered at any function-level in the file or string. If a quit or abort statement is encountered at top calculation-level at top input-level, - calc is exited. + calc is exited. Zero input level is also called top input level; greater values - of inputlevel() indicate reading at greater depths. + of inputlevel() indicate reading at greater depths. EXAMPLE n/a diff --git a/hist.c b/hist.c index ce09c53..95797f0 100644 --- a/hist.c +++ b/hist.c @@ -5,6 +5,8 @@ * * Adapted from code written by Stephen Rothwell. * + * GNU readline support added by Martin Buck + * * Interactive readline module. This is called to read lines of input, * while using emacs-like editing commands within a command stack. * The key bindings for the editing commands are (slightly) configurable. @@ -48,6 +50,8 @@ # include #endif +#if !defined(USE_READLINE) + extern FILE *curstream(void); #define STDIN 0 @@ -1433,8 +1437,68 @@ quit_calc(void) exit(0); } +#else /* USE_READLINE */ -#ifdef HIST_TEST + +#include +#include + + +/* + * The readline/history libs do most of the dirty work for us, so we can + * replace hist_init() and hist_term() with dummies when using readline. + * For hist_getline() we have to add a newline that readline removed but + * calc expects. For hist_saveline(), we have to undo this. hist_getline() + * also has to cope with the different memory management schemes of calc and + * readline. + */ + + +int +hist_getline(char *prompt, char *buf, int len) +{ + char *line; + + buf[0] = '\0'; + line = readline(prompt); + if (!line) + return 0; + strncpy(buf, line, len - 1); + buf[len - 2] = '\0'; + len = strlen(buf); + buf[len] = '\n'; + buf[len + 1] = '\0'; + free(line); + return len + 1; +} + + +int +hist_init(char *filename) +{ + return HIST_SUCCESS; +} + + +void +hist_term(void) +{ +} + + +void +hist_saveline(char *line, int len) +{ + if (!len) + return; + line[len - 1] = '\0'; + add_history(line); + line[len - 1] = '\n'; +} + +#endif /* USE_READLINE */ + +#if defined(HIST_TEST) /* * Main routine to test history. @@ -1475,6 +1539,5 @@ main(int argc, char **argv) hist_term(); exit(0); } -#endif -/* END CODE */ +#endif /* HIST_TEST */ diff --git a/lib/Makefile b/lib/Makefile index b63f8b9..71ddf94 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -73,15 +73,11 @@ all: ${CALC_FILES} ${MAKE_FILE} .all distlist: ${DISTLIST} ${Q}for i in ${DISTLIST}; do \ - echo calc/lib/$$i; \ + echo lib/$$i; \ done -# The bsdi distribution has generated files as well as distributed files. -# -bsdilist: ${DISTLIST} - ${Q}for i in ${DISTLIST}; do \ - echo calc/lib/$$i; \ - done +distdir: + ${Q}echo lib clean: diff --git a/lib/altbind b/lib/altbind index 583e1d3..d7ffba0 100644 --- a/lib/altbind +++ b/lib/altbind @@ -1,4 +1,8 @@ # Alternate key bindings for calc line editing functions +# +# NOTE: This facility is ignored if calc was compiled with GNU-readline. +# In that case, the standard readline mechanisms (see readline(3)) +# are used in place of those found below. map base-map default insert-char diff --git a/lib/bindings b/lib/bindings index 694ca38..bbcc573 100644 --- a/lib/bindings +++ b/lib/bindings @@ -1,4 +1,8 @@ # Default key bindings for calc line editing functions +# +# NOTE: This facility is ignored if calc was compiled with GNU-readline. +# In that case, the standard readline mechanisms (see readline(3)) +# are used in place of those found below. map base-map default insert-char diff --git a/lib/regress.cal b/lib/regress.cal index a71d44c..7a30f69 100644 --- a/lib/regress.cal +++ b/lib/regress.cal @@ -20,18 +20,17 @@ print '002: Within each section, output should be numbered sequentially'; global prob; /* libregress.cal problem counter */ prob = 0; /* clear problem counter */ -global junk; /* throw away value */ -junk = errcount(0); /* clear error count */ -junk = errmax(-1); /* prevent errcount from abouting */ +errcount(0),; /* clear error count */ +errmax(-1),; /* prevent errcount from abouting */ global ecnt; /* expected value of errcount() */ ecnt = 0; /* clear expected errcount() value */ initcfg = config("all", "oldstd"); /* set config to startup default */ -initcfg = config("lib_debug", 0); /* disable lib startup messages */ -initcfg = config("calc_debug", 0); /* disable internal debugging */ -initcnf = config("verbose_quit", 0); /* disable quit messages */ -initcfg = config("all"); /* save state for later use */ +config("lib_debug", 0),; /* disable lib startup messages */ +config("calc_debug", 0),; /* disable internal debugging */ +config("verbose_quit", 0),; /* disable quit messages */ +startcfg = config("all"); /* save state for later use */ print '003: parsed global definitions'; @@ -359,7 +358,7 @@ define test_config() print '502: callcfg = config("all","oldstd")'; oldcfg = config("all", "newstd"); print '503: oldcfg = config("all","newstd")'; - vrfy(callcfg == initcfg, '504: callcfg == initcfg'); + vrfy(callcfg == startcfg, '504: callcfg == startcfg'); newcfg = config("all"); print '505: newcfg = config("all")'; vrfy(config("all") == newcfg, '506: config("all") == newcfg'); @@ -457,7 +456,7 @@ define test_config() vrfy(config("all",callcfg) == oldcfg, '550: config("all",callcfg) == oldcfg'); vrfy(config("all") == callcfg, '551: config("all") == callcfg'); - vrfy(config("all") == initcfg, '552: config("all") == initcfg'); + vrfy(config("all") == startcfg, '552: config("all") == startcfg'); print '553: Ending test_config'; } diff --git a/obj.c b/obj.c index 9c7630c..bf0ae4b 100644 --- a/obj.c +++ b/obj.c @@ -96,8 +96,10 @@ static struct objectinfo { static STRINGHEAD objectnames; /* names of objects */ static STRINGHEAD elements; /* element names for parts of objects */ -static OBJECTACTIONS *objects[MAXOBJECTS]; /* table of actions for objects */ +static OBJECTACTIONS **objects; /* table of actions for objects */ +#define OBJALLOC 16 +static long maxobjcount = 0; static VALUE objpowi(VALUE *vp, NUMBER *q); static BOOL objtest(OBJECT *op); @@ -456,11 +458,12 @@ objpowi(VALUE *vp, NUMBER *q) * indices table of indices for elements * count number of elements defined for the object */ -void +int defineobject(char *name, int indices[], int count) { OBJECTACTIONS *oap; /* object definition structure */ STRINGHEAD *hp; + OBJECTACTIONS **newobjects; int index; hp = &objectnames; @@ -476,21 +479,32 @@ defineobject(char *name, int indices[], int count) if (oap->count == count) { for (index = 0; ; index++) { if (index >= count) - return; + return 0; if (oap->elements[index] != indices[index]) break; } } - math_error("Object type \"%s\" is already defined", name); - /*NOTREACHED*/ + return 1; } - if (hp->h_count >= MAXOBJECTS) { - math_error("Too many object types in use"); - /*NOTREACHED*/ + if (hp->h_count >= maxobjcount) { + if (maxobjcount == 0) { + newobjects = (OBJECTACTIONS **) malloc( + OBJALLOC * sizeof(OBJECTACTIONS *)); + maxobjcount = OBJALLOC; + } else { + maxobjcount += OBJALLOC; + newobjects = (OBJECTACTIONS **) realloc(objects, + maxobjcount * sizeof(OBJECTACTIONS *)); + } + if (newobjects == NULL) { + math_error("Allocation failure for new object type"); + /*NOTREACHED*/ + } + objects = newobjects; } + oap = (OBJECTACTIONS *) malloc(objectactionsize(count)); - if (oap) name = addstr(hp, name); if ((oap == NULL) || (name == NULL)) { math_error("Cannot allocate object type"); @@ -504,7 +518,7 @@ defineobject(char *name, int indices[], int count) oap->elements[index] = indices[index]; index = findstr(hp, name); objects[index] = oap; - return; + return 0; } @@ -596,7 +610,7 @@ objalloc(long index) VALUE *vp; int i; - if ((unsigned) index >= MAXOBJECTS) { + if (index < 0 || index > maxobjcount) { math_error("Allocating bad object index"); /*NOTREACHED*/ } diff --git a/sample/Makefile b/sample/Makefile index 80228ef..2d332a9 100644 --- a/sample/Makefile +++ b/sample/Makefile @@ -321,15 +321,11 @@ many_random: many_random.o ../libcalc.a distlist: ${DISTLIST} ${Q}for i in ${DISTLIST}; do \ - echo calc/sample/$$i; \ + echo sample/$$i; \ done -# The bsdi distribution has generated files as well as distributed files. -# -bsdilist: ${DISTLIST} - ${Q}for i in ${DISTLIST}; do \ - echo calc/sample/$$i; \ - done +distdir: + ${Q}echo sample ## # diff --git a/seed.c b/seed.c index 02da94a..5358432 100644 --- a/seed.c +++ b/seed.c @@ -55,14 +55,6 @@ #include #include #include -#if !defined(__bsdi) -#include -#endif /* __bsdi */ -#if defined(__linux) -# include -# define DEV_URANDOM "/dev/urandom" -# define DEV_URANDOM_POOL 128 -#endif /* __linux */ #include "qmath.h" #include "longbits.h" #include "have_ustat.h" @@ -71,6 +63,14 @@ #include "have_gettime.h" #include "have_getprid.h" #include "have_urandom.h" +#if defined(HAVE_USTAT) +# include +#endif /* HAVE_USTAT */ +#if defined(HAVE_URANDOM) +# include +# define DEV_URANDOM "/dev/urandom" +# define DEV_URANDOM_POOL 16 +#endif /* HAVE_URANDOM */ /* diff --git a/value.h b/value.h index 8bbd7c0..9f51567 100644 --- a/value.h +++ b/value.h @@ -446,7 +446,7 @@ extern VALUE objcall(int action, VALUE *v1, VALUE *v2, VALUE *v3); extern void objfree(OBJECT *op); extern void objuncache(void); extern int addelement(char *name); -extern void defineobject(char *name, int indices[], int count); +extern int defineobject(char *name, int indices[], int count); extern int checkobject(char *name); extern void showobjfuncs(void); extern void showobjtypes(void); diff --git a/version.c b/version.c index 7790f17..64b5cc2 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 "9.2" /* test number or empty string if no patch */ +#define MINOR_PATCH "9.3.1" /* test number or empty string if no patch */ /* * calc version constants @@ -80,3 +80,22 @@ version(void) */ return stored_version; } + + +#if defined(CALC_VER) + +char *program; /* our name */ + +/* + * version - print the calc version + */ +/*ARGSUSED*/ +int +main(int argc, char *argv[]) +{ + program = argv[0]; + printf("%s\n", version()); + return 0; +} + +#endif /* CALC_VER */