Compare commits

...

5 Commits

Author SHA1 Message Date
Landon Curt Noll
a7e363da8b Release calc version 2.11.0t8.5 2017-05-21 15:38:30 -07:00
Landon Curt Noll
8db10967e8 Release calc version 2.11.0t8.4 2017-05-21 15:38:30 -07:00
Landon Curt Noll
49be672338 Release calc version 2.11.0t8.3 2017-05-21 15:38:30 -07:00
Landon Curt Noll
a7d401cd65 Release calc version 2.11.0t8.2 2017-05-21 15:38:29 -07:00
Landon Curt Noll
5cc680fe42 Release calc version 2.11.0t8.1 2017-05-21 15:38:29 -07:00
67 changed files with 1387 additions and 415 deletions

22
BUGS
View File

@@ -68,9 +68,25 @@ importantly, fixes (in the form of a context diff patch) to:
Known bugs:
None reported. We are sure some 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.
* calc -i ignores quit binding or EOF input in some cases. For example:
echo 'define f(x) { ' > myfile
calc -i read myfile
"./myfile", line 2: End-of-file in function body
Error in commands
>
At this point, calc will re-prompt if you give it an EOF, or
type ^D while using lib/altbind or while ^D is bound to quit.
* When compiled on Solaris with the Solaris cc using -Xc option
(which forces BASEB=16) and without -DFORCE_STDC, calc fails
regression test #8218 because hash(a,s), where a = isqrt(2e1000)
and s = "xyz", returns 1418255679 instead of 2378490456.
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.
=-=

105
CHANGES
View File

