diff --git a/BUGS b/BUGS index 3cc7839..02590c4 100644 --- a/BUGS +++ b/BUGS @@ -89,3 +89,132 @@ Known problems or mis-features: * There is some places in the source with obscure variable names and not much in the way of comments. We need some major cleanup and documentation. + + * On a Dec Alpha, make check for version 2.11.0t1 core dumps: + + From vandermj@molbio.sbphrd.com Fri Sep 24 06:15:28 1999 + Subject: Re: calc version 2.11.0t1 + Date: Fri, 24 Sep 1999 09:15:02 -0400 + + It dies as follows: + + ... + 1802: a = surd(2,3) + 1803: a == surd(2,3) + 1804: surd_value(a) == 2+3i + Segmentation fault + + dbx shows: + signal Segmentation fault at [objcall:155 +0xc,0x1200507b4] index = oap->actions[action]; + (dbx) where + > 0 objcall(action = 14, v1 = 0x1400203d0, v2 = 0x1400203e0, v3 = (nil)) ["obj.c":155, 0x1200507b4] + 1 comparevalue(v1 = 0x1400203d0, v2 = 0x1400203e0) ["value.c":2329, 0x12007f250] + 2 o_eq() ["opcodes.c":2659, 0x12003728c] + 3 calculate(fp = 0x14007fce0) ["opcodes.c":3614, 0x12003942c] + 4 o_usercall(fp = 0x14007fce0, index = 39, argcount = 0) ["opcodes.c":2602, 0x120037080] + 5 calculate(fp = 0x14003bfa0) ["opcodes.c":3622, 0x120039488] + 6 evaluate(nestflag = 14) ["codegen.c":210, 0x120028768] + 7 getcommands(toplevel = 536864560) ["codegen.c":158, 0x1200285bc] + 8 getcommands(toplevel = 536864560) ["codegen.c":122, 0x1200284dc] + 9 main() ["calc.c":279, 0x12001f61c] + + However On 25-Sep-99 9:18, Ernest Bowen wrote: + + Last night I downloaded 2.11.0t1 and without changing Makefile + or anything else did a make and make check. Absolutely no + reported errors or warnings and the check "passed all tests". + The machine I'm using is a Dec 20 alpha running Digitial + UNIX V4.0B (Rev 564). + + Any ideas on how to reconcile these different results? + + * On Sun SPARCstation running Solaris 2.5.1 compiling with + cc version 4.0 with -Xc option 'make check' fails on the hash + functions. However when compiled with gcc everything seems to + work just fine. + + From: "Dr.D.J.Picton" + Date: Fri, 8 May 1998 10:54:43 +0100 + + Platform: Sun SPARCstation + + Operating system: Solaris 2.5.1 + + Compiler: cc version 4.0 with -Xc option. + + The code compiled OK but the sha() and sha1() functions give errors with + make check. These functions clearly are broken. For example, + sha(sha()) gives + + 0xea19f96cdd568ad1084a17acc6103d92c0ef7708 not + 0xf96cea198ad1dd5617ac084a3d92c6107708c0ef + + Interestingly, the consistency checks work OK e.g. + >B = blk() = {"a", "b", "c"}; + >sha(B) == sha("abc"); + 1 + + **** Non-true result (0): 7108: sha(sha()) == + 0xf96cea198ad1dd5617ac084a3d92c6107708c0ef + **** Non-true result (0): 7109: + sha(sha("a"))==0x37f297772fae4cb1ba39b6cf9cf0381180bd62f2 + **** Non-true result (0): 7110: + sha(sha("ab"))==0x488373d362684af3d3f7a6a408b59dfe85419e09 + **** Non-true result (0): 7111: + sha(sha("abc"))==0x0164b8a914cd2a5e74c4f7ff082c4d97f1edf880 + **** Non-true result (0): 7112: + sha(sha("abcd"))==0x082c73b06f71185d840fb4b28eb3abade67714bc + **** Non-true result (0): 7113: + sha(sha("abcde"))==0xd624e34951bb800f0acae773001df8cffe781ba8 + **** Non-true result (0): 7114: + sha(sha("abcdef"))==0x2a589f7750598dc0ea0a608719e04327f609279a + **** Non-true result (0): 7115: + sha(sha("abcdefg"))==0x5bdf01f9298e9d19d3f8d15520fd74eed600b497 + **** Non-true result (0): 7116: + sha(sha("abcdefgh"))==0x734ba8b31975d0dbae4d6e249f4e8da270796c94 + **** Non-true result (0): 7117: sha(sha(1)) == + 0x864c8d09e828c7c31d62693736a5a9302c282777 + **** Non-true result (0): 7118: sha(sha(2)) == + 0x2c0b59c512cb20fad6bb0883b69c9f5a46545808 + **** Non-true result (0): 7119: + sha(sha(22/7)==0x7ddb7f8a7e9d70757f157744fddea7a6c6a6bcc6 + **** Non-true result (0): 7120: + sha(sha(isqrt(2e1000)==0x6db8d9cf0b018b8f9cbbf5aa1edb8066d19e1bb0 + 7121: sha("x", "y", "z") == sha("xyz") + **** Non-true result (0): 7122: sha(sha("this is", 7^19-8, ..., "hash")) == + 0x21e4... + 7123: z = sha(list(1,2,3), "curds and whey", 2^21701-1, pi()); + **** Non-true result (0): 7124: sha(z) == + 0x36dcca3e51865c30a2cf738023cda446f1368340 + + **** Non-true result (0): 7207: sha1(sha1()) == + 0xda39a3ee5e6b4b0d3255bfef95601890afd80709 + 7208: sha1("x", "y", "z") == sha1("xyz") + **** Non-true result (0): 7209: sha1(sha1("this is",7^19-8,"a + composit",3i+4.5,"hash")) == ... + 7210: z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi()); + **** Non-true result (0): 7211: sha1(z) == + 0xc19e7317675dbf71e293b4c41e117169e9da5b6f + + **** Non-true result (0): 7217: + sha1(sha1("a"))==0x86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 + **** Non-true result (0): 7218: + sha1(sha1("ab"))==0xda23614e02469a0d7c7bd1bdab5c9c474b1904dc + **** Non-true result (0): 7219: + sha1(sha1("abc"))==0xa9993e364706816aba3e25717850c26c9cd0d89d + **** Non-true result (0): 7220: + sha1(sha1("abcd"))==0x81fe8bfe87576c3ecb22426f8e57847382917acf + **** Non-true result (0): 7221: + sha1(sha1("abcde"))==0x03de6c570bfe24bfc328ccd7ca46b76eadaf4334 + **** Non-true result (0): 7222: + sha1(sha1("abcdef"))==0x1f8ac10f23c5b5bc1167bda84b833e5c057a77d2 + **** Non-true result (0): 7223: + sha1(sha1("abcdefg"))==0x2fb5e13419fc89246865e7a324f476ec624e8740 + **** Non-true result (0): 7224: + sha1(sha1("abcdefgh"))==0x425af12a0743502b322e93a015bcf868e324d56a + **** Non-true result (0): 7225: + sha1(sha1(1))==0x53dd4e1734ad47d45e41c23e4ce42d7f1f98c1e8 + **** Non-true result (0): 7226: + sha1(sha1(22/7))==0xf8e2510f85f7b9bf088b321188e9f70620f44246 + **** Non-true result (0): 7227: + sha1(sha1(isqrt(2e1000)))==0x6852a1365c51050c3d039e3c5d9cf29c12283ef4 diff --git a/CHANGES b/CHANGES index fab8e50..05aa939 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,5 @@ Following is the change from calc version 2.11.0t1 to date: - Fixed BSDI compile problems related to sys_errlist. - Removed the makefile symbol MAIN. Now forcing all funcions to correctly be reclared main. To passify some old broken compilers, a return 0; (instead of an exit(0);) is used at the end of main(). @@ -12,6 +10,17 @@ Following is the change from calc version 2.11.0t1 to date: Fixed misc compile warnings. + Added the program calc_errno.c and the Makefile symbol ERRNO_DECL. + If ERRNO_DECL is empty, calc_errno.c will try various ways to + declare errno, sys_errlist and sys_nerr. On success or when + it gives up, calc_errno will output the middle of the calc_errno.h + header file. If ERRNO_DECL is -DERRNO_NO_DECL, or -DERRNO_STD_DECL + or -DERRNO_OLD_DECL then the Makefile will build the middle + of the calc_errno.h header file without calc_errno.c's help. + + The func.c file now includes the constructed header file calc_errno.h + to ensure that errno, sys_errlist and sys_nerr are declared correctly. + Following is the change from calc version 2.10.3t5.38 to 2.11.0t0: diff --git a/Makefile b/Makefile index fd480df..647d1eb 100644 --- a/Makefile +++ b/Makefile @@ -206,6 +206,39 @@ HAVE_MEMMOVE= ALIGN32= -DMUST_ALIGN32 #ALIGN32= -UMUST_ALIGN32 +# On most machines: errno sys_errlist and sys_nerr are declared +# by either and/or . But some systems declare +# them somewhere else or do not declare them at all! +# +# If the system were doing a proper job in headers, this should declare them: +# +# #include +# #include +# +# But one some systems one must explicitly declare them as: +# +# extern int errno; +# extern const char *const sys_errlist[]; +# extern int sys_nerr; +# +# and on some old systems they must be explicitly and incorrectly declared as: +# +# extern int errno; +# extern char *sys_errlist[]; +# extern int sys_nerr; +# +# ERRNO_DECL= let calc_errno.c determine how to declare them +# ERRNO_DECL= -DERRNO_NO_DECL headers declare them correctly +# ERRNO_DECL= -DERRNO_STD_DECL one must explicitly declare then +# ERRNO_DECL= -DERRNO_OLD_DECL one must explicitly & incorrectly declare them +# +# When in doubt, be safe leave ERRNO_DECL empty. +# +ERRNO_DECL= +#ERRNO_DECL= -DERRNO_NO_DECL +#ERRNO_DECL= -DERRNO_STD_DECL +#ERRNO_DECL= -DERRNO_OLD_DECL + # where to install binary files # BINDIR= /usr/local/bin @@ -622,29 +655,6 @@ ALLOW_CUSTOM= -DCUSTOM # ### # -# BSDI's BSD/OS 2.0 (or later) set -# -# for better performance, set the following above: -# DEBUG= -O2 -# -#CCWARN= -Wall -Wno-implicit -Wno-comment -#CCOPT= ${DEBUG} ${NO_SHARED} -#CCMISC= -ansi -# -#CFLAGS= ${CCWARN} ${CCOPT} ${CCMISC} -#ICFLAGS= ${CCWARN} ${CCMISC} -# -#CCMAIN= ${ICFLAGS} -#CCSHS= ${CFLAGS} -# -#LCFLAGS= -#LDFLAGS= ${NO_SHARED} ${LD_NO_SHARED} -#ILDFLAGS= -# -#CC= ${PURIFY} shlicc2 -# -### -# # Solaris 2.x Sun cc compiler # # for better performance, set the following above: @@ -668,7 +678,7 @@ ALLOW_CUSTOM= -DCUSTOM # ### # -# Red Hat Linux 6.0 +# Red Hat Linux 6.0 and BSDI's BSD/OS 4.0 (or later) set # # for better performance, set the following above: # DEBUG= -O2 @@ -798,7 +808,7 @@ BUILD_H_SRC= align32.h args.h calcerr.h conf.h endian_calc.h \ fposval.h have_const.h have_fpos.h have_malloc.h \ have_memmv.h have_newstr.h have_offscl.h have_posscl.h \ have_stdlib.h have_string.h have_times.h have_uid_t.h \ - have_unistd.h longbits.h longlong.h terminal.h + have_unistd.h longbits.h longlong.h terminal.h calc_errno.h # we build these .c files during the make # @@ -810,7 +820,7 @@ BUILD_C_SRC= calcerr.c # UTIL_C_SRC= align32.c endian.c longbits.c have_newstr.c have_uid_t.c \ have_const.c have_stdvs.c have_varvs.c fposval.c have_fpos.c \ - longlong.c have_offscl.c have_posscl.c have_memmv.c + longlong.c have_offscl.c have_posscl.c have_memmv.c calc_errno.c # these awk and sed tools are used in the process of building BUILD_H_SRC # and BUILD_C_SRC @@ -824,16 +834,17 @@ UTIL_MISC_SRC= calcerr_h.sed calcerr_h.awk calcerr_c.sed calcerr_c.awk \ # UTIL_OBJS= endian.o longbits.o have_newstr.o have_uid_t.o \ have_const.o fposval.o have_fpos.o longlong.o try_strarg.o \ - have_stdvs.o have_varvs.o have_posscl.o have_memmv.o + have_stdvs.o have_varvs.o have_posscl.o have_memmv.o calc_errno.o # these temp files may be created (and removed) during the build of BUILD_C_SRC # -UTIL_TMP= ll_tmp fpos_tmp fposv_tmp const_tmp uid_tmp newstr_tmp vs_tmp +UTIL_TMP= ll_tmp fpos_tmp fposv_tmp const_tmp uid_tmp newstr_tmp vs_tmp \ + calc_errno_tmp # these utility progs may be used in the process of building BUILD_H_SRC # UTIL_PROGS= align32 fposval have_uid_t longlong have_const \ - endian longbits have_newstr have_stdvs have_varvs + endian longbits have_newstr have_stdvs have_varvs calc_errno # These files are required by the regress.cal regression test. # @@ -1804,6 +1815,98 @@ args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h true; \ fi +calc_errno.h: calc_errno.c ${MAKE_FILE} + -${Q}rm -f calc_errno.h calc_errno calc_errno_tmp + ${Q}echo 'forming calc_errno.h' + ${Q}echo '/*' > calc_errno.h + ${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> calc_errno.h + ${Q}echo ' */' >> calc_errno.h + ${Q}echo '' >> calc_errno.h + ${Q}echo '' >> calc_errno.h + ${Q}echo '#if !defined(__CALC_ERRNO_H__)' >> calc_errno.h + ${Q}echo '#define __CALC_ERRNO_H__' >> calc_errno.h + ${Q}echo '' >> calc_errno.h + ${Q}echo '' >> calc_errno.h + -${Q}if [ X"${ERRNO_DECL}" = X"-DERRNO_NO_DECL" ]; then \ + echo '/*' >> calc_errno.h; \ + echo ' * The calc Makefile explicitly told us' >> calc_errno.h; \ + echo ' * how to declare errno and friends.' >> calc_errno.h; \ + echo ' */' >> calc_errno.h; \ + echo '' >> calc_errno.h; \ + echo '#include ' >> calc_errno.h; \ + echo '#include ' >> calc_errno.h; \ + elif [ X"${ERRNO_DECL}" = X"-DERRNO_STD_DECL" ]; then \ + echo '/*' >> calc_errno.h; \ + echo ' * The calc Makefile explicitly told us' >> calc_errno.h; \ + echo ' * how to declare errno and friends.' >> calc_errno.h; \ + echo ' */' >> calc_errno.h; \ + echo '' >> calc_errno.h; \ + echo 'extern int errno; ' \ + '/* last system error */' >> calc_errno.h; \ + echo 'extern const char *const sys_errlist[];' \ + ' /* system error messages*/' >> calc_errno.h; \ + echo 'extern int sys_nerr; ' \ + '/* number of system errors */' >> calc_errno.h; \ + elif [ X"${ERRNO_DECL}" = X"-DERRNO_OLD_DECL" ]; then \ + echo '/*' >> calc_errno.h; \ + echo ' * The calc Makefile explicitly told us' >> calc_errno.h; \ + echo ' * how to declare errno and friends.' >> calc_errno.h; \ + echo ' */' >> calc_errno.h; \ + echo '' >> calc_errno.h; \ + echo 'extern int errno; ' \ + '/* last system error */' >> calc_errno.h; \ + echo 'extern char *sys_errlist[];' \ + ' /* system error messages*/' >> calc_errno.h; \ + echo 'extern int sys_nerr; ' \ + '/* number of system errors */' >> calc_errno.h; \ + else \ + ${CC} ${CCMAIN} -DTRY_ERRNO_NO_DECL \ + calc_errno.c -o calc_errno 2>calc_errno_tmp; \ + if [ -x ./calc_errno ]; then \ + ./calc_errno >> calc_errno.h; \ + else \ + ${CC} ${CCMAIN} -DTRY_ERRNO_STD_DECL \ + calc_errno.c -o calc_errno 2>calc_errno_tmp; \ + if [ -x ./calc_errno ]; then \ + ./calc_errno >> calc_errno.h; \ + else \ + ${CC} ${CCMAIN} -DTRY_ERRNO_OLD_DECL \ + calc_errno.c -o calc_errno 2>calc_errno_tmp; \ + if [ -x ./calc_errno ]; then \ + ./calc_errno >> calc_errno.h; \ + else \ + echo '/*' >> calc_errno.h; \ + echo ' * We were unable to to determine' >> calc_errno.h; \ + echo ' * how to declare errno and friends.' >> calc_errno.h; \ + echo ' * So we will guess this will work' >> calc_errno.h; \ + echo ' * and hope for the best.' >> calc_errno.h; \ + echo ' */' >> calc_errno.h; \ + echo '' >> calc_errno.h; \ + echo 'extern int errno; ' \ + '/* last system error */' >> calc_errno.h; \ + echo 'extern const char *const sys_errlist[];' \ + ' /* system error messages*/' >> calc_errno.h; \ + echo 'extern int sys_nerr; ' \ + '/* number of system errors */' >> calc_errno.h; \ + fi; \ + fi; \ + fi; \ + fi + ${Q}echo '' >> calc_errno.h + ${Q}echo '' >> calc_errno.h + ${Q}echo '#endif /* !__CALC_ERRNO_H__ */' >> calc_errno.h + -${Q}rm -f calc_errno calc_errno_tmp + ${Q}echo 'calc_errno.h formed' + -@if [ -z "${Q}" ]; then \ + echo ''; \ + echo '=-=-= start of $@ =-=-='; \ + cat $@; \ + echo '=-=-= end of $@ =-=-='; \ + echo ''; \ + else \ + true; \ + fi + calcerr.h: calcerr.tbl calcerr_h.sed calcerr_h.awk ${MAKE_FILE} -${Q}rm -f calerr.h ${Q}echo 'forming calcerr.h' @@ -2190,6 +2293,7 @@ env: @echo "HAVE_UID_T=${HAVE_UID_T}"; echo "" @echo "HAVE_NEWSTR=${HAVE_NEWSTR}"; echo "" @echo "ALIGN32=${ALIGN32}"; echo "" + @echo "ERRNO_DECL=${ERRNO_DECL}"; echo "" @echo "BINDIR=${BINDIR}"; echo "" @echo "TOPDIR=${TOPDIR}"; echo "" @echo "LIBDIR=${LIBDIR}"; echo "" diff --git a/calc_errno.c b/calc_errno.c new file mode 100644 index 0000000..6114840 --- /dev/null +++ b/calc_errno.c @@ -0,0 +1,123 @@ +/* + * errno - Determine how to declare errno, sys_errlist and sys_nerr + * + * On most machines: errno sys_errlist and sys_nerr are declared + * by either and/or . But some systems declare + * them somewhere else or do not declare them at all! + * + * If the system were doing a proper job in headers, this should declare them: + * + * #include + * #include + * + * But one some systems one must explicitly declare them as: + * + * extern int errno; + * extern const char *const sys_errlist[]; + * extern int sys_nerr; + * + * and on some old systems they must be explicitly and incorrectly declared as: + * + * extern int errno; + * extern char *sys_errlist[]; + * extern int sys_nerr; + * + * The purpose of this utility is try and find the right way to declare + * them and to output the middle of a header file called calc_errno.h. + */ + +/* + * Copyright (c) 1999 by Landon Curt Noll. All Rights Reserved. + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby granted, + * provided that the above copyright, this permission notice and text + * this comment, and the disclaimer below appear in all of the following: + * + * supporting documentation + * source copies + * source works derived from this source + * binaries derived from this source or from derived source + * + * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * chongo was here /\../\ + */ + +#include +#if defined(TRY_ERRNO_NO_DECL) +# include +#endif /* TRY_ERRNO_NO_DECL */ + +int +main(void) +{ + +#if defined(TRY_ERRNO_NO_DECL) + printf("/*\n"); + printf(" * The following comments were produced by calc_errno\n"); + printf(" * in an effort to see if these values were correctly\n"); + printf(" * declared when calc_errno.c was compiled.\n"); + printf(" */\n\n"); + printf("/* Initially errno is %d */\n", errno); + printf("/* There are %d entries in sys_errlist[] */\n", sys_nerr); + printf("/* The 2nd sys_errlist entry is \"%s\" */\n\n", sys_errlist[1]); + printf("/*\n"); + printf(" * Based on the above, calc_errno now knows\n"); + printf(" * how to declare errno and friends.\n"); + printf(" */\n\n"); + printf("#include \n"); + printf("#include \n"); +#elif defined(TRY_ERRNO_OLD_DECL) + extern int errno; /* last system error */ + extern char *sys_errlist[]; /* system error messages */ + extern int sys_nerr; /* number of system errors*/ + + printf("/*\n"); + printf(" * The following comments were produced by calc_errno\n"); + printf(" * in an effort to see if these values were correctly\n"); + printf(" * declared when calc_errno.c was compiled.\n"); + printf(" */\n\n"); + printf("/* Initially errno is %d */\n", errno); + printf("/* There are %d entries in sys_errlist[] */\n", sys_nerr); + printf("/* The 2nd sys_errlist entry is \"%s\" */\n\n", sys_errlist[1]); + printf("/*\n"); + printf(" * Based on the above, calc_errno now knows\n"); + printf(" * how to declare errno and friends.\n"); + printf(" */\n\n"); + printf("extern int errno;\t\t/* last system error */\n"); + printf("extern char *sys_errlist[];\t" + "/* system error messages */\n"); + printf("extern int sys_nerr;\t\t/* number of system errors*/\n"); +#else /* assume defined(TRY_ERRNO_STD_DECL) */ + extern int errno; /* last system error */ + extern const char *const sys_errlist[]; /* system error messages */ + extern int sys_nerr; /* number of system errors*/ + + printf("/*\n"); + printf(" * The following comments were produced by calc_errno\n"); + printf(" * in an effort to see if these values were correctly\n"); + printf(" * declared when calc_errno.c was compiled.\n"); + printf(" */\n\n"); + printf("/* Initially errno is %d */\n", errno); + printf("/* There are %d entries in sys_errlist[] */\n", sys_nerr); + printf("/* The 2nd sys_errlist entry is \"%s\" */\n\n", sys_errlist[1]); + printf("/*\n"); + printf(" * Based on the above, calc_errno now knows\n"); + printf(" * how to declare errno and friends.\n"); + printf(" */\n\n"); + printf("extern int errno;\t\t\t/* last system error */\n"); + printf("extern const char *const sys_errlist[];\t" + "/* system error messages */\n"); + printf("extern int sys_nerr;\t\t\t/* number of system errors*/\n"); +#endif + + /* exit(0); */ + return 0; +} diff --git a/file.c b/file.c index 5d67944..f039a51 100644 --- a/file.c +++ b/file.c @@ -1141,6 +1141,7 @@ rewindall(void) * * NOTE: Does not support negative file positions. */ +/*ARGSUSED*/ static ZVALUE filepos2z(FILEPOS pos) { @@ -1493,6 +1494,7 @@ setloc(FILEID id, ZVALUE zpos) * returns: * file size as a ZVALUE */ +/*ARGSUSED*/ static ZVALUE off_t2z(off_t siz) { @@ -1555,6 +1557,7 @@ dev2z(dev_t dev) * returns: * file size as a ZVALUE */ +/*ARGSUSED*/ static ZVALUE inode2z(ino_t inode) { @@ -1841,7 +1844,8 @@ getscanfield(FILE *fp, BOOL skip, unsigned int width, int scannum, char *scanptr if (c == EOF || c == '\0') break; chnum++; - if(scannum && (memchr(scanptr,c,scannum)==NULL) ^ comp) + if(scannum && + ((memchr(scanptr,c,scannum)==NULL) ^ comp)) break; if (!skip) { *b++ = c; @@ -1918,7 +1922,7 @@ getscanwhite(FILE *fp, BOOL skip, unsigned int width, int scannum, char **strptr if (c == EOF || c == '\0') break; chnum++; - if(scannum && !isspace(c) ^ comp) + if(scannum && (!isspace(c) ^ comp)) break; if (!skip) { *b++ = c; diff --git a/func.c b/func.c index ce8afda..f074dd6 100644 --- a/func.c +++ b/func.c @@ -10,15 +10,15 @@ #include #include #include -#include #if defined(FUNCLIST) -#include #define CONST /* disabled for FUNCLIST in case NATIVE_CC doesn't have it */ #else /* FUNCLIST */ +#include "calc_errno.h" + #include "have_unistd.h" #if defined(HAVE_UNISTD_H) #include diff --git a/lib_util.c b/lib_util.c index 10e2706..183cfd1 100644 --- a/lib_util.c +++ b/lib_util.c @@ -241,8 +241,8 @@ convhex2z(char *hex) /* slen is even now */ /* eat two hex chars at a time until the HALF is full */ - for (; (slen % (BASEB/4)) != 0; slen -= 2) { - *hp = ((*hp<<8) | hex2bin(*sp++, *sp++)); + for (; (slen % (BASEB/4)) != 0; slen -= 2, sp += 2) { + *hp = ((*hp<<8) | hex2bin(sp[0], sp[1])); } /* move on to the next HALF */ diff --git a/qfunc.c b/qfunc.c index 17faadb..e9d8f30 100644 --- a/qfunc.c +++ b/qfunc.c @@ -1284,7 +1284,7 @@ qcfsim(NUMBER *q, long rnd) zmodinv(q->num, q->den, &den1); if (s >= 0) { zsub(q->den, den1, &den2); - if (s > 0 || ((zrel(den1, den2) < 0) ^ !(rnd & 16))) { + if (s > 0 || ((zrel(den1, den2) < 0) ^ (!(rnd & 16)))) { zfree(den1); res->den = den2; zmul(den2, q->num, &tmp1); diff --git a/version.c b/version.c index 681021c..b22de37 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 "1" /* test number or empty string if no patch */ +#define MINOR_PATCH "2" /* test number or empty string if no patch */ /* * calc version constants diff --git a/zfunc.c b/zfunc.c index 776f2ef..44b7f37 100644 --- a/zfunc.c +++ b/zfunc.c @@ -1522,7 +1522,7 @@ zsqrt(ZVALUE z, ZVALUE *dest, long rnd) u = (HALF)(s ? BASE1 : 0); if (k < BASEB) { A[m1 - 1] = (HALF)(e >> (BASEB - 1)); - A[m1 - 2] = (HALF)(e << 1 | (s > 0)); + A[m1 - 2] = ((HALF)(e << 1) | (HALF)(s > 0)); A[m1 - 3] = (HALF)(f >> BASEB); A[m1 - 4] = (HALF)f; m = m1 - 2; @@ -1531,7 +1531,7 @@ zsqrt(ZVALUE z, ZVALUE *dest, long rnd) else { A[m1 - 1] = 1; A[m1 - 2] = (HALF)(e >> (BASEB - 1)); - A[m1 - 3] = (HALF)(e << 1 | (s > 0)); + A[m1 - 3] = ((HALF)(e << 1) | (HALF)(s > 0)); A[m1 - 4] = u; A[m1 - 5] = (HALF)(f >> BASEB); A[m1 - 6] = (HALF)f; @@ -1585,7 +1585,7 @@ zsqrt(ZVALUE z, ZVALUE *dest, long rnd) if (x & TOPHALF) a[1] |= 1; } - *a = (HALF)((x << 1) | (u > 0)); + *a = ((HALF)(x << 1) | (HALF)(u > 0)); } else *a = u; diff --git a/zprime.c b/zprime.c index 7a783c2..926c2ff 100644 --- a/zprime.c +++ b/zprime.c @@ -778,8 +778,8 @@ small_factor(ZVALUE z, FULL limit) #if BASEB == 32 div.v[0] = (HALF)factor; #else - div.v[0] = (factor & BASE1); - div.v[1] = (factor >> BASEB); + div.v[0] = (HALF)(factor & BASE1); + div.v[1] = (HALF)(factor >> BASEB); #endif if (zdivides(z, div)) @@ -1483,8 +1483,8 @@ zlowfactor(ZVALUE z, long count) #if BASEB == 32 div.v[0] = (HALF)factor; #else - div.v[0] = (factor & BASE1); - div.v[1] = (factor >> BASEB); + div.v[0] = (HALF)(factor & BASE1); + div.v[1] = (HALF)(factor >> BASEB); #endif if (zdivides(z, div)) diff --git a/zrandom.c b/zrandom.c index c401b44..50a4584 100644 --- a/zrandom.c +++ b/zrandom.c @@ -1733,7 +1733,7 @@ zsrandom2(CONST ZVALUE seed, CONST ZVALUE newn) math_error("srandom newn == 0 reserved for future use"); /*NOTREACHED*/ } - set = z1tol(newn); + set = (HALF)z1tol(newn); if (!zistiny(newn) || set > BLUM_PREGEN) { math_error("srandom small newn must be [1,20]"); /*NOTREACHED*/