@@ -17,7 +17,7 @@ Following is the change from calc version 2.11.0t8 to date:
Improved calc's ability to deal with and recover from errors.
Added inputlevel() builtin to return the input processing level.
In an interact mode, inputlevel() returns 0. When directly reading
In an interact mode, inputlevel() returns 0. When directly reading
a calc script, inputlevel() returns 1. When reading a script which
in turn reads another script, inputlevel() returns 2. etc...
@@ -26,6 +26,109 @@ Following is the change from calc version 2.11.0t8 to date:
Fixed some of the old EMail addresses found in calc documentation.
Added HAVE_USTAT, HAVE_GETSID, HAVE_GETPGID, HAVE_GETTIME, HAVE_GETPRID
and HAVE_URANDOM symbols to the Makefile. These symbols, along with
have_ustat.c, have_getsid.c, have_getpgid.c, have_gettime.c and
have_getprid.c form: have_ustat.h, have_getsid.h, have_getpgid.h,
have_gettime.h, have_getprid.h and have_urandom.h which in turn
are used by pseudo_seed() in seed.c to determine what types of
system services can be used to form a pseudo-random seed.
Fixed the way calc -c will continue processing $CALCRC when errors
are encountered. Unless -d is also given, calc -c will report
when calc is unable to open a $CALCRC file.
Fixed the lower level make depend rules.
Misc cleanup on the have_*.c support source files.
Misc source file cleanup for things such as } else { style consistency.
Fixed the basis for FNV-1 hashes. Piror to this fix, the hash()
builtin produced FNV hash values that did not match the FNV-1
algorithm as specified in:
http://reality.sgi.com/chongo/tech/comp/fnv/index.html
Removed an unused argument in the function getbody() in codegen.c.
Encountering of EOF in getbody() will cause a scanerror rather then
stop activity. This will now result in a scanerror:
echo 'define f(x) { ' > myfile
calc -i read myfile
A '{' at the start of a command and a later matching '}' surrounding zero
or more statements (and possibly newlines) results in a function body to
be "evaluated". This permits another command to follow on the same
line as the '}' as in:
{display(5)} read something;
and:
{static a = 5} define f(x) = a + x;
String constants can now be concatenated. For exmaple:
s = "curds" ' and ' "whey";
Added FNV hash to the regression test suite.
Added Ernest Bowen's <ernie@turing.une.edu.au> fix for the
FNV regression test of the hash() builtin function.
Added Ernest Bowen's <ernie@turing.une.edu.au> patch to improve
the way config("calc_debug"). Now the lower 4 bits of the
config("calc_debug") parameter have the following meaning:
n Meaning of bit n of config("calc_debug")
0 Outputs shell commands prior to execution.
1 Outputs currently active functions when a quit instruction
is executed.
2 Some details of shs, shs1 and md5 hash states are included
in the output when these are printed.
3 When a function constructs a block value, tests are
made that the result has the properties required for use of
that block, e.g. that the pointer to the start of the
block is not NULL, and that its "length" is not negative.
A failure will result in a runtime error.
Changed the meaning of (config("calc_debug") & 1) from only printing
the shell commands (and pausing) while displaying help files into
the printing of any shell command prior to execution.
Documented the meaning of config("lib_debug"):
n Meaning of bit n of config("lib_debug")
0 When a function is defined, redefined or undefined at
interactive level, a message saying what has been done
is displayed.
1 When a function is defined, redefined or undefined during
the reading of a file, a message saying what has been done
is displayed.
The value for config("lib_debug") in both oldstd and newstd is
3, but if calc is invoked with the -d flag, its initial value
is zero. Thus, if calc is started without the -d flag, until
config("lib_debug") is changed, a message will be output when a
function is defined either interactively or during the reading
of a file.
Changed the calc lib files to reflect the new config("lib_debug")
bit field meaning. Calc lib files that need to print extra information
should now do something such as:
if (config("lib_debug") & 3) {
print "obj xyz defined";
print "funcA([val1 [, val2]]) defined";
print "funcB(size, mass, ...) defined";
}
Following is the change from calc version 2.11.0t7 to 2.11.0t7.5:

359
Makefile
View File

@@ -106,7 +106,7 @@ LONGLONG_BITS=
# to determine if there is are fgetpos and fsetpos functions. If HAVE_FPOS
# is set to -DHAVE_NO_FPOS, then calc will use ftell() and fseek().
#
# If in doubt, leave HAVE_FPOS empty.
# If in doubt, leave HAVE_FPOS empty and this Makefile will figure it out.
#
HAVE_FPOS=
#HAVE_FPOS= -DHAVE_NO_FPOS
@@ -120,7 +120,7 @@ HAVE_FPOS=
# -DOFF_T_NON_SCALAR when calc will assume that off_t some sort of
# union or struct which.
#
# If in doubt, leave HAVE_OFFSCL empty.
# If in doubt, leave HAVE_OFFSCL empty and this Makefile will figure it out.
#
HAVE_OFFSCL=
#HAVE_OFFSCL= -DOFF_T_NON_SCALAR
@@ -136,7 +136,7 @@ HAVE_OFFSCL=
# -DFILEPOS_NON_SCALAR when calc will assume that fpos_t exists and is
# some sort of union or struct which.
#
# If in doubt, leave HAVE_POSSCL empty.
# If in doubt, leave HAVE_POSSCL empty and this Makefile will figure it out.
#
HAVE_POSSCL=
#HAVE_POSSCL= -DFILEPOS_NON_SCALAR
@@ -147,7 +147,7 @@ HAVE_POSSCL=
# to determine if const is supported. If HAVE_CONST is set to -DHAVE_NO_CONST,
# then calc will not use const.
#
# If in doubt, leave HAVE_CONST empty.
# If in doubt, leave HAVE_CONST empty and this Makefile will figure it out.
#
HAVE_CONST=
#HAVE_CONST= -DHAVE_NO_CONST
@@ -159,7 +159,7 @@ HAVE_CONST=
# then calc will treat uid_t as an unsigned short. This only matters if
# $HOME is not set and calc must look up the home directory in /etc/passwd.
#
# If in doubt, leave HAVE_UID_T empty.
# If in doubt, leave HAVE_UID_T empty and this Makefile will figure it out.
#
HAVE_UID_T=
#HAVE_UID_T= -DHAVE_NO_UID_T
@@ -172,7 +172,7 @@ HAVE_UID_T=
# of memcpy(), use bfill() instead of memset(), and use index() instead of
# strchr().
#
# If in doubt, leave HAVE_NEWSTR empty.
# If in doubt, leave HAVE_NEWSTR empty and this Makefile will figure it out.
#
HAVE_NEWSTR=
#HAVE_NEWSTR= -DHAVE_NO_NEWSTR
@@ -184,11 +184,83 @@ HAVE_NEWSTR=
# -DHAVE_NO_MEMMOVE, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_MEMMOVE empty.
# If in doubt, leave HAVE_MEMMOVE empty and this Makefile will figure it out.
#
HAVE_MEMMOVE=
#HAVE_MEMMOVE= -DHAVE_NO_MEMMOVE
# Determine if we have ustat()
#
# If HAVE_USTAT is empty, this makefile will run the have_memmv program
# to determine if ustat() is supported. If HAVE_USTAT is set to
# -DHAVE_NO_USTAT, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_USTAT empty and this Makefile will figure it out.
#
HAVE_USTAT=
#HAVE_USTAT= -DHAVE_NO_USTAT
# Determine if we have getsid()
#
# If HAVE_GETSID is empty, this makefile will run the have_memmv program
# to determine if getsid() is supported. If HAVE_GETSID is set to
# -DHAVE_NO_GETSID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_GETSID empty and this Makefile will figure it out.
#
HAVE_GETSID=
#HAVE_GETSID= -DHAVE_NO_GETSID
# Determine if we have getpgid()
#
# If HAVE_GETPGID is empty, this makefile will run the have_memmv program
# to determine if getpgid() is supported. If HAVE_GETPGID is set to
# -DHAVE_NO_GETPGID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_GETPGID empty and this Makefile will figure it out.
#
HAVE_GETPGID=
#HAVE_GETPGID= -DHAVE_NO_GETPGID
# Determine if we have clock_gettime()
#
# If HAVE_GETTIME is empty, this makefile will run the have_memmv program
# to determine if clock_gettime() is supported. If HAVE_GETTIME is set to
# -DHAVE_NO_GETTIME, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_GETTIME empty and this Makefile will figure it out.
#
HAVE_GETTIME=
#HAVE_GETTIME= -DHAVE_NO_GETTIME
# Determine if we have getprid()
#
# If HAVE_GETPRID is empty, this makefile will run the have_memmv program
# to determine if getprid() is supported. If HAVE_GETPRID is set to
# -DHAVE_NO_GETPRID, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_GETPRID empty and this Makefile will figure it out.
#
HAVE_GETPRID=
#HAVE_GETPRID= -DHAVE_NO_GETPRID
# Determine if we have /dev/urandom
#
# If HAVE_URANDOM is empty, this makefile will run the have_memmv program
# to determine if /dev/urandom is supported. If HAVE_URANDOM is set to
# -DHAVE_NO_URANDOM, then calc will use internal functions to simulate
# the memory move function that does correct overlapping memory modes.
#
# If in doubt, leave HAVE_URANDOM empty and this Makefile will figure it out.
#
HAVE_URANDOM=
#HAVE_URANDOM= -DHAVE_NO_URANDOM
# Some architectures such as Sparc do not allow one to access 32 bit values
# that are not alligned on a 32 bit boundary.
#
@@ -809,7 +881,9 @@ 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 calc_errno.h
have_unistd.h longbits.h longlong.h terminal.h calc_errno.h \
have_ustat.h have_getsid.h have_getpgid.h \
have_gettime.h have_getprid.h have_urandom.h
# we build these .c files during the make
#
@@ -821,7 +895,9 @@ 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 calc_errno.c
longlong.c have_offscl.c have_posscl.c have_memmv.c calc_errno.c \
have_ustat.c have_getsid.c have_getpgid.c \
have_gettime.c have_getprid.c
# these awk and sed tools are used in the process of building BUILD_H_SRC
# and BUILD_C_SRC
@@ -835,17 +911,22 @@ 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 calc_errno.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
# these temp files may be created (and removed) during the build of BUILD_C_SRC
# 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 \
calc_errno_tmp
calc_errno_tmp memmv_tmp offscl_tmp posscl_tmp newstr_tmp \
getsid_tmp gettime_tmp getprid_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 calc_errno
endian longbits have_newstr have_stdvs have_varvs calc_errno \
have_ustat have_getsid have_getpgid \
have_gettime have_getprid
# These files are required by the regress.cal regression test.
#
@@ -1717,7 +1798,7 @@ have_newstr.h: have_newstr.c ${MAKE_FILE}
fi
have_memmv.h: have_memmv.c ${MAKE_FILE}
-${Q}rm -f have_memmv have_memmv.o newstr_tmp have_memmv.h
-${Q}rm -f have_memmv have_memmv.o memmv_tmp have_memmv.h
${Q}echo 'forming have_memmv.h'
${Q}echo '/*' > have_memmv.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_memmv.h
@@ -1732,17 +1813,17 @@ have_memmv.h: have_memmv.c ${MAKE_FILE}
-${Q}rm -f have_memmv.o have_memmv
-${Q}${LCC} ${ICFLAGS} ${HAVE_MEMMOVE} have_memmv.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_memmv.o -o have_memmv 2>/dev/null; true
-${Q}${SHELL} -c "./have_memmv > newstr_tmp 2>/dev/null" \
-${Q}${SHELL} -c "./have_memmv > memmv_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s newstr_tmp ]; then \
cat newstr_tmp >> have_memmv.h; \
-${Q}if [ -s memmv_tmp ]; then \
cat memmv_tmp >> have_memmv.h; \
else \
echo '#undef HAVE_MEMMOVE /* no */' >> have_memmv.h; \
fi
${Q}echo '' >> have_memmv.h
${Q}echo '' >> have_memmv.h
${Q}echo '#endif /* !__HAVE_MEMMV_H__ */' >> have_memmv.h
-${Q}rm -f have_memmv have_memmv.o newstr_tmp
-${Q}rm -f have_memmv have_memmv.o memmv_tmp
${Q}echo 'have_memmv.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
@@ -1754,6 +1835,231 @@ have_memmv.h: have_memmv.c ${MAKE_FILE}
true; \
fi
have_ustat.h: have_ustat.c ${MAKE_FILE}
-${Q}rm -f have_ustat have_ustat.o ustat_tmp have_ustat.h
${Q}echo 'forming have_ustat.h'
${Q}echo '/*' > have_ustat.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_ustat.h
${Q}echo ' */' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '#if !defined(__HAVE_USTAT_H__)' >> have_ustat.h
${Q}echo '#define __HAVE_USTAT_H__' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '/* do we have or want ustat()? */' >> have_ustat.h
-${Q}rm -f have_ustat.o have_ustat
-${Q}${LCC} ${ICFLAGS} ${HAVE_USTAT} have_ustat.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_ustat.o -o have_ustat 2>/dev/null; true
-${Q}${SHELL} -c "./have_ustat > ustat_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s ustat_tmp ]; then \
cat ustat_tmp >> have_ustat.h; \
else \
echo '#undef HAVE_USTAT /* no */' >> have_ustat.h; \
fi
${Q}echo '' >> have_ustat.h
${Q}echo '' >> have_ustat.h
${Q}echo '#endif /* !__HAVE_USTAT_H__ */' >> have_ustat.h
-${Q}rm -f have_ustat have_ustat.o ustat_tmp
${Q}echo 'have_ustat.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_getsid.h: have_getsid.c ${MAKE_FILE}
-${Q}rm -f have_getsid have_getsid.o getsid_tmp have_getsid.h
${Q}echo 'forming have_getsid.h'
${Q}echo '/*' > have_getsid.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getsid.h
${Q}echo ' */' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '#if !defined(__HAVE_GETSID_H__)' >> have_getsid.h
${Q}echo '#define __HAVE_GETSID_H__' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '/* do we have or want getsid()? */' >> have_getsid.h
-${Q}rm -f have_getsid.o have_getsid
-${Q}${LCC} ${ICFLAGS} ${HAVE_GETSID} have_getsid.c -c 2>/dev/null; true
-${Q}${LCC} ${ILDFLAGS} have_getsid.o -o have_getsid 2>/dev/null; true
-${Q}${SHELL} -c "./have_getsid > getsid_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s getsid_tmp ]; then \
cat getsid_tmp >> have_getsid.h; \
else \
echo '#undef HAVE_GETSID /* no */' >> have_getsid.h; \
fi
${Q}echo '' >> have_getsid.h
${Q}echo '' >> have_getsid.h
${Q}echo '#endif /* !__HAVE_GETSID_H__ */' >> have_getsid.h
-${Q}rm -f have_getsid have_getsid.o getsid_tmp
${Q}echo 'have_getsid.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_getpgid.h: have_getpgid.c ${MAKE_FILE}
-${Q}rm -f have_getpgid have_getpgid.o getpgid_tmp have_getpgid.h
${Q}echo 'forming have_getpgid.h'
${Q}echo '/*' > have_getpgid.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getpgid.h
${Q}echo ' */' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '#if !defined(__HAVE_GETPGID_H__)' >> have_getpgid.h
${Q}echo '#define __HAVE_GETPGID_H__' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '/* do we have or want getpgid()? */' >> have_getpgid.h
-${Q}rm -f have_getpgid.o have_getpgid
-${Q}${LCC} ${ICFLAGS} ${HAVE_GETPGID} have_getpgid.c -c 2>/dev/null; \
true
-${Q}${LCC} ${ILDFLAGS} have_getpgid.o -o have_getpgid 2>/dev/null; true
-${Q}${SHELL} -c "./have_getpgid > getpgid_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s getpgid_tmp ]; then \
cat getpgid_tmp >> have_getpgid.h; \
else \
echo '#undef HAVE_GETPGID /* no */' >> have_getpgid.h; \
fi
${Q}echo '' >> have_getpgid.h
${Q}echo '' >> have_getpgid.h
${Q}echo '#endif /* !__HAVE_GETPGID_H__ */' >> have_getpgid.h
-${Q}rm -f have_getpgid have_getpgid.o getpgid_tmp
${Q}echo 'have_getpgid.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_gettime.h: have_gettime.c ${MAKE_FILE}
-${Q}rm -f have_gettime have_gettime.o gettime_tmp have_gettime.h
${Q}echo 'forming have_gettime.h'
${Q}echo '/*' > have_gettime.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_gettime.h
${Q}echo ' */' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '#if !defined(__HAVE_GETTIME_H__)' >> have_gettime.h
${Q}echo '#define __HAVE_GETTIME_H__' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '/* do we have or want clock_gettime()? */' >> have_gettime.h
-${Q}rm -f have_gettime.o have_gettime
-${Q}${LCC} ${ICFLAGS} ${HAVE_GETTIME} have_gettime.c -c 2>/dev/null; \
true
-${Q}${LCC} ${ILDFLAGS} have_gettime.o -o have_gettime 2>/dev/null; true
-${Q}${SHELL} -c "./have_gettime > gettime_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s gettime_tmp ]; then \
cat gettime_tmp >> have_gettime.h; \
else \
echo '#undef HAVE_GETTIME /* no */' >> have_gettime.h; \
fi
${Q}echo '' >> have_gettime.h
${Q}echo '' >> have_gettime.h
${Q}echo '#endif /* !__HAVE_GETTIME_H__ */' >> have_gettime.h
-${Q}rm -f have_gettime have_gettime.o gettime_tmp
${Q}echo 'have_gettime.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_getprid.h: have_getprid.c ${MAKE_FILE}
-${Q}rm -f have_getprid have_getprid.o getprid_tmp have_getprid.h
${Q}echo 'forming have_getprid.h'
${Q}echo '/*' > have_getprid.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_getprid.h
${Q}echo ' */' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '#if !defined(__HAVE_GETPRID_H__)' >> have_getprid.h
${Q}echo '#define __HAVE_GETPRID_H__' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '/* do we have or want getprid()? */' >> have_getprid.h
-${Q}rm -f have_getprid.o have_getprid
-${Q}${LCC} ${ICFLAGS} ${HAVE_GETPRID} have_getprid.c -c 2>/dev/null; \
true
-${Q}${LCC} ${ILDFLAGS} have_getprid.o -o have_getprid 2>/dev/null; true
-${Q}${SHELL} -c "./have_getprid > getprid_tmp 2>/dev/null" \
>/dev/null 2>&1; true
-${Q}if [ -s getprid_tmp ]; then \
cat getprid_tmp >> have_getprid.h; \
else \
echo '#undef HAVE_GETPRID /* no */' >> have_getprid.h; \
fi
${Q}echo '' >> have_getprid.h
${Q}echo '' >> have_getprid.h
${Q}echo '#endif /* !__HAVE_GETPRID_H__ */' >> have_getprid.h
-${Q}rm -f have_getprid have_getprid.o getprid_tmp
${Q}echo 'have_getprid.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
have_urandom.h: ${MAKE_FILE}
-${Q}rm -f have_urandom.h
${Q}echo 'forming have_urandom.h'
${Q}echo '/*' > have_urandom.h
${Q}echo ' * DO NOT EDIT -- generated by the Makefile' >> have_urandom.h
${Q}echo ' */' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '#if !defined(__HAVE_URANDOM_H__)' >> have_urandom.h
${Q}echo '#define __HAVE_URANDOM_H__' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '/* do we have /dev/urandom? */' >> have_urandom.h
-${Q}if [ -c /dev/urandom ]; then \
echo '#define HAVE_URANDOM_H /* yes */' >> have_urandom.h; \
else \
echo '#undef HAVE_URANDOM_H /* no */' >> have_urandom.h; \
fi
${Q}echo '' >> have_urandom.h
${Q}echo '' >> have_urandom.h
${Q}echo '#endif /* !__HAVE_URANDOM_H__ */' >> have_urandom.h
${Q}echo 'have_urandom.h formed'
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= start of $@ =-=-='; \
cat $@; \
echo '=-=-= end of $@ =-=-='; \
echo ''; \
else \
true; \
fi
args.h: have_stdvs.c have_varvs.c have_string.h have_unistd.h have_string.h
-${Q}rm -f args.h have_args
${Q}echo 'forming args.h'
@@ -2290,6 +2596,12 @@ env:
@echo "HAVE_CONST=${HAVE_CONST}"; echo ""
@echo "HAVE_UID_T=${HAVE_UID_T}"; echo ""
@echo "HAVE_NEWSTR=${HAVE_NEWSTR}"; echo ""
@echo "HAVE_USTAT=${HAVE_USTAT}"; echo ""
@echo "HAVE_GETSID=${HAVE_GETSID}"; echo ""
@echo "HAVE_GETPGID=${HAVE_GETPGID}"; echo ""
@echo "HAVE_GETTIME=${HAVE_GETTIME}"; echo ""
@echo "HAVE_GETPRID=${HAVE_GETPRID}"; echo ""
@echo "HAVE_URANDOM=${HAVE_URANDOM}"; echo ""
@echo "ALIGN32=${ALIGN32}"; echo ""
@echo "ERRNO_DECL=${ERRNO_DECL}"; echo ""
@echo "BINDIR=${BINDIR}"; echo ""
@@ -3020,6 +3332,10 @@ hash.o: zrand.h
hash.o: zrandom.h
have_const.o: have_const.c
have_fpos.o: have_fpos.c
have_getpgid.o: have_getpgid.c
have_getprid.o: have_getprid.c
have_getsid.o: have_getsid.c
have_gettime.o: have_gettime.c
have_memmv.o: have_memmv.c
have_newstr.o: have_newstr.c
have_offscl.o: have_offscl.c
@@ -3030,6 +3346,7 @@ have_stdvs.o: have_string.h
have_stdvs.o: have_unistd.h
have_uid_t.o: have_uid_t.c
have_uid_t.o: have_unistd.h
have_ustat.o: have_ustat.c
have_varvs.o: have_string.h
have_varvs.o: have_unistd.h
have_varvs.o: have_varvs.c
@@ -3510,11 +3827,17 @@ quickhash.o: zrandom.h
seed.o: alloc.h
seed.o: byteswap.h
seed.o: endian_calc.h
seed.o: have_getpgid.h
seed.o: have_getprid.h
seed.o: have_getsid.h
seed.o: have_gettime.h
seed.o: have_malloc.h
seed.o: have_memmv.h
seed.o: have_newstr.h
seed.o: have_stdlib.h
seed.o: have_string.h
seed.o: have_urandom.h
seed.o: have_ustat.h
seed.o: longbits.h
seed.o: qmath.h
seed.o: seed.c

View File

@@ -164,8 +164,8 @@ endfunc(void)
size += dumpop(&fp->f_opcodes[size]);
}
}
if ((inputisterminal() && conf->lib_debug & 1) ||
(!inputisterminal() && conf->lib_debug & 2)) {
if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) ||
(!inputisterminal() && conf->lib_debug & LIBDBG_FILE_FUNC)) {
printf("%s(", fp->f_name);
for (index = 0; index < fp->f_paramcount; index++) {
if (index)
@@ -238,8 +238,8 @@ rmuserfunc(char *name)
return;
freenumbers(functions[index]);
free(functions[index]);
if ((inputisterminal() && conf->lib_debug & 1) ||
(!inputisterminal() && conf->lib_debug & 2))
if ((inputisterminal() && conf->lib_debug & LIBDBG_STDIN_FUNC) ||
(!inputisterminal() && conf->lib_debug & LIBDBG_FILE_FUNC))
printf("%s() undefined\n", name);
functions[index] = NULL;
}

View File

@@ -57,7 +57,7 @@ associndex(ASSOC *ap, BOOL create, long dim, VALUE *indices)
* so that we can first select the correct hash chain, and
* also so we can quickly compare each element for a match.
*/
hash = (QCKHASH)0;
hash = FNV1_32_BASIS;
for (i = 0; i < dim; i++)
hash = hashvalue(&indices[i], hash);

20
block.c
View File

@@ -104,7 +104,7 @@ blkalloc(int len, int chunk)
/*
* return BLOCK
*/
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(nblk);
}
return nblk;
@@ -145,13 +145,11 @@ blk_free(BLOCK *blk)
* debug time, we plan to call this function often. Once we are satisfied,
* we will normally call this code only in a few places.
*
* This function is normally called whenever the following builtins are called:
* If "calc_debug" has the bit corresponding to CALCDBG_BLOCK set, this
* function is called during execution of the following builtins:
*
* alloc(), realloc(), free()
*
* unless the "calc_debug" is set to -1. If "calc_debug" is > 0, then
* most blk builtins will call this function.
*
* given:
* blk - the BLOCK to check
*
@@ -166,7 +164,7 @@ blkchk(BLOCK *blk)
/*
* firewall - general sanity check
*/
if (conf->calc_debug == -1) {
if ((conf->calc_debug & CALCDBG_BLOCK) == 0) {
/* do nothing when debugging is disabled */
return;
}
@@ -231,7 +229,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
/*
* firewall
*/
if (conf->calc_debug != -1) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
@@ -290,7 +288,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
memset(blk->data, 0, blk->maxsize);
}
blk->datalen = 0;
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
return blk;
@@ -321,7 +319,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
/*
* return realloced type
*/
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
return blk;
@@ -349,7 +347,7 @@ blktrunc(BLOCK *blk)
/*
* firewall
*/
if (conf->calc_debug != -1) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
@@ -370,7 +368,7 @@ blktrunc(BLOCK *blk)
/*NOTREACHED*/
}
blk->data[0] = (USB8)0;
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_BLOCK) {
blkchk(blk);
}
return;

14
calc.c
View File

@@ -249,9 +249,13 @@ main(int argc, char **argv)
fprintf(stderr, "Error in rcfiles\n");
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE);
closeinput();
if (inputisterminal())
if (inputlevel() == 0) {
closeinput();
runrcfiles();
run_state = RUN_PRE_CMD_ARGS;
} else {
closeinput();
}
} else {
if ((havecommands && !i_flag) || !stdin_tty)
run_state = RUN_EXIT_WITH_ERROR;
@@ -274,11 +278,9 @@ main(int argc, char **argv)
fprintf(stderr, "Error in commands\n");
if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE);
closeinput();
if (inputlevel() == 0) {
getcommands(FALSE);
if (inputlevel() == 0)
run_state = RUN_PRE_TOP_LEVEL;
}
closeinput();
} else {
closeinput();
if (!stdin_tty || !i_flag || p_flag)

View File

@@ -31,7 +31,7 @@ static void getshowstatement(void);
static void getfunction(void);
static void ungetfunction(void);
static void getbody(LABEL *contlabel, LABEL *breaklabel,
LABEL *nextcaselabel, LABEL *defaultlabel, BOOL toplevel);
LABEL *nextcaselabel, LABEL *defaultlabel);
static void getdeclarations(int symtype);
static void getsimpledeclaration (int symtype);
static int getonevariable (int symtype);
@@ -190,22 +190,26 @@ evaluate(BOOL nestflag)
funcname = (nestflag ? "**" : "*");
beginfunc(funcname, nestflag);
if (nestflag)
(void) tokenmode(TM_DEFAULT);
while (loop) {
switch (gettoken()) {
case T_SEMICOLON:
break;
if (gettoken() == T_LEFTBRACE) {
getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL, NULL_LABEL);
} else {
if (nestflag)
(void) tokenmode(TM_DEFAULT);
rescantoken();
while (loop) {
switch (gettoken()) {
case T_SEMICOLON:
break;
case T_NEWLINE:
case T_EOF:
loop = 0;
break;
case T_NEWLINE:
case T_EOF:
loop = 0;
break;
default:
rescantoken();
getstatement(NULL_LABEL, NULL_LABEL,
NULL_LABEL, NULL_LABEL);
default:
rescantoken();
getstatement(NULL_LABEL, NULL_LABEL,
NULL_LABEL, NULL_LABEL);
}
}
}
addop(OP_UNDEF);
@@ -322,13 +326,11 @@ getfunction(void)
}
switch (gettoken()) {
case T_ASSIGN:
rescantoken();
getsimplebody();
break;
case T_LEFTBRACE:
rescantoken();
getbody(NULL_LABEL, NULL_LABEL, NULL_LABEL,
NULL_LABEL, TRUE);
NULL_LABEL);
break;
default:
scanerror(T_NULL,
@@ -347,11 +349,6 @@ getfunction(void)
static void
getsimplebody(void)
{
if (gettoken() != T_ASSIGN) {
scanerror(T_SEMICOLON,
"Missing equals for simple function body");
return;
}
(void) tokenmode(TM_NEWLINES);
(void) getexprlist();
addop(OP_RETURN);
@@ -365,14 +362,10 @@ getsimplebody(void)
*/
/*ARGSUSED*/
static void
getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel, BOOL toplevel)
getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaultlabel)
{
int oldmode;
if (gettoken() != T_LEFTBRACE) {
scanerror(T_SEMICOLON, "Missing left brace for function body");
return;
}
oldmode = tokenmode(TM_DEFAULT);
while (TRUE) {
switch (gettoken()) {
@@ -380,6 +373,10 @@ getbody(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *defaul
(void) tokenmode(oldmode);
return;
case T_EOF:
scanerror(T_SEMICOLON, "End-of-file in function body");
return;
default:
rescantoken();
getstatement(contlabel, breaklabel, nextcaselabel, defaultlabel);
@@ -595,8 +592,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel, LABEL *nextcaselabel, LABEL *d
break;
case T_LEFTBRACE:
rescantoken();
getbody(contlabel, breaklabel, nextcaselabel, defaultlabel, FALSE);
getbody(contlabel, breaklabel, nextcaselabel, defaultlabel);
return;
case T_IF:
@@ -1001,8 +997,7 @@ getoneobj(long index, int symtype)
if (symtype == SYM_UNDEFINED) {
rescantoken();
(void) getidexpr(TRUE, TRUE);
}
else {
} else {
symname = tokensymbol();
definesymbol(symname, symtype);
usesymbol(symname, FALSE);
@@ -1086,8 +1081,7 @@ getonematrix(int symtype)
if (symtype == SYM_UNDEFINED) {
rescantoken();
(void) getidexpr(FALSE, TRUE);
}
else {
} else {
name = tokensymbol();
definesymbol(name, symtype);
usesymbol(name, FALSE);
@@ -1172,9 +1166,9 @@ creatematrix(void)
switch (gettoken()) {
case T_RIGHTBRACKET:
addopone(OP_MATCREATE, dim);
if (gettoken() == T_LEFTBRACKET)
if (gettoken() == T_LEFTBRACKET) {
creatematrix();
else {
} else {
rescantoken();
addop(OP_ZERO);
}
@@ -1350,8 +1344,7 @@ getopassignment(void)
while (gettoken() == T_ASSIGN)
getinitlist();
rescantoken();
}
else {
} else {
rescantoken();
(void) getassignment();
}

View File

@@ -231,8 +231,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
return r;
}
s3 = zquo(tmp3, d, &tmp1, s2 < 0);
}
else {
} else {
s2 = zquo(tmp1, d, &tmp3, s1 ? (s1 < 0) : 16);
zfree(tmp1);
s3 = zsqrt(tmp3,&tmp1,(s1||s2) ? (s1<0 || s2<0) : 16);
@@ -288,8 +287,7 @@ csqrt(COMPLEX *c, NUMBER *epsilon, long R)
return r;
}
s3 = zquo(tmp3, d, &mul1, 0);
}
else {
} else {
s2 = zquo(tmp1, d, &tmp3, 0);
zfree(tmp1);
s3 = zsqrt(tmp3, &mul1, 0);

View File

@@ -134,13 +134,31 @@ struct config {
int blkverbose; /* TRUE => print all lines if a block */
int blkbase; /* block output base */
int blkfmt; /* block output style */
int lib_debug; /* library debug: <0 none, 0 default, >0 more */
int calc_debug; /* internal debug: <0 none, 0 default,>0 more */
int lib_debug; /* library debug, see LIB_DEBUG_XXX below */
int calc_debug; /* internal debug, see CALC_DEBUG_XXX below */
int user_debug; /* user defined debug value: 0 default */
};
typedef struct config CONFIG;
/*
* lib_debug bit masks
*/
#define LIBDBG_STDIN_FUNC (0x00000001) /* interactive func define debug */
#define LIBDBG_FILE_FUNC (0x00000002) /* file read func define debug */
#define LIBDBG_MASK (0x00000003)
/*
* calc_debug bit masks
*/
#define CALCDBG_SYSTEM (0x00000001) /* print system cmd prior to exec */
#define CALCDBG_FUNC_QUIT (0x00000002) /* active functions when quit */
#define CALCDBG_HASH_STATE (0x00000004) /* hash state details */
#define CALCDBG_BLOCK (0x00000008) /* block debug */
#define CALCDBG_MASK (0x0000000f)
/*
* global configuration states and aliases
*/

View File

@@ -419,9 +419,13 @@ depend:
else \
rm -f Makefile.tmp; \
mv Makefile Makefile.tmp; \
sccs edit Makefile; \
if [ -d RCS ]; then; \
co -l Makefile; \
fi ;\
mv Makefile.tmp Makefile; \
echo new 'custom Makefile formed -- you need to check it in'; \
if [ -d RCS ]; then; \
echo new custom Makefile formed '--' you need to check it in'; \
fi; \
fi
##
@@ -588,8 +592,28 @@ c_help.o: ../string.h
c_help.o: ../value.h
c_help.o: ../zmath.h
c_help.o: c_help.c
c_pzasusb8.o: ../alloc.h
c_pzasusb8.o: ../block.h
c_pzasusb8.o: ../byteswap.h
c_pzasusb8.o: ../calcerr.h
c_pzasusb8.o: ../cmath.h
c_pzasusb8.o: ../config.h
c_pzasusb8.o: ../custom.h
c_pzasusb8.o: ../endian_calc.h
c_pzasusb8.o: ../hash.h
c_pzasusb8.o: ../have_const.h
c_pzasusb8.o: ../have_malloc.h
c_pzasusb8.o: ../have_memmv.h
c_pzasusb8.o: ../have_newstr.h
c_pzasusb8.o: ../have_stdlib.h
c_pzasusb8.o: ../have_string.h
c_pzasusb8.o: ../longbits.h
c_pzasusb8.o: ../md5.h
c_pzasusb8.o: ../nametype.h
c_pzasusb8.o: ../qmath.h
c_pzasusb8.o: ../shs.h
c_pzasusb8.o: ../shs1.h
c_pzasusb8.o: ../string.h
c_pzasusb8.o: ../value.h
c_pzasusb8.o: ../zmath.h
c_pzasusb8.o: c_pzasusb8.c

19
file.c
View File

@@ -115,15 +115,14 @@ file_init(void)
*/
if (fstat(i, &sbuf) >= 0) {
fp = (FILE *) fdopen(i,"r+"); /*guess mode*/
if (fp)
if (fp) {
strcpy(files[idnum].mode, "r+");
else {
} else {
fp = (FILE *) fdopen(i, "r");
if (fp) {
strcpy(files[idnum].mode, "r");
files[idnum].writing = FALSE;
}
else {
} else {
fp = (FILE *) fdopen(i, "w");
if (fp) {
strcpy(files[idnum].mode, "w?");
@@ -885,13 +884,14 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
math_str((char *)
vp->v_nblock
->blk->data);
} else if (printchar) {
} else if (printchar) {
if (vp->v_nblock->blk->data !=
NULL)
math_chr(*vp->v_nblock->
blk->data);
} else
} else {
printvalue(vp, PRINT_NORMAL);
}
break;
default:
printvalue(vp, PRINT_NORMAL);
@@ -1770,8 +1770,7 @@ showfiles(void)
if (fstat(fileno(fp), &sbuf) < 0) {
printf("Bad fstat for file %d\n", (int) fiop->id);
sizes[i] = -1;
}
else {
} else {
inodes[i] = sbuf.st_ino;
sizes[i] = (long) sbuf.st_size;
}
@@ -2471,9 +2470,9 @@ fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res)
}
(void) f_seek_set(fiop->fp, &cur);
}
if (*tmp.v)
if (*tmp.v) {
(*tmp.v)--;
else {
} else {
if (tmp.len == 1)
break;
k = 0;

60
func.c
View File

@@ -1524,16 +1524,12 @@ static VALUE
f_hash(int count, VALUE **vals)
{
QCKHASH hash;
long lhash;
VALUE result;
hash = (QCKHASH)0;
hash = FNV1_32_BASIS;
while (count-- > 0)
hash = hashvalue(*vals++, hash);
lhash = (long) hash;
if (lhash < 0)
lhash = -lhash;
result.v_num = itoq(lhash);
result.v_num = utoq((FULL) hash);
result.v_type = V_NUM;
return result;
}
@@ -1640,8 +1636,7 @@ f_avg(int count, VALUE **vals)
if ((*vals)->v_type == V_LIST) {
addlistitems((*vals)->v_list, &sum);
n += countlistitems((*vals++)->v_list);
}
else {
} else {
addvalue(&sum, *vals++, &tmp);
freevalue(&sum);
sum = tmp;
@@ -1690,8 +1685,7 @@ f_hmean(int count, VALUE **vals)
if ((*vals)->v_type == V_LIST) {
addlistinv((*vals)->v_list, &sum);
n += countlistitems((*vals++)->v_list);
}
else {
} else {
invertvalue(*vals++, &tmp1);
addvalue(&sum, &tmp1, &tmp2);
freevalue(&tmp1);
@@ -3842,9 +3836,9 @@ f_search(int count, VALUE **vals)
start = qlink(start);
}
if (end) {
if (!qispos(end))
if (!qispos(end)) {
end = qqadd(size, end);
else {
} else {
if (qrel(end, size) > 0)
end = qlink(size);
else
@@ -3866,8 +3860,7 @@ f_search(int count, VALUE **vals)
if (count == 2 || (count == 4 && end != NULL)) {
start = qalloc();
start->num = pos;
}
else {
} else {
end = qalloc();
end->num = pos;
}
@@ -4005,9 +3998,9 @@ f_rsearch(int count, VALUE **vals)
start = qlink(start);
}
if (end) {
if (!qispos(end))
if (!qispos(end)) {
end = qqadd(size, end);
else {
} else {
if (qrel(end, size) > 0)
end = qlink(size);
else
@@ -4029,8 +4022,7 @@ f_rsearch(int count, VALUE **vals)
if (count == 2 || (count == 4 && end != NULL)) {
start = qalloc();
start->num = pos;
}
else {
} else {
end = qalloc();
end->num = pos;
}
@@ -4042,8 +4034,7 @@ f_rsearch(int count, VALUE **vals)
if (count < 4) {
end = start;
start = NULL;
}
else {
} else {
qtmp = qsub(end, qlen);
qfree(end);
end = qtmp;
@@ -4634,9 +4625,9 @@ f_strerror(int count, VALUE **vals)
if (count > 0) {
vp = vals[0];
if (vp->v_type < 0)
if (vp->v_type < 0) {
i = (long) -vp->v_type;
else {
} else {
if (vp->v_type != V_NUM || qisfrac(vp->v_num))
return error_value(E_STRERROR1);
i = qtoi(vp->v_num);
@@ -4747,12 +4738,12 @@ f_error(int count, VALUE **vals)
if (count > 0) {
vp = vals[0];
if (vp->v_type <= 0)
if (vp->v_type <= 0) {
r = (long) -vp->v_type;
else {
if (vp->v_type != V_NUM || qisfrac(vp->v_num))
} else {
if (vp->v_type != V_NUM || qisfrac(vp->v_num)) {
r = E_ERROR1;
else {
} else {
r = qtoi(vp->v_num);
if (r < 0 || r >= 32768)
r = E_ERROR2;
@@ -5542,28 +5533,26 @@ f_tail(VALUE *v1, VALUE *v2)
res.v_type = v1->v_type;
switch (v1->v_type) {
case V_LIST:
if (n == 0)
if (n == 0) {
res.v_list = listalloc();
else if (n > 0) {
} else if (n > 0) {
res.v_list = listsegment(v1->v_list,
v1->v_list->l_count - n,
v1->v_list->l_count - 1);
}
else {
} else {
res.v_list = listsegment(v1->v_list,
v1->v_list->l_count - 1,
v1->v_list->l_count + n);
}
return res;
case V_STR:
if (n == 0)
if (n == 0) {
res.v_str = slink(&_nullstring_);
else if (n > 0) {
} else if (n > 0) {
res.v_str = stringsegment(v1->v_str,
v1->v_str->s_len - n,
v1->v_str->s_len - 1);
}
else {
} else {
res.v_str = stringsegment(v1->v_str,
v1->v_str->s_len - 1,
v1->v_str->s_len + n);
@@ -6048,6 +6037,9 @@ f_system(VALUE *vp)
/*NOTREACHED*/
}
result.v_type = V_NUM;
if (conf->calc_debug & CALCDBG_SYSTEM) {
printf("%s\n", vp->v_str->s_str);
}
result.v_num = itoq((long) system(vp->v_str->s_str));
return result;
}

View File

@@ -46,16 +46,21 @@ int
main(void)
{
#if defined(HAVE_NO_CONST)
printf("#undef HAVE_CONST /* no */\n");
printf("#undef CONST\n");
printf("#define CONST /* no */\n");
#else /* HAVE_NO_CONST */
const char * const str = "const";
printf("#define HAVE_CONST /* yes */\n");
printf("#undef CONST\n");
printf("#define CONST %s /* yes */\n", str);
#endif /* HAVE_NO_CONST */
/* exit(0); */
return 0;
}

60
have_getpgid.c Normal file
View File

@@ -0,0 +1,60 @@
/*
* have_getpgid - Determine if we getpgid()
*
* usage:
* have_getpgid
*
* Not all systems have the getpgid() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETPGID
* defined ==> use getpgid()
* undefined ==> do not or cannot call getpgid()
*/
/*
* 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 <sys/types.h>
#include <unistd.h>
int
main(void)
{
#if defined(HAVE_NO_GETPGID)
printf("#undef HAVE_GETPGID /* no */\n");
#else /* HAVE_NO_GETPGID */
(void) getpgid((pid_t)0);
printf("#define HAVE_GETPGID /* yes */\n");
#endif /* HAVE_NO_GETPGID */
/* exit(0); */
return 0;
}

59
have_getprid.c Normal file
View File

@@ -0,0 +1,59 @@
/*
* have_getprid - Determine if we getprid()
*
* usage:
* have_getprid
*
* Not all systems have the getprid() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETPRID
* defined ==> use getprid()
* undefined ==> do not or cannot call getprid()
*/
/*
* 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 <sys/types.h>
#include <unistd.h>
int
main(void)
{
#if defined(HAVE_NO_GETPRID)
printf("#undef HAVE_GETPRID /* no */\n");
#else /* HAVE_NO_GETPRID */
(void) getprid();
printf("#define HAVE_GETPRID /* yes */\n");
#endif /* HAVE_NO_GETPRID */
/* exit(0); */
return 0;
}

59
have_getsid.c Normal file
View File

@@ -0,0 +1,59 @@
/*
* have_getsid - Determine if we getsid()
*
* usage:
* have_getsid
*
* Not all systems have the getsid() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETSID
* defined ==> use getsid()
* undefined ==> do not call or cannot call getsid()
*/
/*
* 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 <sys/types.h>
int
main(void)
{
#if defined(HAVE_NO_GETSID)
printf("#undef HAVE_GETSID /* no */\n");
#else /* HAVE_NO_GETSID */
(void) getsid((pid_t)0);
printf("#define HAVE_GETSID /* yes */\n");
#endif /* HAVE_NO_GETSID */
/* exit(0); */
return 0;
}

74
have_gettime.c Normal file
View File

@@ -0,0 +1,74 @@
/*
* have_gettime - Determine if we clock_gettime()
*
* usage:
* have_gettime
*
* Not all systems have the clock_gettime() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_GETTIME
* defined ==> use clock_gettime() for either CLOCK_SGI_CYCLE
* and/or CLOCK_REALTIME
* undefined ==> clock_gettime() is not available for both
* CLOCK_SGI_CYCLE and CLOCK_REALTIME
*/
/*
* 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 <time.h>
int
main(void)
{
#if defined(HAVE_NO_GETTIME)
printf("#undef HAVE_GETTIME /* no */\n");
#else /* HAVE_NO_GETTIME */
# if defined(CLOCK_SGI_CYCLE)
struct timespec sgi_cycle; /* SGI hardware clock */
(void) clock_gettime(CLOCK_SGI_CYCLE, &sgi_cycle);
printf("#define HAVE_GETTIME /* yes - w/CLOCK_SGI_CYCLE */\n");
# elif defined(CLOCK_REALTIME)
struct timespec realtime; /* POSIX realtime clock */
(void) clock_gettime(CLOCK_REALTIME, &realtime);
printf("#define HAVE_GETTIME /* yes - CLOCK_REALTIME only */\n");
# else
printf("#undef HAVE_GETTIME /* no - no SGI_CYCLE and no REALTIME */\n");
# endif /* CLOCK_REALTIME */
#endif /* HAVE_NO_GETTIME */
/* exit(0); */
return 0;
}

View File

@@ -2,7 +2,7 @@
* have_memmv - Determine if we memmove()
*
* usage:
* have_newstr
* have_memmv
*
* Not all systems with memcpy() have memmove() functions, so this may not
* compile on your system.
@@ -48,12 +48,17 @@ int
main(void)
{
#if defined(HAVE_NO_MEMMOVE)
printf("#undef HAVE_MEMMOVE /* no */\n");
#else /* HAVE_NO_MEMMOVE */
(void) memmove(dest, src, MOVELEN);
printf("#define HAVE_MEMMOVE /* yes */\n");
#endif /* HAVE_NO_MEMMOVE */
/* exit(0); */
return 0;
}

View File

@@ -50,14 +50,19 @@ int
main(void)
{
#if defined(HAVE_NO_NEWSTR)
printf("#undef HAVE_NEWSTR /* no */\n");
#else /* HAVE_NO_NEWSTR */
(void) memcpy(dest, src, MOVELEN);
(void) memset(dest, 0, MOVELEN);
(void) strchr(src, 'e');
printf("#define HAVE_NEWSTR /* yes */\n");
#endif /* HAVE_NO_NEWSTR */
/* exit(0); */
return 0;
}

View File

@@ -51,15 +51,20 @@ int
main(void)
{
#if defined(HAVE_NO_UID_T)
printf("#undef HAVE_UID_T /* no */\n");
#else /* HAVE_NO_UID_T */
uid_t curds;
extern uid_t geteuid();
curds = geteuid();
printf("#define HAVE_UID_T /* yes */\n");
#endif /* HAVE_NO_UID_T */
/* exit(0); */
return 0;
}

65
have_ustat.c Normal file
View File

@@ -0,0 +1,65 @@
/*
* have_ustat - Determine if we ustat()
*
* usage:
* have_ustat
*
* Not all systems have the ustat() function, so this may not
* compile on your system.
*
* This prog outputs several defines:
*
* HAVE_USTAT
* defined ==> use ustat()
* undefined ==> do not call or cannot call ustat()
*/
/*
* 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 <sys/types.h>
#include <sys/stat.h>
#include <ustat.h>
int
main(void)
{
#if defined(HAVE_NO_USTAT)
printf("#undef HAVE_USTAT /* no */\n");
#else /* HAVE_NO_USTAT */
struct stat stat_dot; /* stat of "." */
struct ustat ustat_dot; /* usage stat of "." */
(void) stat(".", &stat_dot);
(void) ustat(stat_dot.st_dev, &ustat_dot);
printf("#define HAVE_USTAT /* yes */\n");
#endif /* HAVE_NO_USTAT */
/* exit(0); */
return 0;
}

View File

@@ -57,11 +57,13 @@ try_this(char *fmt, ...)
va_list ap;
va_start(ap);
#if !defined(DONT_HAVE_VSPRINTF)
vsprintf(buf, fmt, ap);
#else
sprintf(buf, fmt, ap);
#endif
va_end(ap);
}

3
help.c
View File

@@ -121,9 +121,8 @@ givehelp(char *type)
"else %s no such help, try: help help;fi",
HELPDIR, type, pager, HELPDIR, type,
CUSTOMHELPDIR, type, pager, CUSTOMHELPDIR, type, ECHO);
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_SYSTEM) {
printf("%s\n", helpcmd);
sleep(3);
}
/* execute the help command */

View File

@@ -40,9 +40,9 @@ Configuration parameters
"blkverbose" TRUE=>print all lines, FALSE=>skip duplicates
"blkbase" block output base
"blkfmt" block output format
"lib_debug" calc library script debug level
"calc_debug" internal calc debug level
"user_debug" user defined debug level
"lib_debug" controls library script debug information
"calc_debug" controls internal calc debug information
"user_debug" for user defined debug information
The "all" config value allows one to save/restore the configuration
@@ -78,7 +78,8 @@ Configuration parameters
The "newstd" is not backward compatible with the historic
configuration. Even so, some people prefer this configuration
and place the config("all", "newstd") command in their CALCRC
startup files.
startup files; newstd may also be established by invoking calc
with the flag -n.
When nonzero, the "trace" parameter activates one or more features
that may be useful for debugging. These features correspond to
@@ -103,9 +104,12 @@ Configuration parameters
the decimal point to be printed in real or exponential mode in
normal unformatted printing (print, strprint, fprint) or in
formatted printing (printf, strprintf, fprintf) when precision is not
specified. The initial value is 20. This parameter does not change
the stored value of a number. Where rounding is necessary, the type
of rounding to be used is controlled by "outround".
specified. The initial value for oldstd is 20, for newstd 10.
The parameter may be changed to the value d by either
config("display", d) or by display (d). This parameter does not change
the stored value of a number. Where rounding is necessary to
display up to d decimal places, the type of rounding to be used is
controlled by config("outround").
The "epsilon" parameter specifies the default accuracy for the
calculation of functions for which exact values are not possible or
@@ -118,9 +122,10 @@ Configuration parameters
absolute value of the remainder usually does not exceed epsilon/2.
Functions which require an epsilon value accept an
optional argument which overrides this default epsilon value for
that single call. (The value v can be assigned to the "epsilon"
parameter by epsilon(v) as well as by config("epsilon", v), and the
current value obtained by epsilon() as well as by config("epsilon").)
that single call. The value v can be assigned to the "epsilon"
parameter by either config("epsilon", v) or epsilon(v); each of
these functions return the current epsilon value; config("epsilon")
or epsilon() returns but does not change the epsilon value.
For the transcendental functions and the functions sqrt() and
appr(), the calculated value is always a multiple of epsilon.
@@ -311,67 +316,64 @@ Configuration parameters
The default "blkfmt" is "hd".
With regards to "lib_debug", "calc_debug" and "user_debug":
higher absolute values result in more detailed debugging and
more verbose debug messages. The default value is 0 in which
a very amount of debugging will be performed with nil messages.
The -1 value is reserved for no debugging or messages. Any
value <-1 will perform debugging silently (presumably collecting
data to be displayed at a later time). Values >0 result in a
greater degree of debugging and more verbose messages.
The "lib_debug" parameter is intended for controlling the possible
display of special information relating to functions, objects, and
other structures created by instructions in calc scripts.
Zero value of config("lib_debug") means that no such information
is displayed. For other values, the non-zero bits which currently
have meanings are as follows:
The "lib_debug" is reserved by convention for calc library scripts.
This config parameter takes the place of the lib_debug global variable.
By convention, "lib_debug" has the following meanings:
n Meaning of bit n of config("lib_debug")
<-1 no debug messages are printed though some internal
debug actions and information may be collected
0 When a function is defined, redefined or undefined at
interactive level, a message saying what has been done
is displayed.
-1 no debug messages are printed, no debug actions will be taken
1 When a function is defined, redefined or undefined during
the reading of a file, a message saying what has been done
is displayed.
0 only usage message regarding each important object are
printed at the time of the read (default)
The value for config("lib_debug") in both oldstd and newstd is 3,
but if calc is invoked with the -d flag, its initial value is zero.
Thus, if calc is started without the -d flag, until config("lib_debug")
is changed, a message will be output when a function is defined
either interactively or during the reading of a file.
>0 messages regarding each important object are
printed at the time of the read in addition
to other debug messages
The "calc_debug" is intended for controlling internal calc routines
that test its operation, or collect or display information that
might be useful for debug purposes. Much of the output from these
will make sense only to calc wizards. Zero value (the default for
both oldstd and newstd) of config("lib_calc") corresponds to switching
off all these routines. For nonzero value, particular bits
currently have the following meanings:
The "calc_debug" is reserved by convention for internal calc routines.
The output of "calc_debug" will change from release to release.
Generally this value is used by calc wizards and by the regress.cal
routine (make check). By convention, "calc_debug" has the following
meanings:
n Meaning of bit n of config("calc_debug")
<-1 reserved for future use
0 outputs shell commands prior to execution
-1 no debug messages are printed, no debug actions will be taken
1 outputs currently active functions when a quit instruction
is executed
0 very little, if any debugging is performed (and then mostly
in alpha test code). The only output is as a result of
internal fatal errors (typically either math_error() or
exit() will be called). (default)
2 some details of shs, shs1 and md5 hash states are included
in the output when these are printed
>0 a greater degree of debugging is performed and more
verbose messages are printed (regress.cal uses 1).
3 when a function constructs a block value, tests are
made that the result has the properties required for use of
that block, e.g. that the pointer to the start of the
block is not NULL, and that its "length" is not negative.
A failure will result in a runtime error.
Bits >= 4 are reserved for future use and should not be used at this time.
The "user_debug" is provided for use by users. Calc ignores this value
other than to set it to 0 by default (for both "oldstd" and "newstd").
No calc code or shipped library will change this value other than
during startup or during a config("all", xyz) call.
The following is suggested as a convention for use of "user_debug".
These are only suggestions: feel free to use it as you like:
<-1 no debug messages are printed though some internal
debug actions and information may be collected
-1 no debug messages are printed, no debug actions will be taken
0 very little, if any debugging is performed. The only output
are from fatal errors. (default)
>0 a greater degree of debugging is performed and more
verbose messages are printed
No calc code or shipped library should change this value. Users
should feel free to use it in any way. In particular they may
use particular bits for special purposes as with "calc_debug", or
they may use it to indicate a debug level with larger values
indicating more stringent and more informative tests with presumably
slower operation or more memory usage, and a particular value (like
-1 or 0) corresponding to "no tests".
The following are synonyms for true:

View File

@@ -1,5 +1,5 @@
NAME
hash - hash value
hash - FNV-1 hash value
SYNOPSIS
hash(x_1 [, x_2, x_3, ...])
@@ -12,10 +12,32 @@ TYPES
DESCRIPTION
Returns a hash value for one or more values of arbitrary types.
The basis of this hash algorithm was taken from an idea sent
as reviewer comments to the IEEE POSIX P1003.2 committee by:
Phong Vo (http://www.research.att.com/info/kpv)
Glenn Fowler (http://www.research.att.com/~gsf/)
In a subsequent ballot round:
Landon Curt Noll (http://reality.sgi.com/chongo)
improved on their algorithm. Some people tried this hash
and found that it worked rather well. In an EMail message
to Landon, they named it ``Fowler/Noll/Vo'' or the FNV hash.
FNV hashes are architected to be fast while maintaining a low
collision rate. The FNV speed allows one to quickly hash lots
of data while maintaining a reasonable collision rate. See:
http://reality.sgi.com/chongo/tech/comp/fnv/
for more details as well as other forms of the FNV hash.
EXAMPLE
> a = isqrt(2e1000); s = "xyz";
> hash(a,s)
870000771
2378490456
LIMITS
The number of arguments is not to exceed 100.
@@ -24,3 +46,4 @@ LIBRARY
none
SEE ALSO
sha, sha1, md5

View File

@@ -21,9 +21,6 @@ Very High priority items:
* Update the errmax about the meaning of errmax(-1).
* Document the new meanings for bit values and the sign of
of config("lib_debug") in the appropriate help file(s).
* Fix any 'Known bugs' as noted in the BUGS file or as
displayed by 'calc help bugs'.
@@ -61,6 +58,8 @@ High priority items:
ensure that they have not introduced new or re-introduced old bugs
into calc.
* Consider using configure to build the calc Makefile.
=-=
Medium priority items:
@@ -91,3 +90,6 @@ Medium priority items:
other stuff) in a separate library.
* Clean the source code and document it better.
* Add a builtin function to access the 64 bit FNV hash which
is currently being used internally in seed.c.

View File

@@ -179,37 +179,3 @@ Calc Enhancement Wish List:
* Add read -once -try "filename" which would do nothing
if "filename" was not a readable file.
* Blocks should have the following features:
+ read/write to/from files (ala fread/fwrite)
+ misc memory functions (ala memcpy, memcmp, memset,
memchr, etc.)
+ scatter and gather functions (to send every n-th octet
to another block and to copy from n blocks, the 1st
then 2nd then 3rd ... octets)
* Printing of blocks should be under the control of the
config() interface. This should allow one to select
from any of the following formats:
+ as one long string
+ as a series of lines (< 80 chars wide)
+ in od command style (offset: value value value ...)
+ in hex dump style (offset: val val val val ... 3hf.Uas.c)
* In addition one should be able to control the following
aspects of printing blocks via the config() interface:
+ base (hex, octal, char, base 2)
+ amount of data (the first n octets or the entire block)
+ skipping printing of duplicate print lines (ala od)
+ have the ability to print the block as raw data

3
hist.c
View File

@@ -455,8 +455,9 @@ do_bind_line(KEY_MAP *map, char *line)
if (*cp == '?') {
key = 0177;
cp++;
} else
} else {
key = CONTROL(*cp++);
}
}
else if (key == '\\')
key = *cp++;

34
input.c
View File

@@ -12,6 +12,12 @@
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "have_unistd.h"
#if defined(HAVE_UNISTD_H)
#include <unistd.h>
#endif
#include "calc.h"
#include "conf.h"
#include "hist.h"
@@ -633,6 +639,9 @@ ttychar(void)
if (*cmd == '\0' || *cmd == '\n')
cmd = shell;
if (allow_exec) {
if (conf->calc_debug & CALCDBG_SYSTEM) {
printf("%s\n", cmd);
}
system(cmd);
} else {
fprintf(stderr, "execution disallowed by -m flag\n");
@@ -719,34 +728,35 @@ runrcfiles(void)
{
char path[MAX_CALCRC+1+1]; /* name being searched for */
char *cp;
char *newcp;
char *p;
int i;
/* execute each file in the list */
for (cp=calcrc, newcp=(char *)strchr(calcrc, LISTCHAR);
cp != NULL && *cp;
cp = newcp,
newcp=(newcp) ? (char *)strchr(newcp+1, LISTCHAR) : NULL) {
while (calcrc != NULL && *calcrc) {
cp = calcrc;
calcrc = (char *) strchr(calcrc + 1, LISTCHAR);
/* load file name into the path */
if (newcp == NULL) {
if (calcrc == NULL) {
strcpy(path, cp);
} else {
strncpy(path, cp, newcp-cp);
path[newcp-cp] = '\0';
strncpy(path, cp, calcrc - cp);
path[calcrc - cp] = '\0';
}
/* find the start of the path */
p = (path[0] == ':') ? path+1 : path;
p = (path[0] == ':') ? path + 1 : path;
if (p[0] == '\0') {
continue;
}
/* process the current file in the list */
i = openfile(p);
if (i < 0)
if (openfile(p) < 0) {
/* Unable to open rcfile */
if (c_flag && !d_flag)
fprintf(stderr,
"Unable to open rcfile \"%s\"\n", p);
continue;
}
getcommands(FALSE);
closeinput();
}

View File

@@ -50,37 +50,41 @@ version of read:
This will cause the needed library files to be read once. If these
files have already been read, the read -once will act as a noop.
By convention, the config parameter "lib_debug" is used to control
the verbosity of debug information printed by lib files. By default,
the "lib_debug" has a value of 0.
The "lib_debug" parameter is intended for controlling the possible
display of special information relating to functions, objects, and
other structures created by instructions in calc scripts.
Zero value of config("lib_debug") means that no such information
is displayed. For other values, the non-zero bits which currently
have meanings are as follows:
The "lib_debug" config parameter takes the place of the lib_debug
global variable. By convention, "lib_debug" has the following meanings:
n Meaning of bit n of config("lib_debug")
<-1 no debug messages are printed though some internal
debug actions and information may be collected
0 When a function is defined, redefined or undefined at
interactive level, a message saying what has been done
is displayed.
-1 no debug messages are printed, no debug actions will be taken
1 When a function is defined, redefined or undefined during
the reading of a file, a message saying what has been done
is displayed.
0 only usage message regarding each important object are
printed at the time of the read (default)
The value for config("lib_debug") in both oldstd and newstd is 3,
but if calc is invoked with the -d flag, its initial value is zero.
Thus, if calc is started without the -d flag, until config("lib_debug")
is changed, a message will be output when a function is defined
either interactively or during the reading of a file.
>0 messages regarding each important object are
printed at the time of the read in addition
to other debug messages
When config("lib_debug") >= 0, function names and their arg are
printed as they are defined. Sometimes this printing is not enough
information. For example:
Sometimes the information printed is not enough. In addition to the
standard information, one might want to print:
* useful obj definitions
* functions with optional args
* functions with optional args where the param() interface is used
For these cases we suggest that you place at the bottom of your code
something like:
something that prints extra information if config("lib_debug") has
either of the bottom 2 bits set:
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj xyz defined";
print "funcA([val1 [, val2]]) defined";
print "funcB(size, mass, ...) defined";

View File

@@ -174,7 +174,7 @@ define chrem()
}
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "chrem(r1,m1 [,r2,m2 ...]) defined";
print "chrem(rlist [,mlist]) defined";
}

View File

@@ -111,6 +111,6 @@ define fixdms(a)
a.deg %= 360;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj dms {deg, min, sec} defined";
}

View File

@@ -1027,7 +1027,7 @@ gen_v1(h, n)
define
ldebug(funct, str)
{
if (config("lib_debug") > 0) {
if (config("lib_debug") & 3) {
print "DEBUG:", funct:":", str;
}
return;

View File

@@ -331,7 +331,7 @@ lucas_chk(high_n, quiet)
/* skip primes where h>=2^n */
if (highbit(h_p[i]) >= n_p[i]) {
if (config("lib_debug") > 0) {
if (config("lib_debug") & 3) {
print "h>=2^n skip:", h_p[i]:"*2^":n_p[i]:"-1";
}
continue;

View File

@@ -152,7 +152,7 @@ d_val[97]=1045; a_val[97]=33; b_val[97]=1; r_val[97]=44;
d_val[99]=9797; a_val[99]=97; b_val[99]=1; r_val[99]=388;
d_val[100]= 51; a_val[100]= 7; b_val[100]=1; r_val[100]=2;
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "d_val[100] defined";
print "a_val[100] defined";
print "b_val[100] defined";

View File

@@ -312,6 +312,6 @@ define mfactor(n, start_k, rept_loop, p_elim)
return q;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "mfactor(n [, start_k=1 [, rept_loop=10000 [, p_elim=17]]])"
}

View File

@@ -189,7 +189,7 @@ define mod_pow(a, b)
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj mod {a} defined";
print "mod_value defined";
print "set mod_value as needed";

View File

@@ -687,6 +687,6 @@ a=pol(1,4,4,2,3,1);
b=pol(5,16,8,1);
c=pol(1+2i,3+4i,5+6i);
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj poly {p} defined";
}

View File

@@ -195,6 +195,6 @@ define quat_shift(a, b)
return x.s;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj quat {s, v} defined";
}

View File

@@ -122,6 +122,6 @@ define randrun(run_cnt)
printf("max length=%d\n", max_run);
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "randrun([run_length]) defined";
}

View File

@@ -28,8 +28,8 @@ 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", -4); /* disable lib startup messages */
initcfg = config("calc_debug", 1); /* enable more internal debugging */
initcfg = config("lib_debug", 0); /* disable lib startup messages */
initcfg = config("calc_debug", 0); /* disable internal debugging */
initcfg = config("all"); /* save state for later use */
print '003: parsed global definitions';
@@ -6861,7 +6861,7 @@ print '181: parsed test_ptr()';
*/
define test_newstring()
{
local A, B, C, D, S, p;
local A, B, C, D, S, p, q;
print '7700: Beginning test_newstring';
@@ -6953,7 +6953,14 @@ define test_newstring()
print '7762: setbit(A, 16, 0);';
vrfy(A == "A\255fdef", '7763: A == "A\255fdef"');
print '7764: Ending test_newstring';
q = "curds" " and " "whey";
print '7764: q = "curds" " and " "whey"';
vrfy(q == "curds and whey", '7765: q == "curds and whey"');
q = "chongo" ' was ' "here";
print '7766: q = "chongo" \' was \' "here"';
vrfy(q == "chongo was here", '7767: q == "chongo was here"');
print '7768: Ending test_newstring';
}
print '182: parsed test_newstring()';
@@ -7115,6 +7122,8 @@ print '188: parsed test_natnumset()';
*/
define test_somenew()
{
local a, s;
print '8200: Starting test_somenew';
vrfy(char(-1) == char(255), '8201: char(-1) == char(255)');
@@ -7139,7 +7148,13 @@ define test_somenew()
vrfy(1/(1/0) == 0, '8215: 1/(1/0) == 0');
vrfy(inverse(1/0) == 0, '8216: inverse(1/0) == 0');
print '8217: Ending test_somenew';
a = isqrt(2e1000); s = "xyz";
print '8217: a = isqrt(2e1000); s = "xyz";';
vrfy(hash(a,s) == 2378490456, '8218: hash(a,s) == 2378490456');
vrfy(hash("curds n whey") == 2376141927,
'8219: hash("curds n whey") == 2376141927');
print '8220: Ending test_somenew';
}
print '189: parsed test_somenew()';
@@ -7195,16 +7210,27 @@ print '1700: Beginning read test';
value = 0;
vrfy(value == 0, '1701: value == 0');
read "test1700";
vrfy(value == 1, '1702: value == 1');
read -once "test1700";
print '1702: read "test1700";';
vrfy(value == 1, '1703: value == 1');
read -once "test1700";
print '1704: read -once "test1700";';
vrfy(value == 1, '1705: value == 1');
read "test1700.cal";
vrfy(value == 2, '1704: value == 2');
print '1706: read "test1700.cal";';
vrfy(value == 2, '1707: value == 2');
read -once "test1700.cal";
vrfy(value == 2, '1705: value == 2');
print '1708: read -once "test1700.cal";';
vrfy(value == 2, '1709: value == 2');
read "test1700.cal";
vrfy(value == 3, '1706: value == 3');
print '1707: Ending read test';
print '1710: read "test1700.cal";';
vrfy(value == 3, '1711: value == 3');
{++value;} read "test1700.cal";
print '1712: {++value;} read "test1700.cal";';
vrfy(value == 5, '1713: value == 5');
{++value;} read -once "test1700.cal";
print '1714: {++value;} read -once "test1700.cal";';
vrfy(value == 6, '1715: value == 6');
print '1716: Ending read test';
print;
return test_obj();
@@ -7279,6 +7305,9 @@ print;
return test_size();
print;
/*
* 5800 assignment tests
*/
return test_assign(5800, 1);
define xy5800_assign(a,b) { };
print '5812: define xy5800_assign(a,b) { }';
@@ -7323,7 +7352,7 @@ X5800 = obj xy5800 = {1,2};
print '5864: X5800 = obj xy5800 = {1,2}';
vrfy(X5800 == (obj xy5800 = {1,2}),
'5865: X5800 == (obj xy5800 = {1,2})');
print '5899: End of 5800 sequence';
print '5866: End of 5800 sequence';
print;
return test_is();
@@ -7407,7 +7436,10 @@ print '8304: define h8300(x)=x^3;define i8300(x)=x-1;define j8300(x)=x+1;';
vrfy(h8300(10) == 1000, '8305: h8300(10) == 1000');
vrfy(i8300(10) == 9, '8306: i8300(10) == 9');
vrfy(j8300(10) == 11, '8307: j8300(10) == 11');
print '8308: Ending define tests';
{static k8300 = 5} define l8300(x) = k8300 + x;
print '8308: {static k8300 = 5} define l8300(x) = k8300 + x;';
vrfy(l8300(10) == 15, '8309: l8300(10) == 15');
print '8310: Ending define tests';
/*

View File

@@ -113,7 +113,7 @@ define seedrandom(seed1, seed2, size, trials)
p = 2*fp+1;
} while (ptest(p,1,0) == 0);
} while(ptest(p, trials) == 0 || ptest(fp, trials) == 0);
if (config("lib_debug") > 0) {
if (config("lib_debug") & 3) {
print "/* 1st Blum prime */ p=", p;
}
@@ -127,7 +127,7 @@ define seedrandom(seed1, seed2, size, trials)
q = 2*fq+1;
} while (ptest(q,1,0) == 0);
} while(ptest(q, trials) == 0 || ptest(fq, trials) == 0);
if (config("lib_debug") > 0) {
if (config("lib_debug") & 3) {
print "/* 2nd Blum prime */ q=", q;
}
@@ -137,7 +137,7 @@ define seedrandom(seed1, seed2, size, trials)
n = p*q; /* the Blum modulus */
binsize = highbit(n)+1; /* smallest power of 2 > p*q */
r = pmod(rand(1<<ceil(binsize*4/5), 1<<(binsize-2)), 2, n);
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "/* seed quadratic residue */ r=", r;
print "/* newn", binsize, "bit quadratic residue*/ newn=", n;
}
@@ -154,6 +154,6 @@ define seedrandom(seed1, seed2, size, trials)
return old_state;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "seedrandom(seed1, seed2, size [, trials]) defined";
}

View File

@@ -261,7 +261,7 @@ define surd_rel(a, b)
return sgn(x^2 - y^2 * surd_type) * sgn(x);
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "obj surd {a, b} defined";
print "surd_type defined";
print "set surd_type as needed";

View File

@@ -23,6 +23,6 @@ define sc()
return s;
}
if (config("lib_debug") >= 0) {
if (config("lib_debug") & 3) {
print "sc(a, b, ...) defined";
}

View File

@@ -1213,8 +1213,9 @@ matcopy(MATRIX *m)
if (v1->v_type == V_NUM) {
v2->v_type = V_NUM;
v2->v_num = qlink(v1->v_num);
} else
} else {
copyvalue(v1, v2);
}
v1++;
v2++;
}

2
md5.c
View File

@@ -656,7 +656,7 @@ MD5_print(HASH *state)
/*
* form the hash value
*/
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_HASH_STATE) {
char buf[DEBUG_SIZE+1]; /* hash value buffer */
/*

6
obj.c
View File

@@ -640,8 +640,9 @@ objfree(OBJECT *op)
for (i = op->o_actions->count; i-- > 0; vp++) {
if (vp->v_type == V_NUM) {
qfree(vp->v_num);
} else
} else {
freevalue(vp);
}
}
if (op->o_actions->count <= USUAL_ELEMENTS)
free(op);
@@ -678,8 +679,9 @@ objcopy(OBJECT *op)
if (v1->v_type == V_NUM) {
v2->v_num = qlink(v1->v_num);
v2->v_type = V_NUM;
} else
} else {
copyvalue(v1, v2);
}
v2->v_subtype = V_NOSUBTYPE;
}
return np;

View File

@@ -2065,9 +2065,9 @@ o_isdefined(void)
}
r = 0;
index = getbuiltinfunc(vp->v_str->s_str);
if (index >= 0)
if (index >= 0) {
r = 1;
else {
} else {
index = getuserfunc(vp->v_str->s_str);
if (index >= 0)
r = 2;
@@ -3697,7 +3697,7 @@ calculate(FUNC *fp, int argcount)
freevalue(&locals[i]);
if (locals != localtable)
free(locals);
if (conf->calc_debug & 2)
if (conf->calc_debug & CALCDBG_FUNC_QUIT)
printf("\t\"%s\": line %ld\n", funcname, funcline);
while (stack > beginstack)
freevalue(stack--);

13
poly.c
View File

@@ -31,20 +31,17 @@ evp(LISTELEM *cp, LISTELEM *x, VALUE *vres)
freevalue(&tmp1);
freevalue(vres);
*vres = tmp2;
}
else {
} else {
s = TRUE;
*vres = tmp1;
}
}
}
else {
} else {
if (s) {
addvalue(&v, vres, &tmp1);
freevalue(vres);
*vres = tmp1;
}
else {
} else {
s = TRUE;
copyvalue(&v, vres);
}
@@ -126,9 +123,9 @@ addlistinv(LIST *lp, VALUE *vres)
VALUE tmp1, tmp2;
for (ep = lp->l_first; ep; ep = ep->e_next) {
if (ep->e_value.v_type == V_LIST)
if (ep->e_value.v_type == V_LIST) {
addlistinv(ep->e_value.v_list, vres);
else {
} else {
invertvalue(&ep->e_value, &tmp1);
addvalue(vres, &tmp1, &tmp2);
freevalue(&tmp1);

View File

@@ -1156,9 +1156,9 @@ qcfappr(NUMBER *q, NUMBER *epsilon, long rnd)
s = -s;
}
if (bnddencase) {
if (s > 0)
if (s > 0) {
useold = TRUE;
else {
} else {
zsub(zden, denbnd, &tmp1);
zquo(tmp1, oldden, &k, 1);
zfree(tmp1);

3
qio.c
View File

@@ -413,8 +413,9 @@ qprintfd(NUMBER *q, long width)
zquo(q->num, q->den, &z, conf->outround);
zprintval(z, 0L, width);
zfree(z);
} else
} else {
zprintval(q->num, 0L, width);
}
}

12
qmod.c
View File

@@ -116,15 +116,13 @@ qquomod(NUMBER *q1, NUMBER *q2, NUMBER **retqdiv, NUMBER **retqmod)
zfree(tmp2);
qq = qlink(&_qzero_);
qm = qlink(q1);
}
else {
} else {
qq = qalloc();
qq->num = tmp1;
if (ziszero(tmp2)) {
zfree(tmp2);
qm = qlink(&_qzero_);
}
else {
} else {
qm = qalloc();
qm->num = tmp2;
}
@@ -141,15 +139,13 @@ qquomod(NUMBER *q1, NUMBER *q2, NUMBER **retqdiv, NUMBER **retqmod)
zfree(tmp4);
qq = qlink(&_qzero_);
qm = qlink(q1);
}
else {
} else {
qq = qalloc();
qq->num = tmp3;
if (ziszero(tmp4)) {
zfree(tmp4);
qm = qlink(&_qzero_);
}
else {
} else {
qm = qalloc();
zmul(q1->den, q2->den, &tmp1);
zreduce(tmp4, tmp1, &qm->num, &qm->den);

View File

@@ -1022,8 +1022,7 @@ qpower(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
tmp1 = itoq(m);
tmp2 = qmul(tmp1, q2tmp);
m = qtoi(tmp2);
}
else {
} else {
tmp1 = qdec(q1tmp);
tmp2 = qqdiv(tmp1, q1tmp);
qfree(tmp1);
@@ -1038,8 +1037,7 @@ qpower(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
tmp1 = itoq(m + 1);
tmp2 = qmul(tmp1, q2tmp);
m = qtoi(tmp2);
}
else {
} else {
tmp1 = qdec(q1tmp);
tmp2 = qmul(tmp1, q2tmp);
qfree(tmp1);

View File

@@ -79,22 +79,29 @@ static QCKHASH blk_hash(BLOCK *blk, QCKHASH val);
/*
* fnv - compute the next Fowler/Noll/Vo hash given a variable
* FNV-0 - Fowler/Noll/Vo-0 32 bit hash
*
* The basis of the hash algorithm was taken from an idea
* sent by Email to the IEEE Posix P1003.2 mailing list from
* Phong Vo (kpv@research.att.com) and Glenn Fowler (gsf@research.att.com).
* Landon Curt Noll (http://reality.sgi.com/chongo) later improved on there
* algorithm to come up with Fowler/Noll/Vo hash.
* The basis of this hash algorithm was taken from an idea sent
* as reviewer comments to the IEEE POSIX P1003.2 committee by:
*
* The magic lies in the constant 16777619, which for 32 bit hashing
* is able to process 234936 words from the web2 dictionary without
* any collisions.
* Phong Vo (http://www.research.att.com/info/kpv)
* Glenn Fowler (http://www.research.att.com/~gsf/)
*
* See:
* http://reality.sgi.com/chongo/src/fnv/fnv_hash.tar.gz
* http://reality.sgi.com/chongo/src/fnv/h32.c
* http://reality.sgi.com/chongo/src/fnv/h64.c
* In a subsequent ballot round:
*
* Landon Curt Noll (http://reality.sgi.com/chongo)
*
* improved on their algorithm. Some people tried this hash
* and found that it worked rather well. In an EMail message
* to Landon, they named it ``Fowler/Noll/Vo'' or the FNV hash.
*
* FNV hashes are architected to be fast while maintaining a low
* collision rate. The FNV speed allows one to quickly hash lots
* of data while maintaining a reasonable collision rate. See:
*
* http://reality.sgi.com/chongo/tech/comp/fnv/
*
* for more details as well as other forms of the FNV hash.
*
* given:
* x the value to hash (must not be longer than 32 bits)

View File

@@ -402,9 +402,13 @@ depend:
else \
rm -f Makefile.tmp; \
mv Makefile Makefile.tmp; \
sccs edit Makefile; \
if [ -d RCS ]; then; \
co -l Makefile; \
fi; \
mv Makefile.tmp Makefile; \
echo new 'sample Makefile formed -- you need to check it in'; \
if [ -d RCS ]; then; \
echo new sample Makefile formed, you need to check it in; \
fi; \
fi
##

153
seed.c
View File

@@ -65,6 +65,12 @@
#endif /* __linux */
#include "qmath.h"
#include "longbits.h"
#include "have_ustat.h"
#include "have_getsid.h"
#include "have_getpgid.h"
#include "have_gettime.h"
#include "have_getprid.h"
#include "have_urandom.h"
/*
@@ -81,7 +87,51 @@ typedef struct s_hash64 hash64;
/*
* hash_buf - perform a 64 bit Fowler/Noll/Vo hash on a buffer
* FNV-1 initial basis
*
* We start the hash at a non-zero value at the beginning so that
* hashing blocks of data with all 0 bits do not map onto the same
* 0 hash value. The virgin value that we use below is the hash value
* that we would get from following 32 ASCII characters:
*
* chongo <Landon Curt Noll> /\../\
*
* Note that the \'s above are not back-slashing escape characters.
* They are literal ASCII backslash 0x5c characters.
*
* The effect of this virgin initial value is the same as starting
* with 0 and pre-pending those 32 characters onto the data being
* hashed.
*
* Yes, even with this non-zero virgin value there is a set of data
* that will result in a zero hash value. Worse, appending any
* about of zero bytes will continue to produce a zero hash value.
* But that would happen with any initial value so long as the
* hash of the initial was the `inverse' of the virgin prefix string.
*
* But then again for any hash function, there exists sets of data
* which that the hash of every member is the same value. That is
* life with many to few mapping functions. All we do here is to
* prevent sets whose members consist of 0 or more bytes of 0's from
* being such an awkward set.
*
* And yes, someone can figure out what the magic 'inverse' of the
* 32 ASCII character are ... but this hash function is NOT intended
* to be a cryptographic hash function, just a fast and reasonably
* good hash function.
*/
#if defined(HAVE_B64)
# define FNV1_64_BASIS ((hash64)(0xcbf29ce484222325ULL))
#else
# define FNV1_64_BASIS_0 ((USB32)0x2325)
# define FNV1_64_BASIS_1 ((USB32)0x8422)
# define FNV1_64_BASIS_2 ((USB32)0x9ce4)
# define FNV1_64_BASIS_3 ((USB32)0xcbf2)
#endif
/*
* hash_buf - perform a Fowler/Noll/Vo-1 64 bit hash
*
* input:
* buf - start of buffer to hash
@@ -102,32 +152,33 @@ hash_buf(char *buf, unsigned len)
char *buf_end = buf+len; /* beyond end of hash area */
/*
* Fowler/Noll/Vo hash - hash each character in the string
* FNV-1 - Fowler/Noll/Vo-1 64 bit hash
*
* The basis of the hash algorithm was taken from an idea
* sent by Email to the IEEE POSIX P1003.2 mailing list from
* Phong Vo (kpv@research.att.com) and Glenn Fowler
* (gsf@research.att.com).
*
* See:
* http://reality.sgi.com/chongo/src/fnv/fnv_hash.tar.gz
* http://reality.sgi.com/chongo/src/fnv/h32.c
* http://reality.sgi.com/chongo/src/fnv/h64.c
*
* for information on 32bit and 64bit Fowler/Noll/Vo hashes.
*
* Landon Curt Noll (http://reality.sgi.com/chongo) later improved
* on their algorithm to come up with Fowler/Noll/Vo hash.
*
* The 32 hash was able to process 234936 words from the web2 dictionary
* without any 32 bit collisions using a constant of
* 16777619 = 0x1000193.
*
* The 64 bit hash uses 1099511628211 = 0x100000001b3 instead.
* The basis of this hash algorithm was taken from an idea sent
* as reviewer comments to the IEEE POSIX P1003.2 committee by:
*
* Phong Vo (http://www.research.att.com/info/kpv)
* Glenn Fowler (http://www.research.att.com/~gsf/)
*
* In a subsequent ballot round:
*
* Landon Curt Noll (http://reality.sgi.com/chongo)
*
* improved on their algorithm. Some people tried this hash
* and found that it worked rather well. In an EMail message
* to Landon, they named it ``Fowler/Noll/Vo'' or the FNV hash.
*
* FNV hashes are architected to be fast while maintaining a low
* collision rate. The FNV speed allows one to quickly hash lots
* of data while maintaining a reasonable collision rate. See:
*
* http://reality.sgi.com/chongo/tech/comp/fnv/
*
* for more details as well as other forms of the FNV hash.
*/
#if defined(HAVE_B64)
/* hash each octet of the buffer */
for (hval = (hash64)0ULL; buf < buf_end; ++buf) {
for (hval = FNV1_64_BASIS; buf < buf_end; ++buf) {
/* multiply by 1099511628211ULL mod 2^64 using 64 bit longs */
hval *= (hash64)1099511628211ULL;
@@ -139,7 +190,11 @@ hash_buf(char *buf, unsigned len)
#else /* HAVE_B64 */
/* hash each octet of the buffer */
for (val[0]=val[1]=val[2]=val[3]=0; buf < buf_end; ++buf) {
val[0] = FNV1_64_BASIS_0;
val[1] = FNV1_64_BASIS_1;
val[2] = FNV1_64_BASIS_2;
val[3] = FNV1_64_BASIS_3;
for (; buf < buf_end; ++buf) {
/*
* multiply by 1099511628211 mod 2^64 using 32 bit longs
@@ -161,7 +216,7 @@ hash_buf(char *buf, unsigned len)
val[0] = tmp[0] & 0xffff;
tmp[2] += (tmp[1] >> 16);
val[1] = tmp[1] & 0xffff;
val[3] += (tmp[2] >> 16);
val[3] = tmp[3] + (tmp[2] >> 16);
val[2] = tmp[2] & 0xffff;
/*
* Doing a val[3] &= 0xffff; is not really needed since it simply
@@ -208,16 +263,22 @@ NUMBER *
pseudo_seed(void)
{
struct { /* data used for quasi-random seed */
#if defined(__sgi)
#if defined(HAVE_GETTIME)
# if defined(CLOCK_SGI_CYCLE)
struct timespec sgi_cycle; /* SGI hardware clock */
prid_t getprid; /* project ID */
# endif /* CLOCK_SGI_CYCLE */
# if defined(CLOCK_REALTIME)
struct timespec realtime; /* POSIX realtime clock */
#endif /* __sgi */
#if defined(__linux)
# endif /* CLOCK_REALTIME */
#endif /* HAVE_GETTIME */
#if defined(HAVE_GETPRID)
prid_t getprid; /* project ID */
#endif /* HAVE_GETPRID */
#if defined(HAVE_URANDOM)
int urandom_fd; /* open scriptor for /dev/urandom */
int urandom_ret; /* read() of /dev/random */
char urandom_pool[DEV_URANDOM_POOL]; /* /dev/urandom data pool */
#endif /* __linux */
#endif /* HAVE_URANDOM */
struct timeval tp; /* time of day */
pid_t getpid; /* process ID */
pid_t getppid; /* parent process ID */
@@ -232,7 +293,7 @@ pseudo_seed(void)
struct stat fstat_stdin; /* stat of stdin */
struct stat fstat_stdout; /* stat of stdout */
struct stat fstat_stderr; /* stat of stderr */
#if !defined(__bsdi)
#if defined(HAVE_USTAT)
struct ustat ustat_dot; /* usage stat of "." */
struct ustat ustat_dotdot; /* usage stat of ".." */
struct ustat ustat_tmp; /* usage stat of "/tmp" */
@@ -240,9 +301,13 @@ pseudo_seed(void)
struct ustat ustat_stdin; /* usage stat of stdin */
struct ustat ustat_stdout; /* usage stat of stdout */
struct ustat ustat_stderr; /* usage stat of stderr */
#endif /* HAVE_USTAT */
#if defined(HAVE_GETSID)
pid_t getsid; /* session ID */
#endif /* HAVE_GETSID */
#if defined(HAVE_GETPGID)
pid_t getpgid; /* process group ID */
#endif /* __bsdi */
#endif /* HAVE_GETPGID */
struct rusage rusage; /* resource utilization */
struct rusage rusage_chld; /* resource utilization of children */
struct timeval tp2; /* time of day again */
@@ -261,12 +326,18 @@ pseudo_seed(void)
* We do care (that much) if these calls fail. We do not
* need to process any data in the 'sdata' structure.
*/
#if defined(__sgi)
#if defined(HAVE_GETTIME)
# if defined(CLOCK_SGI_CYCLE)
(void) clock_gettime(CLOCK_SGI_CYCLE, &sdata.sgi_cycle);
sdata.getprid = getprid();
# endif /* CLOCK_SGI_CYCLE */
# if defined(CLOCK_REALTIME)
(void) clock_gettime(CLOCK_REALTIME, &sdata.realtime);
#endif /* __sgi */
#if defined(__linux)
# endif /* CLOCK_REALTIME */
#endif /* HAVE_GETTIME */
#if defined(HAVE_GETPRID)
sdata.getprid = getprid();
#endif /* HAVE_GETPRID */
#if defined(HAVE_URANDOM)
sdata.urandom_fd = open(DEV_URANDOM, O_NONBLOCK|O_RDONLY);
if (sdata.urandom_fd >= 0) {
sdata.urandom_ret = read(sdata.urandom_fd,
@@ -276,7 +347,7 @@ pseudo_seed(void)
memset(&sdata.urandom_pool, EOF, DEV_URANDOM_POOL);
sdata.urandom_ret = EOF;
}
#endif /* __linux */
#endif /* HAVE_URANDOM */
(void) gettimeofday(&sdata.tp, NULL);
sdata.getpid = getpid();
sdata.getppid = getppid();
@@ -291,7 +362,7 @@ pseudo_seed(void)
(void) fstat(0, &sdata.fstat_stdin);
(void) fstat(1, &sdata.fstat_stdout);
(void) fstat(2, &sdata.fstat_stderr);
#if !defined(__bsdi)
#if defined(HAVE_USTAT)
(void) ustat(sdata.stat_dotdot.st_dev, &sdata.ustat_dotdot);
(void) ustat(sdata.stat_dot.st_dev, &sdata.ustat_dot);
(void) ustat(sdata.stat_tmp.st_dev, &sdata.ustat_tmp);
@@ -299,9 +370,13 @@ pseudo_seed(void)
(void) ustat(sdata.fstat_stdin.st_dev, &sdata.ustat_stdin);
(void) ustat(sdata.fstat_stdout.st_dev, &sdata.ustat_stdout);
(void) ustat(sdata.fstat_stderr.st_dev, &sdata.ustat_stderr);
#endif /* HAVE_USTAT */
#if defined(HAVE_GETSID)
sdata.getsid = getsid((pid_t)0);
#endif /* HAVE_GETSID */
#if defined(HAVE_GETPGID)
sdata.getpgid = getpgid((pid_t)0);
#endif /* __bsdi */
#endif /* HAVE_GETPGID */
(void) getrusage(RUSAGE_SELF, &sdata.rusage);
(void) getrusage(RUSAGE_CHILDREN, &sdata.rusage_chld);
(void) gettimeofday(&sdata.tp2, NULL);

2
shs.c
View File

@@ -696,7 +696,7 @@ shs_print(HASH *state)
/*
* form the hash value
*/
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_HASH_STATE) {
char buf[DEBUG_SIZE+1]; /* hash value buffer */
/*

2
shs1.c
View File

@@ -672,7 +672,7 @@ shs1_print(HASH *state)
/*
* form the hash value
*/
if (conf->calc_debug > 0) {
if (conf->calc_debug & CALCDBG_HASH_STATE) {
char buf[DEBUG_SIZE+1]; /* hash value buffer */
/*

View File

@@ -1157,8 +1157,7 @@ addstring(char *str, long len)
if (stringconstavail <= 0) {
if (stringconsttable == NULL) {
initstrings();
}
else {
} else {
sp = (STRING **) realloc((char *) stringconsttable,
sizeof(STRING *) * (stringconstcount + STRCONSTALLOC));
if (sp == NULL) {

12
token.c
View File

@@ -438,6 +438,18 @@ eatstring(int quotechar)
case '"':
case '\'':
if (ch == quotechar) {
for (;;) {
ch = nextchar();
if (ch != ' ' && ch != '\t' &&
(ch != '\n' ||
newlines))
break;
}
if (ch == '"' || ch == '\'') {
quotechar = ch;
continue;
}
reread();
done = TRUE;
ch = '\0';
}

View File

@@ -894,15 +894,17 @@ xorvalue(VALUE *v1, VALUE *v2, VALUE *vres)
if (v1->v_str->s_len) {
vres->v_str = stringcopy(v1->v_str);
*vres->v_str->s_str ^= *v2->v_octet;
} else
} else {
vres->v_str = charstring(*v2->v_octet);
}
return;
case (TWOVAL(V_OCTET, V_STR)):
if (v2->v_str->s_len) {
vres->v_str = stringcopy(v2->v_str);
*vres->v_str->s_str ^= *v1->v_octet;
} else
} else {
vres->v_str = charstring(*v1->v_octet);
}
return;
case (TWOVAL(V_OCTET, V_OCTET)):
vres->v_type = V_STR;

View File

@@ -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 "8" /* test number or empty string if no patch */
#define MINOR_PATCH "8.5" /* test number or empty string if no patch */
/*
* calc version constants

33
zfunc.c
View File

@@ -269,8 +269,9 @@ zfib(ZVALUE z, ZVALUE *res)
fnm1 = fn;
fn = fnp1;
zadd(fnm1, fn, &fnp1);
} else
} else {
zsub(fnp1, fn, &fnm1);
}
i >>= (FULL)1;
}
zfree(fnm1);
@@ -889,8 +890,7 @@ zgcd(ZVALUE z1, ZVALUE z2, ZVALUE *res)
*a = ~*a;
}
}
}
else { /* abs(a - b) case */
} else { /* abs(a - b) case */
while (i && *a++ == *b++) i--;
q = n - i;
if (m == n) { /* a and b same length */
@@ -914,8 +914,7 @@ zgcd(ZVALUE z1, ZVALUE z2, ZVALUE *res)
f = -f & BASE1;
}
}
}
else { /* a has more digits than b */
} else { /* a has more digits than b */
a = a0 + q;
b = b0 + q;
i = n - q;
@@ -1117,8 +1116,9 @@ zlog(ZVALUE z1, ZVALUE z2)
zfree(val);
val = temp;
power += worth;
} else
} else {
zfree(temp);
}
}
if (zp != squares)
zfree(*zp);
@@ -1170,8 +1170,9 @@ zlog10(ZVALUE z)
zfree(val);
val = temp;
power += worth;
} else
} else {
zfree(temp);
}
}
}
zfree(val);
@@ -1574,8 +1575,7 @@ zsqrt(ZVALUE z, ZVALUE *dest, long rnd)
x = ~x + !u;
if (!(x & TOPHALF))
a[1] -= 1;
}
else {
} else {
f = *a - x * x;
*a++ = (HALF)f;
u = -(HALF)(f >> BASEB);
@@ -1623,9 +1623,9 @@ done: if (s == 0) {
}
if (rnd & 16) {
if (s == 0) {
if (m != n)
if (m != n) {
up = (m > n);
else {
} else {
i = n;
b = a0 + n;
a = A + n;
@@ -1633,13 +1633,12 @@ done: if (s == 0) {
i--;
up = (i > 0 && *a > *b);
}
}
else {
} else {
while (m > 1 && A[m - 1] == BASE1)
m--;
if (m != n)
if (m != n) {
up = (m < n);
else {
} else {
i = n;
b = a0 + n;
a = A + n;
@@ -1660,9 +1659,9 @@ done: if (s == 0) {
a = a0;
while (i-- && *a == BASE1)
*a++ = 0;
if (i >= 0)
if (i >= 0) {
(*a)++;
else {
} else {
n++;
*a = 1;
}

17
zmath.c
View File

@@ -687,8 +687,7 @@ zdiv(ZVALUE z1, ZVALUE z2, ZVALUE *quo, ZVALUE *rem, long rnd)
}
s = *a + u;
A[m] = (HALF) (~x + !s);
}
else {
} else {
while (i--) {
f = (FULL) *a - u - x * *b++;
*a++ = (HALF) f;
@@ -708,9 +707,9 @@ done: while (m > 0 && A[m - 1] == 0)
val = 0;
if (a1[len - 1] == 0)
len--;
if (len == 0)
if (len == 0) {
*quo = _zero_;
else {
} else {
quo->len = len;
quo->v = alloc(len);
memcpy(quo->v, a1, len * sizeof(HALF));
@@ -746,8 +745,7 @@ done: while (m > 0 && A[m - 1] == 0)
}
else if (g >= BASE)
t = 1;
}
else {
} else {
while (--i > 0) {
g = (FULL) *--a - (*--b >> 1 | f);
if (g != 0)
@@ -973,9 +971,9 @@ zequo(ZVALUE z1, ZVALUE z2, ZVALUE *res)
*a0++ = x;
p--;
}
if (k == 0)
if (k == 0) {
*a0 = w * *a0;
else {
} else {
u = (HALF)(w * *a0) >> k;
x = (HALF)(((FULL) z1.v[z1.len - 1] << BASEB
| z1.v[z1.len - 2])
@@ -1890,8 +1888,9 @@ zshiftl(ZVALUE z, long n)
if (i > BASE1) {
mask = i >> BASEB;
i &= BASE1;
} else
} else {
mask = 0;
}
*h = (HALF) i;
++h;
}

37
zmath.h
View File

@@ -144,6 +144,43 @@ typedef SB32 LEN; /* unit of length storage */
#endif /* LONG_BITS == 64 */
/*
* FNV-1 basis
*
* We start the hash at a non-zero value at the beginning so that
* hashing blocks of data with all 0 bits do not map onto the same
* 0 hash value. The virgin value that we use below is the hash value
* that we would get from following 32 ASCII characters:
*
* chongo <Landon Curt Noll> /\../\
*
* Note that the \'s above are not back-slashing escape characters.
* They are literal ASCII backslash 0x5c characters.
*
* The effect of this virgin initial value is the same as starting
* with 0 and pre-pending those 32 characters onto the data being
* hashed.
*
* Yes, even with this non-zero virgin value there is a set of data
* that will result in a zero hash value. Worse, appending any
* about of zero bytes will continue to produce a zero hash value.
* But that would happen with any initial value so long as the
* hash of the initial was the `inverse' of the virgin prefix string.
*
* But then again for any hash function, there exists sets of data
* which that the hash of every member is the same value. That is
* life with many to few mapping functions. All we do here is to
* prevent sets whose members consist of 0 or more bytes of 0's from
* being such an awkward set.
*
* And yes, someone can figure out what the magic 'inverse' of the
* 32 ASCII character are ... but this hash function is NOT intended
* to be a cryptographic hash function, just a fast and reasonably
* good hash function.
*/
#define FNV1_32_BASIS ((QCKHASH)(0x811c9dc5))
/*
* The largest power of 10 we will compute for our decimal conversion
* internal constants is: 10^(2^TEN_MAX).

3
zmod.c
View File

@@ -1746,8 +1746,7 @@ zredcsquare(REDC *rp, ZVALUE z1, ZVALUE *res)
carry.ivalue = (FULL) sival1.sihigh
+ (FULL) sival2.sihigh;
hd++;
}
else {
} else {
muln = (HALF) (*hd * Ninv);
f = (muln * ((FULL) *h3++) + (FULL) *hd++) >> BASEB;
j = i;