mirror of
https://github.com/lcn2/calc.git
synced 2025-08-22 01:23:28 +03:00
Compare commits
31 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
229345ade8 | ||
|
0f902b95cf | ||
|
8684e1be9c | ||
|
ae3a6129b2 | ||
|
2c72570b8d | ||
|
41803b878e | ||
|
a8be58becb | ||
|
067afc140a | ||
|
41128fada9 | ||
|
f5fae012f9 | ||
|
3d25fb30cb | ||
|
8374586275 | ||
|
68c2edf610 | ||
|
d58a55a1ed | ||
|
ccfa797b68 | ||
|
0f030f0759 | ||
|
af59b9dab2 | ||
|
fa173cd9aa | ||
|
1f8269c0e2 | ||
|
51462b8612 | ||
|
9b69648921 | ||
|
c5e416c41f | ||
|
37ad43c7fd | ||
|
a877cb52c0 | ||
|
4bec694df3 | ||
|
4870a7a164 | ||
|
84ccb37bc3 | ||
|
29c6e9325f | ||
|
81a4a4f828 | ||
|
1cdb5172d8 | ||
|
54a7a3f7bc |
48
BUGS
48
BUGS
@@ -80,6 +80,54 @@ Known bugs:
|
||||
The output of the alg_config.cal resource file is bogus.
|
||||
We would welcome a replacement for this code.
|
||||
|
||||
Calc shell scripts do not read from stdin properly,
|
||||
we all as a number of the cscript examples.
|
||||
|
||||
The argv() function is behaving differently
|
||||
when run in calc shell script mode:
|
||||
|
||||
When calc is run as:
|
||||
|
||||
calc -s a bb ccc
|
||||
|
||||
and given this input on the command prompt:
|
||||
|
||||
print "config(\"program\")=", config("program");
|
||||
print "argv()=", argv();
|
||||
argc = argv();
|
||||
for (i=0; i < argc; ++i) {
|
||||
print "argv(":i:")=", argv(i);
|
||||
}
|
||||
|
||||
calc prints:
|
||||
|
||||
config("program")= calc
|
||||
argv()= 3
|
||||
argv(0)= a
|
||||
argv(1)= bb
|
||||
argv(2)= ccc
|
||||
|
||||
but when it is run as a script called ./simple:
|
||||
|
||||
#!/usr/local/bin/calc -q -s -f
|
||||
print "config(\"program\")=", config("program");
|
||||
print "argv()=", argv();
|
||||
argc = argv();
|
||||
for (i=0; i < argc; ++i) {
|
||||
print "argv(":i:")=", argv(i);
|
||||
}
|
||||
|
||||
under Linux prints:
|
||||
|
||||
config("program")= /usr/bin/calc
|
||||
argv()= 4
|
||||
argv(0)= ./simple
|
||||
argv(1)= a
|
||||
argv(2)= bb
|
||||
argv(3)= ccc
|
||||
|
||||
and under macOS simply enters into interactive mode.
|
||||
|
||||
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.
|
||||
|
120
CHANGES
120
CHANGES
@@ -1,4 +1,117 @@
|
||||
The following are the changes from calc version 2.12.6.9 to date:
|
||||
The following are the changes from calc version 2.12.7.1 to date:
|
||||
|
||||
Corrected CHANGES notes that were mixed up for TAB, VT, CR &
|
||||
NL. The code in 2.12.7.0 is correct. The CHANGE notes should
|
||||
have read:
|
||||
|
||||
The following is a partial list of escape sequences recognized
|
||||
in strings and in printf formats:
|
||||
|
||||
\a audible bell byte 0x07 in ASCII encoding
|
||||
\b backspace byte 0x08 in ASCII encoding
|
||||
\f form feed byte 0x0c in ASCII encoding
|
||||
\n newline byte 0x0a in ASCII encoding
|
||||
\r return byte 0x0d in ASCII encoding
|
||||
\t tab byte 0x09 in ASCII encoding
|
||||
\v vertical tab byte 0x0b in ASCII encoding
|
||||
|
||||
Fixed a segfault when getpwuid() returned NULL during initialization.
|
||||
Thanks goes to baratharon GitHub user for reporting this issue.
|
||||
|
||||
Requiring calc shell scripts to use -s -f at the end of the
|
||||
initial #! line.
|
||||
|
||||
Fixed /tmp/mersenne example in calc(1) man page.
|
||||
|
||||
Added make variable ${ARCH_CFLAGS}. The ${ARCH_CFLAGS} is
|
||||
added after ${CCMISC} and before ${EXTRA_CFLAGS} when building
|
||||
the ${CFLAGS} for compiling C code. are ${CC} when compiling
|
||||
C files. The default value is:
|
||||
|
||||
ARCH_CFLAGS= -march=native
|
||||
|
||||
which directs C compiler to compile for the native machine.
|
||||
To disable use of '-march=native', set ARCH_CFLAGS to the empty
|
||||
string as in:
|
||||
|
||||
make all ARCH_CFLAGS=
|
||||
|
||||
To make calc RPMs more portable, they are compiled with an
|
||||
empty ARCH_CFLAGS.
|
||||
|
||||
Fixed issues relating to compiling on macOS. Fixed issues
|
||||
where <unistd.h> is needed.
|
||||
|
||||
Fixed typos in help/intro and README.md. <<GitHub guilhermgonzaga>>
|
||||
|
||||
Copied missing description lines from help/intro to README.md
|
||||
"What is calc?" section. <<GitHub guilhermgonzaga>>
|
||||
|
||||
GCC 7 added a warning on fall throughs in case statements. It's
|
||||
enabled by -Wextra and treated as an error due to -Wall so it
|
||||
breaks compilation. See -Wimplicit-fallthrough in the GCC
|
||||
manual. The default value is 3, which means a comment matching
|
||||
some specific regexes is enough to disable the warning.
|
||||
Fixed spaces vs tabs and use FALLTHRU as it's used elsewhere.
|
||||
Fixed one FALLTHRU comment that was inconsistent with others.
|
||||
<<thanks jcul>>
|
||||
|
||||
Fixed minor typo on help/power. <<GitHub thegithubr>>
|
||||
|
||||
By default, the calc history file is located in ~/.calc_history.
|
||||
Now, if the environment variable $CALCHISTFILE is defined
|
||||
and is non-empty, then calc history file will be defined
|
||||
by the $CALCHISTFILE environment variable.
|
||||
|
||||
Calc as defined 0^0 as 1. However in the past, 0 raised to
|
||||
an expression that evaluted to zero returned 1. The result
|
||||
was that 0^0 was different than 0^(6-6) or even 0^(0).
|
||||
Now, calc will return 1 for 0^(0) and 0^zero when zero == 0.
|
||||
|
||||
The missing cscript/square.calc file has been restored.
|
||||
|
||||
|
||||
The following are the changes from calc version 2.12.6.10: to 2.12.7.0:
|
||||
|
||||
Added a patch to replaces the manual search for include files
|
||||
in $(INCDIR) in the have_*.h targets with compiler invocations.
|
||||
Thanks goes to Helmut Grohne (helmut at subdivi dot de) who
|
||||
implemented the patch and posted it to the Debian bug tracker
|
||||
and Martin Buck (m at rtin-buck dor de) for forwarding it to us.
|
||||
|
||||
The check_include make rule was fixed to not assume /usr/include.
|
||||
|
||||
The qprintnum() function now takes outdigits as a 3rd argument.
|
||||
Most of the time, this 3rd argument is just conf->outdigits.
|
||||
But when it comes to the experimental '%g', this value can
|
||||
change. This avoids having to modify conf->outdigits.
|
||||
|
||||
Fixed a problem where gcc complains about E_FUNC not being defined
|
||||
for Linux systems as reported by Martin Buck (m at rtin-buck dor de).
|
||||
|
||||
Updated the help files help/config, help/display, help/epsilon,
|
||||
help/fprint, help/printf, and help/strprintf to give more
|
||||
examples of how display digits and epsilon precision interact
|
||||
with displaying values.
|
||||
|
||||
Added more information about %g in the help file help/printf.
|
||||
|
||||
The '\a' is now recognized in a printf format string as the
|
||||
single byte audible bell character (byte 0x07 in ASCII encoding).
|
||||
|
||||
The following is a partial list of escape sequences recognized
|
||||
in strings and in printf formats:
|
||||
|
||||
\a audible bell byte 0x07 in ASCII encoding
|
||||
\b backspace byte 0x08 in ASCII encoding
|
||||
\f form feed byte 0x0c in ASCII encoding
|
||||
\n newline byte 0x0a in ASCII encoding
|
||||
\r return byte 0x0d in ASCII encoding
|
||||
\t tab byte 0x09 in ASCII encoding
|
||||
\v vertical tab byte 0x0b in ASCII encoding
|
||||
|
||||
|
||||
The following are the changes from calc version 2.12.6.9 to 2.12.6.9:
|
||||
|
||||
Fixed a number of core dump bugs related to the calculation of
|
||||
tan(), cot(), sec(), csc(), tanh(), coth(), sech(), and csch(),
|
||||
@@ -26,8 +139,9 @@ The following are the changes from calc version 2.12.6.9 to date:
|
||||
INCDIR= $(shell xcrun --show-sdk-path --sdk macosx)/usr/include
|
||||
|
||||
to determine the upper path of the /usr/include directory for macOS.
|
||||
The Darwin target seems to not automatically detected. For now,
|
||||
under macOS, declare the target as darwin:
|
||||
In some rare cases, the Darwin target seems to not automatically detected.
|
||||
If you are running under macOS, and that happens, you can force
|
||||
the target to be Darwin:
|
||||
|
||||
# for macOS users only, force the target to be darwin
|
||||
#
|
||||
|
27
Makefile
27
Makefile
@@ -207,30 +207,9 @@ all: fix_version check_include
|
||||
${V} echo '=-=-=-=-= private Makefile $@ rule end =-=-=-=-='
|
||||
|
||||
check_include:
|
||||
$(Q) if [ ! -d /usr/include ]; then \
|
||||
echo "ERROR: critical directory missing: /usr/include" 1>&2; \
|
||||
echo "Without this critical directory, we cannot compile." 1>&2; \
|
||||
echo 1>&2; \
|
||||
echo "Perhaps your system isn't setup to compile C source?" 1>&2; \
|
||||
echo "For example, Apple OS X / darwin requres that XCode" 1>&2; \
|
||||
echo "must be installed and that you run the command:" 1>&2; \
|
||||
echo 1>&2; \
|
||||
echo " xcode-select --install" 1>&2; \
|
||||
echo 1>&2; \
|
||||
exit 1; \
|
||||
fi
|
||||
$(Q) if [ ! -f /usr/include/stdio.h ]; then \
|
||||
echo "ERROR: critical include files are missing" 1>&2; \
|
||||
echo "Without this critical directory, we cannot compile." 1>&2; \
|
||||
echo 1>&2; \
|
||||
echo "Perhaps your system isn't setup to compile C source?" 1>&2; \
|
||||
echo "For example, Apple OS X / darwin requres that XCode" 1>&2; \
|
||||
echo "must be installed and that you run the command:" 1>&2; \
|
||||
echo 1>&2; \
|
||||
echo " xcode-select --install" 1>&2; \
|
||||
echo 1>&2; \
|
||||
exit 1; \
|
||||
fi
|
||||
${V} echo '=-=-=-=-= private Makefile $@ rule start =-=-=-=-='
|
||||
${Q} ${MAKE} ${XARG} -f ${MAKE_FILE} $@ ${XVAR}
|
||||
${V} echo '=-=-=-=-= private Makefile $@ rule end =-=-=-=-='
|
||||
|
||||
calc-dynamic-only:
|
||||
${V} echo '=-=-=-=-= private Makefile $@ rule start =-=-=-=-='
|
||||
|
110
Makefile.ship
110
Makefile.ship
@@ -1054,7 +1054,7 @@ EXT=
|
||||
|
||||
# The default calc versions
|
||||
#
|
||||
VERSION= 2.12.6.9
|
||||
VERSION= 2.12.7.6
|
||||
|
||||
# Names of shared libraries with versions
|
||||
#
|
||||
@@ -1116,16 +1116,26 @@ STRIP= strip
|
||||
EXTRA_CFLAGS=
|
||||
EXTRA_LDFLAGS=
|
||||
|
||||
# Architecture compile flags
|
||||
#
|
||||
# The ARCH_CFLAGS are ${CC} when compiling C files. They follow
|
||||
# CCMISC and preceed EXTRA_CFLAGS.
|
||||
#
|
||||
ARCH_CFLAGS= -march=native
|
||||
#ARCH_CFLAGS=
|
||||
|
||||
# COMMON_CFLAGS are the common ${CC} flags used for all programs, both
|
||||
# intermediate and final calc and calc related programs
|
||||
#
|
||||
#if 0 /* start of skip for non-Gnu makefiles */
|
||||
ifdef ALLOW_CUSTOM
|
||||
#endif /* end of skip for non-Gnu makefiles */
|
||||
COMMON_CFLAGS= -DCALC_SRC ${ALLOW_CUSTOM} ${CCWARN} ${CCMISC} ${EXTRA_CFLAGS}
|
||||
COMMON_CFLAGS= -DCALC_SRC ${ALLOW_CUSTOM} ${CCWARN} \
|
||||
${CCMISC} ${ARCH_CFLAGS} ${EXTRA_CFLAGS}
|
||||
#if 0 /* start of skip for non-Gnu makefiles */
|
||||
else
|
||||
COMMON_CFLAGS= -DCALC_SRC -UCUSTOM ${CCWARN} ${CCMISC} ${EXTRA_CFLAGS}
|
||||
COMMON_CFLAGS= -DCALC_SRC -UCUSTOM ${CCWARN} \
|
||||
${CCMISC} ${ARCH_CFLAGS} ${EXTRA_CFLAGS}
|
||||
endif
|
||||
#endif /* end of skip for non-Gnu makefiles */
|
||||
|
||||
@@ -1900,6 +1910,7 @@ SAMPLE_OBJ= sample_many.o sample_rand.o
|
||||
CUSTOM_PASSDOWN= \
|
||||
ALLOW_CUSTOM="${ALLOW_CUSTOM}" \
|
||||
AR=${AR} \
|
||||
ARCH_CFLAGS=${ARCH_CFLAGS} \
|
||||
AWK=${AWK} \
|
||||
BINDIR="${BINDIR}" \
|
||||
BLD_TYPE="${BLD_TYPE}" \
|
||||
@@ -2179,25 +2190,15 @@ TARGETS= ${EARLY_TARGETS} ${BLD_TYPE} ${LATE_TARGETS}
|
||||
all: check_include ${BLD_TYPE} CHANGES
|
||||
|
||||
check_include:
|
||||
$(Q) if [ ! -d ${INCDIR} ]; then \
|
||||
echo "ERROR: critical directory missing: /usr/include" 1>&2; \
|
||||
echo "Without this critical directory, we cannot compile." 1>&2; \
|
||||
echo 1>&2; \
|
||||
$(Q) if ! echo '#include <stdio.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo "ERROR: Missing critical <stdio.h> include file." 1>&2; \
|
||||
echo "Without critical include files, we cannot compile." 1>&2; \
|
||||
echo "Perhaps your system isn't setup to compile C source?" 1>&2; \
|
||||
echo "For example, Apple OS X / darwin requres that XCode" 1>&2; \
|
||||
echo "must be installed and that you run the command:" 1>&2; \
|
||||
echo 1>&2; \
|
||||
echo " xcode-select --install" 1>&2; \
|
||||
echo "For example, Apple macOS / Darwin requres that XCode" 1>&2; \
|
||||
echo "must be installed." 1>&2; \
|
||||
echo 1>&2; \
|
||||
exit 1; \
|
||||
fi
|
||||
$(Q) if [ ! -f ${INCDIR}/stdio.h ]; then \
|
||||
echo "ERROR: critical include files are missing" 1>&2; \
|
||||
echo "Without this critical directory, we cannot compile." 1>&2; \
|
||||
echo 1>&2; \
|
||||
echo "Perhaps your system isn't setup to compile C source?" 1>&2; \
|
||||
echo "For example, Apple OS X / darwin requres that XCode" 1>&2; \
|
||||
echo "must be installed and that you run the command:" 1>&2; \
|
||||
echo "Also macOS users might later to run this command:" 1>&2; \
|
||||
echo 1>&2; \
|
||||
echo " xcode-select --install" 1>&2; \
|
||||
echo 1>&2; \
|
||||
@@ -2477,22 +2478,15 @@ endian_calc.h: endian${EXT} ${MAKE_FILE}
|
||||
${Q} echo '' >> endian_calc.h
|
||||
${Q} echo '/* what byte order are we? */' >> endian_calc.h
|
||||
-${Q} if [ X"${CALC_BYTE_ORDER}" = X ]; then \
|
||||
if [ -f ${INCDIR}/endian.h ]; then \
|
||||
if echo '#include <endian.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '#include <endian.h>' >> endian_calc.h; \
|
||||
echo '#define CALC_BYTE_ORDER BYTE_ORDER' >> endian_calc.h; \
|
||||
elif [ -f ${INCDIR}/machine/endian.h ]; then \
|
||||
elif echo '#include <machine/endian.h>' | \
|
||||
${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '#include <machine/endian.h>' >> endian_calc.h; \
|
||||
echo '#define CALC_BYTE_ORDER BYTE_ORDER' >> endian_calc.h; \
|
||||
elif [ -f ${INCDIR}/sys/endian.h ]; then \
|
||||
echo '#include <sys/endian.h>' >> endian_calc.h; \
|
||||
echo '#define CALC_BYTE_ORDER BYTE_ORDER' >> endian_calc.h; \
|
||||
elif [ -f /usr/include/endian.h ]; then \
|
||||
echo '#include <endian.h>' >> endian_calc.h; \
|
||||
echo '#define CALC_BYTE_ORDER BYTE_ORDER' >> endian_calc.h; \
|
||||
elif [ -f /usr/include/machine/endian.h ]; then \
|
||||
echo '#include <machine/endian.h>' >> endian_calc.h; \
|
||||
echo '#define CALC_BYTE_ORDER BYTE_ORDER' >> endian_calc.h; \
|
||||
elif [ -f /usr/include/sys/endian.h ]; then \
|
||||
elif echo '#include <sys/endian.h>' | \
|
||||
${CC} -E- >/dev/null 2>&1; then \
|
||||
echo '#include <sys/endian.h>' >> endian_calc.h; \
|
||||
echo '#define CALC_BYTE_ORDER BYTE_ORDER' >> endian_calc.h; \
|
||||
else \
|
||||
@@ -2559,9 +2553,7 @@ have_times.h: ${MAKE_FILE}
|
||||
echo '#define HAVE_TIMES_H /* yes */' >> have_times.h; \
|
||||
elif [ X"${HAVE_TIMES_H}" = X"NO" ]; then \
|
||||
echo '#undef HAVE_TIMES_H /* no */' >> have_times.h; \
|
||||
elif [ -f ${INCDIR}/times.h ]; then \
|
||||
echo '#define HAVE_TIMES_H /* yes */' >> have_times.h; \
|
||||
elif [ -f /usr/include/times.h ]; then \
|
||||
elif echo '#include <times.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '#define HAVE_TIMES_H /* yes */' >> have_times.h; \
|
||||
else \
|
||||
echo '#undef HAVE_TIMES_H /* no */' >> have_times.h; \
|
||||
@@ -2570,9 +2562,7 @@ have_times.h: ${MAKE_FILE}
|
||||
echo '#define HAVE_SYS_TIMES_H /* yes */' >> have_times.h; \
|
||||
elif [ X"${HAVE_SYS_TIMES_H}" = X"NO" ]; then \
|
||||
echo '#undef HAVE_SYS_TIMES_H /* no */' >> have_times.h; \
|
||||
elif [ -f ${INCDIR}/sys/times.h ]; then \
|
||||
echo '#define HAVE_SYS_TIMES_H /* yes */' >> have_times.h; \
|
||||
elif [ -f /usr/include/sys/times.h ]; then \
|
||||
elif echo '#include <sys/times.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '#define HAVE_SYS_TIMES_H /* yes */' >> have_times.h; \
|
||||
else \
|
||||
echo '#undef HAVE_SYS_TIMES_H /* no */' >> have_times.h; \
|
||||
@@ -2581,9 +2571,7 @@ have_times.h: ${MAKE_FILE}
|
||||
echo '#define HAVE_TIME_H /* yes */' >> have_times.h; \
|
||||
elif [ X"${HAVE_TIME_H}" = X"NO" ]; then \
|
||||
echo '#undef HAVE_TIME_H /* no */' >> have_times.h; \
|
||||
elif [ -f ${INCDIR}/time.h ]; then \
|
||||
echo '#define HAVE_TIME_H /* yes */' >> have_times.h; \
|
||||
elif [ -f /usr/include/time.h ]; then \
|
||||
elif echo '#include <time.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '#define HAVE_TIME_H /* yes */' >> have_times.h; \
|
||||
else \
|
||||
echo '#undef HAVE_TIME_H /* no */' >> have_times.h; \
|
||||
@@ -2592,9 +2580,7 @@ have_times.h: ${MAKE_FILE}
|
||||
echo '#define HAVE_SYS_TIME_H /* yes */' >> have_times.h; \
|
||||
elif [ X"${HAVE_SYS_TIME_H}" = X"NO" ]; then \
|
||||
echo '#undef HAVE_SYS_TIME_H /* no */' >> have_times.h; \
|
||||
elif [ -f ${INCDIR}/sys/time.h ]; then \
|
||||
echo '#define HAVE_SYS_TIME_H /* yes */' >> have_times.h; \
|
||||
elif [ -f /usr/include/sys/time.h ]; then \
|
||||
elif echo '#include <sys/time.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '#define HAVE_SYS_TIME_H /* yes */' >> have_times.h; \
|
||||
else \
|
||||
echo '#undef HAVE_SYS_TIME_H /* no */' >> have_times.h; \
|
||||
@@ -2630,9 +2616,7 @@ have_stdlib.h: ${MAKE_FILE}
|
||||
echo '#define HAVE_STDLIB_H /* yes */' >> have_stdlib.h; \
|
||||
elif [ X"${HAVE_STDLIB_H}" = X"NO" ]; then \
|
||||
echo '#undef HAVE_STDLIB_H /* no */' >> have_stdlib.h; \
|
||||
elif [ -f ${INCDIR}/stdlib.h ]; then \
|
||||
echo '#define HAVE_STDLIB_H /* yes */' >> have_stdlib.h; \
|
||||
elif [ -f /usr/include/stdlib.h ]; then \
|
||||
elif echo '#include <stdlib.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '#define HAVE_STDLIB_H /* yes */' >> have_stdlib.h; \
|
||||
else \
|
||||
echo '#undef HAVE_STDLIB_H /* no */' >> have_stdlib.h; \
|
||||
@@ -2668,9 +2652,7 @@ have_unistd.h: ${MAKE_FILE}
|
||||
echo '#define HAVE_UNISTD_H /* yes */' >> have_unistd.h; \
|
||||
elif [ X"${HAVE_UNISTD_H}" = X"NO" ]; then \
|
||||
echo '#undef HAVE_UNISTD_H /* no */' >> have_unistd.h; \
|
||||
elif [ -f ${INCDIR}/unistd.h ]; then \
|
||||
echo '#define HAVE_UNISTD_H /* yes */' >> have_unistd.h; \
|
||||
elif [ -f /usr/include/unistd.h ]; then \
|
||||
elif echo '#include <unistd.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '#define HAVE_UNISTD_H /* yes */' >> have_unistd.h; \
|
||||
else \
|
||||
echo '#undef HAVE_UNISTD_H /* no */' >> have_unistd.h; \
|
||||
@@ -2706,9 +2688,7 @@ have_string.h: ${MAKE_FILE}
|
||||
echo '#define HAVE_STRING_H /* yes */' >> have_string.h; \
|
||||
elif [ X"${HAVE_STRING_H}" = X"NO" ]; then \
|
||||
echo '#undef HAVE_STRING_H /* no */' >> have_string.h; \
|
||||
elif [ -f ${INCDIR}/string.h ]; then \
|
||||
echo '#define HAVE_STRING_H /* yes */' >> have_string.h; \
|
||||
elif [ -f /usr/include/string.h ]; then \
|
||||
elif echo '#include <string.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '#define HAVE_STRING_H /* yes */' >> have_string.h; \
|
||||
else \
|
||||
echo '#undef HAVE_STRING_H /* no */' >> have_string.h; \
|
||||
@@ -2748,22 +2728,12 @@ terminal.h: ${MAKE_FILE}
|
||||
echo '#undef USE_TERMIOS /* <termios.h> */' >> terminal.h; \
|
||||
echo '#undef USE_TERMIO /* <termio.h> */' >> terminal.h; \
|
||||
echo '#undef USE_SGTTY /* <sys/ioctl.h> */' >> terminal.h; \
|
||||
elif [ -f ${INCDIR}/termios.h ]; then \
|
||||
elif echo '#include <termios.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '/* use termios */' >> terminal.h; \
|
||||
echo '#define USE_TERMIOS /* <termios.h> */' >> terminal.h; \
|
||||
echo '#undef USE_TERMIO /* <termio.h> */' >> terminal.h; \
|
||||
echo '#undef USE_SGTTY /* <sys/ioctl.h> */' >> terminal.h; \
|
||||
elif [ -f ${INCDIR}/termio.h ]; then \
|
||||
echo '/* use termio */' >> terminal.h; \
|
||||
echo '#undef USE_TERMIOS /* <termios.h> */' >> terminal.h; \
|
||||
echo '#define USE_TERMIO /* <termio.h> */' >> terminal.h; \
|
||||
echo '#undef USE_SGTTY /* <sys/ioctl.h> */' >> terminal.h; \
|
||||
elif [ -f /usr/include/termios.h ]; then \
|
||||
echo '/* use termios */' >> terminal.h; \
|
||||
echo '#define USE_TERMIOS /* <termios.h> */' >> terminal.h; \
|
||||
echo '#undef USE_TERMIO /* <termio.h> */' >> terminal.h; \
|
||||
echo '#undef USE_SGTTY /* <sys/ioctl.h> */' >> terminal.h; \
|
||||
elif [ -f /usr/include/termio.h ]; then \
|
||||
elif echo '#include <termio.h>' | ${CC} -E - >/dev/null 2>&1; then \
|
||||
echo '/* use termio */' >> terminal.h; \
|
||||
echo '#undef USE_TERMIOS /* <termios.h> */' >> terminal.h; \
|
||||
echo '#define USE_TERMIO /* <termio.h> */' >> terminal.h; \
|
||||
@@ -2955,7 +2925,7 @@ have_const.h: have_const.c ${MAKE_FILE}
|
||||
${TRUE}; \
|
||||
fi
|
||||
|
||||
have_offscl.h: have_offscl.c ${MAKE_FILE}
|
||||
have_offscl.h: have_offscl.c have_unistd.h ${MAKE_FILE}
|
||||
${Q} ${RM} -f offscl_tmp have_offscl.h
|
||||
${Q} echo 'forming have_offscl.h'
|
||||
${Q} echo '/*' > have_offscl.h
|
||||
@@ -2995,7 +2965,7 @@ have_offscl.h: have_offscl.c ${MAKE_FILE}
|
||||
${TRUE}; \
|
||||
fi
|
||||
|
||||
have_posscl.h: have_posscl.c have_fpos.h ${MAKE_FILE}
|
||||
have_posscl.h: have_posscl.c have_fpos.h have_unistd.h ${MAKE_FILE}
|
||||
${Q} ${RM} -f have_posscl have_posscl.o posscl_tmp have_posscl.h
|
||||
${Q} echo 'forming have_posscl.h'
|
||||
${Q} echo '/*' > have_posscl.h
|
||||
@@ -3251,7 +3221,7 @@ have_ustat.h: have_ustat.c ${MAKE_FILE}
|
||||
${TRUE}; \
|
||||
fi
|
||||
|
||||
have_getsid.h: have_getsid.c ${MAKE_FILE}
|
||||
have_getsid.h: have_getsid.c have_unistd.h ${MAKE_FILE}
|
||||
${Q} ${RM} -f getsid_tmp have_getsid.h
|
||||
${Q} echo 'forming have_getsid.h'
|
||||
${Q} echo '/*' > have_getsid.h
|
||||
@@ -3291,7 +3261,7 @@ have_getsid.h: have_getsid.c ${MAKE_FILE}
|
||||
${TRUE}; \
|
||||
fi
|
||||
|
||||
have_getpgid.h: have_getpgid.c ${MAKE_FILE}
|
||||
have_getpgid.h: have_getpgid.c have_unistd.h ${MAKE_FILE}
|
||||
${Q} ${RM} -f getpgid_tmp have_getpgid.h
|
||||
${Q} echo 'forming have_getpgid.h'
|
||||
${Q} echo '/*' > have_getpgid.h
|
||||
@@ -3373,7 +3343,7 @@ have_gettime.h: have_gettime.c ${MAKE_FILE}
|
||||
${TRUE}; \
|
||||
fi
|
||||
|
||||
have_getprid.h: have_getprid.c ${MAKE_FILE}
|
||||
have_getprid.h: have_getprid.c have_unistd.h ${MAKE_FILE}
|
||||
${Q} ${RM} -f getprid_tmp have_getprid.h
|
||||
${Q} echo 'forming have_getprid.h'
|
||||
${Q} echo '/*' > have_getprid.h
|
||||
@@ -4082,6 +4052,7 @@ env:
|
||||
@echo 'ALIGN32=${ALIGN32}'; echo ''
|
||||
@echo 'ALLOW_CUSTOM=${ALLOW_CUSTOM}'; echo ''
|
||||
@echo 'AR=${AR}'; echo ''
|
||||
@echo 'ARCH_CFLAGS=${ARCH_CFLAGS}'; echo ''
|
||||
@echo 'AWK=${AWK}'; echo ''
|
||||
@echo 'BINDIR=${BINDIR}'; echo ''
|
||||
@echo 'BLD_TYPE=${BLD_TYPE}'; echo ''
|
||||
@@ -5504,6 +5475,7 @@ hist.o: have_unistd.h
|
||||
hist.o: have_unused.h
|
||||
hist.o: hist.c
|
||||
hist.o: hist.h
|
||||
hist.o: lib_calc.h
|
||||
hist.o: longbits.h
|
||||
hist.o: nametype.h
|
||||
hist.o: qmath.h
|
||||
|
@@ -1,6 +1,9 @@
|
||||
# What is calc?
|
||||
|
||||
Calc is an interactive calculator which provides for easy large
|
||||
numeric calculations, but which also can be easily programmed
|
||||
for difficult or long calculations. It can accept a command line
|
||||
argument, in which case it executes that single command and exits.
|
||||
Otherwise, it enters interactive mode. In this mode, it accepts
|
||||
commands one at a time, processes them, and displays the answers.
|
||||
In the simplest case, commands are simply expressions which are
|
||||
@@ -16,7 +19,7 @@ and the calculator will print:
|
||||
15
|
||||
```
|
||||
|
||||
Calc as the usual collection of arithmetic operators +, -, /, * as
|
||||
Calc has the usual collection of arithmetic operators +, -, /, * as
|
||||
well as ^ (exponentiation), % (modulus) and // (integer divide).
|
||||
For example:
|
||||
|
||||
|
@@ -2057,7 +2057,12 @@ define t010()
|
||||
epsilon(eps);
|
||||
return 5;
|
||||
}
|
||||
if ((stirling2(10, 5) - (42525)) != 0) {
|
||||
/*
|
||||
* Once, when an expression such as 0^(6-6) returned 0,
|
||||
* then stirling2(10, 5) == 42525. However when we made9
|
||||
* 0^(6-6) == 0^0 == 1, then stirling2(10, 5) == 5102999/120.
|
||||
*/
|
||||
if ((stirling2(10, 5) - (5102999/120)) != 0) {
|
||||
epsilon(eps);
|
||||
return 6;
|
||||
}
|
||||
|
2
calc.c
2
calc.c
@@ -449,7 +449,7 @@ main(int argc, char **argv)
|
||||
"\t[-O] [-p] [-q] [-s] [-u] [-v] "
|
||||
"[--] [calc_cmd ...]\n"
|
||||
"usage: %s ... -f filename\n"
|
||||
"1st cscript line: #/path/to/calc ... -f\n",
|
||||
"1st cscript line: #/path/to/calc ... -s -f\n",
|
||||
program, program);
|
||||
exit(20);
|
||||
}
|
||||
|
1
calc.h
1
calc.h
@@ -48,6 +48,7 @@
|
||||
#define HOME "HOME" /* environment variable for home dir */
|
||||
#define PAGER "PAGER" /* environment variable for help */
|
||||
#define SHELL "SHELL" /* environment variable for shell */
|
||||
#define CALCHISTFILE "CALCHISTFILE" /* history file environment variable */
|
||||
#define DEFAULTCALCBINDINGS "bindings" /* default calc bindings file */
|
||||
#define DEFAULTCALCHELP "help" /* help file that -h prints */
|
||||
#define DEFAULTSHELL "sh" /* default shell to use */
|
||||
|
74
calc.man
74
calc.man
@@ -1,5 +1,5 @@
|
||||
.\"
|
||||
.\" Copyright (C) 1999-2007,2014,2018 Landon Curt Noll
|
||||
.\" Copyright (C) 1999-2007,2014,2018,2021 Landon Curt Noll
|
||||
.\"
|
||||
.\" Calc is open software; you can redistribute it and/or modify it under
|
||||
.\" the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -50,7 +50,7 @@ calc \- arbitrary precision calculator
|
||||
.RB [ [\-\-]\ calc_cmd\ \&.\|.\|. ]
|
||||
.in -5n
|
||||
.sp
|
||||
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
|
||||
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-s\fP \fB\-f\fP
|
||||
.SH DESCRIPTION
|
||||
\&
|
||||
.br
|
||||
@@ -219,24 +219,29 @@ The getenv() builtin will still return values, however.
|
||||
|
||||
.TP
|
||||
.B \-f
|
||||
This flag is normally only with calc shell scripts.
|
||||
.sp 1
|
||||
This flag is required when using calc in
|
||||
.BR "shell script mode" .
|
||||
It must be at the end of the initial
|
||||
.B #!
|
||||
line of the script.
|
||||
line of the script
|
||||
and must be immedately preceeded by the
|
||||
.B \-s
|
||||
flag.
|
||||
.sp 1
|
||||
This flag is normally only at the end of a calc shell script.
|
||||
If the first line of an executable file begins
|
||||
.B #!
|
||||
followed by the absolute pathname of the
|
||||
.B calc
|
||||
program and the flag
|
||||
program and if the first line ends with the two flags
|
||||
.B \-s
|
||||
.B \-f
|
||||
as in:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
|
||||
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-s\fP \fB\-f\fP
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
@@ -270,7 +275,7 @@ on the command line:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
\fIcalc\fP\ [other_flags\ \&...] \fB\-f\fP filename
|
||||
\fIcalc\fP\ [other_flags\ \&...] \fB\-s\fP \fB\-f\fP filename
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
@@ -283,6 +288,16 @@ Use of
|
||||
.B \-f
|
||||
implies
|
||||
.BR \-s .
|
||||
However in a calc shell script,
|
||||
one must include
|
||||
.B \-f
|
||||
before
|
||||
.B \-s
|
||||
on the initial
|
||||
.B #!
|
||||
line.
|
||||
|
||||
.sp 1
|
||||
In addition,
|
||||
.B \-d
|
||||
and
|
||||
@@ -753,25 +768,28 @@ If the first line of an executable file begins
|
||||
.B #!
|
||||
followed by the absolute pathname of the
|
||||
.B calc
|
||||
program and the flag
|
||||
program and the first line ends with the two flags
|
||||
.B \-s
|
||||
.B \-f
|
||||
as in:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-f\fP
|
||||
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-s\fP \fB\-f\fP
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
the rest of the file will be processed in
|
||||
.BR "shell script mode" .
|
||||
Note that
|
||||
.B \-s
|
||||
.B \-f
|
||||
must at the end of the initial ``#!'' line.
|
||||
Any other optional
|
||||
.B "other_flags"
|
||||
must come before
|
||||
the
|
||||
.B \-s
|
||||
.BR \-f .
|
||||
.sp 1
|
||||
In
|
||||
@@ -803,18 +821,26 @@ the file
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
\fI#!${BINDIR}/calc\fP\ \&\fB\-q\fP \fB\-f\fP
|
||||
#
|
||||
# mersenne - an example of a calc \fBshell script file\fP
|
||||
\fI#!${BINDIR}/calc\fP\ \&\fB\-q\fP \&\fB\-s\fP \fB\-f\fP
|
||||
|
||||
/* setup */
|
||||
argc = argv();
|
||||
program = argv(0);
|
||||
stderr = files(2);
|
||||
|
||||
/* parse args */
|
||||
if (argv() != 1) {
|
||||
fprintf(files(2), "usage: %s exp\\n", config("program"));
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "usage: %s exp\n", program);
|
||||
abort "must give one exponent arg";
|
||||
}
|
||||
exp = eval(argv(1));
|
||||
if (!isint(exp) || exp < 0) {
|
||||
fprintf(stderr, "%s: exp must be non-negative integer\n", program);
|
||||
abort "must give one exponent arg";
|
||||
}
|
||||
|
||||
/* print the mersenne number */
|
||||
print "2^": argv(0) : "-1 =", 2^eval(argv(0))-1;
|
||||
print "2^": exp : "-1 =", 2^exp-1;
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
@@ -844,9 +870,9 @@ will print:
|
||||
.sp 1
|
||||
Note that because
|
||||
.B \-s
|
||||
is assumed in
|
||||
is required in
|
||||
.B "shell script mode"
|
||||
and non-dashed args are made available as
|
||||
non-dashed args are made available as
|
||||
strings via the
|
||||
.BR argv ()
|
||||
builtin function.
|
||||
@@ -854,16 +880,16 @@ Therefore:
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
2^eval(argv(0))-1
|
||||
2^eval(argv(1))-1
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
will print the decimal value of 2^n-1
|
||||
but
|
||||
whereas
|
||||
.sp 1
|
||||
.in +5n
|
||||
.nf
|
||||
2^argv(0)-1
|
||||
2^argv(1)-1
|
||||
.fi
|
||||
.in -5n
|
||||
.sp 1
|
||||
@@ -1077,6 +1103,14 @@ Default value: binding
|
||||
This variable is not used if calc was compiled with GNU-readline support.
|
||||
In that case, the standard readline mechanisms (see readline(3)) are used.
|
||||
.sp
|
||||
.TP 5
|
||||
CALCHISTFILE
|
||||
Location of the calc history file.
|
||||
.sp
|
||||
Default value: ~/.calc_history
|
||||
.sp
|
||||
This variable is not used if calc was compiled with GNU-readline support.
|
||||
.sp
|
||||
.SH CREDIT
|
||||
\&
|
||||
.br
|
||||
|
28
calc.spec.in
28
calc.spec.in
@@ -32,7 +32,7 @@
|
||||
Summary: Arbitrary precision calculator.
|
||||
Name: calc
|
||||
Version: <<<PROJECT_VERSION>>>
|
||||
Release: 12
|
||||
Release: 13
|
||||
License: LGPL
|
||||
Group: Applications/Engineering
|
||||
Source: http://www.isthe.com/chongo/src/calc/%{name}-%{version}.tar.bz2
|
||||
@@ -76,48 +76,48 @@ For the latest calc release, see the project home page:
|
||||
|
||||
%build
|
||||
echo '-=- calc.spec beginning make clobber -=-'
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ clobber
|
||||
echo '-=- calc.spec ending make clobber -=-'
|
||||
echo '-=- calc.spec beginning make calc-static-only -=-'
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ calc-static-only BLD_TYPE=calc-static-only
|
||||
echo '-=- calc.spec ending make calc-static-only -=-'
|
||||
echo '-=- calc.spec beginning make rpm-hide-static -=-'
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ rpm-hide-static
|
||||
echo '-=- calc.spec ending make rpm-hide-static -=-'
|
||||
echo '-=- calc.spec beginning make clobber (again) -=-'
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ clobber
|
||||
echo '-=- calc.spec ending make clobber (again) -=-'
|
||||
echo '-=- calc.spec beginning make calc-dynamic-only -=-'
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ calc-dynamic-only \
|
||||
BLD_TYPE=calc-dynamic-only LD_SHARE=
|
||||
echo '-=- calc.spec ending make calc-dynamic-only -=-'
|
||||
echo '-=- calc.spec beginning make chk -=-'
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ chk
|
||||
echo '-=- calc.spec ending make chk -=-'
|
||||
echo '-=- calc.spec beginning make rpm-unhide-static -=-'
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ rpm-unhide-static
|
||||
echo '-=- calc.spec ending make rpm-unhide-static -=-'
|
||||
echo '-=- calc.spec beginning make rpm-clean-static -=-'
|
||||
make -j1 BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ rpm-clean-static
|
||||
echo '-=- calc.spec ending make rpm-clean-static -=-'
|
||||
echo '-=- calc.spec beginning make rpm-chk-static -=-'
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ rpm-chk-static
|
||||
echo '-=- calc.spec ending make rpm-chk-static -=-'
|
||||
@@ -125,7 +125,7 @@ echo '-=- calc.spec ending make rpm-chk-static -=-'
|
||||
%install
|
||||
echo '-=- calc.spec beginning make install -=-'
|
||||
mkdir -p %{_buildroot}
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} \
|
||||
make -j1 T=%{_buildroot} BINDIR=%{_bindir} LIBDIR=%{_libdir} ARCH_CFLAGS= \
|
||||
CALC_SHAREDIR=%{_datadir}/%{name} CALC_INCDIR=%{_includedir}/calc \
|
||||
MANDIR=%{_mandir}/man1 EXT= V=@ install
|
||||
echo '-=- calc.spec ending make install -=-'
|
||||
@@ -165,6 +165,12 @@ echo '-=- calc.spec beginning make clean -=-'
|
||||
%attr(644, root, root) %{_libdir}/libcustcalc.a
|
||||
|
||||
%changelog
|
||||
* Sun Mar 24 2019 cLandon Curt Noll http://www.isthe.com/chongo
|
||||
- Release: 13
|
||||
- Disable compiling with the default ARCH_CFLAGS= -march=native
|
||||
by clearking the ARCH_CFLAGS value in order to maximize
|
||||
the RPM binary protability.
|
||||
|
||||
* Mon Sep 01 2014 Landon Curt Noll http://www.isthe.com/chongo
|
||||
- Release: 12
|
||||
- Removed use of %{?_smp_mflags}. On Ubuntu 14.04, the -j2
|
||||
|
@@ -1021,7 +1021,7 @@ getstatement(LABEL *contlabel, LABEL *breaklabel,
|
||||
return;
|
||||
}
|
||||
reread();
|
||||
/* fall into default case */
|
||||
/*FALLTHRU*/
|
||||
|
||||
default:
|
||||
rescantoken();
|
||||
@@ -1384,6 +1384,7 @@ creatematrix(void)
|
||||
switch (gettoken()) {
|
||||
case T_RIGHTBRACKET:
|
||||
rescantoken();
|
||||
/*FALLTHRU*/
|
||||
case T_COMMA:
|
||||
addop(OP_ONE);
|
||||
addop(OP_SUB);
|
||||
@@ -1394,6 +1395,7 @@ creatematrix(void)
|
||||
switch(gettoken()) {
|
||||
case T_RIGHTBRACKET:
|
||||
rescantoken();
|
||||
/*FALLTHRU*/
|
||||
case T_COMMA:
|
||||
continue;
|
||||
}
|
||||
@@ -2211,6 +2213,7 @@ getterm(void)
|
||||
scanerror(T_NULL,
|
||||
"Function calls not allowed "
|
||||
"as expressions");
|
||||
/*FALLTHRU*/
|
||||
default:
|
||||
rescantoken();
|
||||
return type;
|
||||
@@ -2248,7 +2251,7 @@ getidexpr(BOOL okmat, int autodef)
|
||||
if (autodef != T_GLOBAL && autodef != T_LOCAL &&
|
||||
autodef != T_STATIC)
|
||||
autodef = 1;
|
||||
/* fall into default case */
|
||||
/*FALLTHRU*/
|
||||
default:
|
||||
rescantoken();
|
||||
usesymbol(name, autodef);
|
||||
@@ -2277,6 +2280,7 @@ getidexpr(BOOL okmat, int autodef)
|
||||
scanerror(T_NULL,
|
||||
"Function calls not allowed "
|
||||
"as expressions");
|
||||
/*FALLTHRU*/
|
||||
default:
|
||||
rescantoken();
|
||||
return type;
|
||||
|
@@ -1182,7 +1182,7 @@ comprint(COMPLEX *c)
|
||||
return;
|
||||
}
|
||||
if (!qiszero(c->real) || qiszero(c->imag))
|
||||
qprintnum(c->real, MODE_DEFAULT);
|
||||
qprintnum(c->real, MODE_DEFAULT, conf->outdigits);
|
||||
qtmp = c->imag[0];
|
||||
if (qiszero(&qtmp))
|
||||
return;
|
||||
@@ -1192,7 +1192,7 @@ comprint(COMPLEX *c)
|
||||
math_chr('-');
|
||||
qtmp.num.sign = 0;
|
||||
}
|
||||
qprintnum(&qtmp, MODE_DEFAULT);
|
||||
qprintnum(&qtmp, MODE_DEFAULT, conf->outdigits);
|
||||
math_chr('i');
|
||||
}
|
||||
|
||||
|
10
config.c
10
config.c
@@ -909,34 +909,42 @@ setconfig(int type, VALUE *vp)
|
||||
case CONFIG_PROGRAM:
|
||||
math_error("The program config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
|
||||
case CONFIG_BASENAME:
|
||||
math_error("The basename config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
|
||||
case CONFIG_WINDOWS:
|
||||
math_error("The windows config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
|
||||
case CONFIG_CYGWIN:
|
||||
math_error("The cygwin config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
|
||||
case CONFIG_COMPILE_CUSTOM:
|
||||
math_error("The custom config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
|
||||
case CONFIG_ALLOW_CUSTOM:
|
||||
math_error("The allow_custom config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
|
||||
case CONFIG_VERSION:
|
||||
math_error("The version config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
|
||||
case CONFIG_BASEB:
|
||||
math_error("The baseb config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
|
||||
case CONFIG_REDECL_WARN:
|
||||
if (vp->v_type == V_NUM) {
|
||||
@@ -971,10 +979,12 @@ setconfig(int type, VALUE *vp)
|
||||
case CONFIG_HZ:
|
||||
math_error("The clock tick rate config parameter is read-only");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
|
||||
default:
|
||||
math_error("Setting illegal config parameter");
|
||||
/*NOTREACHED*/
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -10,7 +10,7 @@
|
||||
* ... ...
|
||||
* x5 y5 z5 w5 point 5 in R^4
|
||||
*
|
||||
* Copyright (C) 2001,2014 Landon Curt Noll
|
||||
* Copyright (C) 2001,2014,2019 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -37,9 +37,11 @@
|
||||
* parse args
|
||||
*/
|
||||
argc = argv();
|
||||
if (argc != 25) {
|
||||
fprintf(files(2), "usage: %s x0 y0 z0 w0 x1 y1 z1 w1 ... x5 y5 z5 w5\n",
|
||||
argv(0));
|
||||
stderr = files(2);
|
||||
program = argv(0);
|
||||
if (argc != 24) {
|
||||
fprintf(stderr, "usage: %s x0 y0 z0 w0 x1 y1 z1 w1 ... x5 y5 z5 w5\n",
|
||||
program);
|
||||
exit;
|
||||
}
|
||||
x0 = eval(argv(1));
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# cscript - makefile for calc shell script files
|
||||
#
|
||||
# Copyright (C) 1999-2006,2014,2017 Landon Curt Noll
|
||||
# Copyright (C) 1999-2006,2014,2017,2021 Landon Curt Noll
|
||||
#
|
||||
# Calc is open software; you can redistribute it and/or modify it under
|
||||
# the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -199,7 +199,8 @@ SCRIPT= 4dsphere fproduct mersenne piforever plus powerterm \
|
||||
simple square
|
||||
|
||||
SCRIPT_SRC= 4dsphere.calc fproduct.calc mersenne.calc \
|
||||
piforever.calc plus.calc powerterm.calc simple.calc square.calc
|
||||
piforever.calc plus.calc powerterm.calc simple.calc \
|
||||
square.calc
|
||||
|
||||
# These files are found (but not built) in the distribution
|
||||
#
|
||||
|
@@ -8,7 +8,7 @@
|
||||
* filename where to write the product, use - for stdout
|
||||
* term ... terms to multiply
|
||||
*
|
||||
* Copyright (C) 2001,2014 Landon Curt Noll
|
||||
* Copyright (C) 2001,2014,2019 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -35,8 +35,10 @@
|
||||
* parse args
|
||||
*/
|
||||
argc = argv();
|
||||
stderr = files(2);
|
||||
program = argv(0);
|
||||
if (argc < 2) {
|
||||
fprintf(files(2), "usage: %s term [term ...]\n", argv(0));
|
||||
fprintf(stderr, "usage: %s term [term ...]\n", program);
|
||||
exit;
|
||||
}
|
||||
filename = argv(1);
|
||||
|
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* mersenne - print the value of a mersenne number
|
||||
*
|
||||
* Copyright (C) 1999-2007,2014 Landon Curt Noll
|
||||
* Copyright (C) 1999-2007,2014,2019 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -32,16 +32,19 @@
|
||||
/*
|
||||
* parse args
|
||||
*/
|
||||
if (argv() != 2) {
|
||||
/* we include the name of this script in the error message */
|
||||
fprintf(files(2), "usage: %s exp\n", config("program"));
|
||||
abort "wrong number of args";
|
||||
argc = argv();
|
||||
stderr = files(2);
|
||||
program = argv(0);
|
||||
if (argc != 2) {
|
||||
/* we include the name of this script in the error message */
|
||||
fprintf(stderr, "usage: %s exp\n", program);
|
||||
abort "wrong number of args";
|
||||
}
|
||||
|
||||
global n = eval(argv(1));
|
||||
n = eval(argv(1));
|
||||
|
||||
if (!isint(n) || n <= 0) {
|
||||
quit "Argument to be a positive integer";
|
||||
quit "Argument to be a positive integer";
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -1,8 +1,8 @@
|
||||
#!/usr/local/src/bin/calc/calc -q -f
|
||||
#!/usr/local/src/bin/calc/calc -q -s -f
|
||||
/*
|
||||
* piforever - print digits of pi forever (or as long as your mem/cpu allow)
|
||||
*
|
||||
* Copyright (C) 1999-2007,2014 Landon Curt Noll
|
||||
* Copyright (C) 1999-2007,2014,2019 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
|
@@ -1,8 +1,8 @@
|
||||
#!/usr/local/src/bin/calc/calc -q -f
|
||||
#!/usr/local/src/bin/calc/calc -q -s -f
|
||||
/*
|
||||
* plus - add two or more arguments together
|
||||
*
|
||||
* Copyright (C) 1999-2007,2014 Landon Curt Noll
|
||||
* Copyright (C) 1999-2007,2014,2019 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -32,10 +32,13 @@
|
||||
/*
|
||||
* parse args
|
||||
*/
|
||||
if (argv() < 2) {
|
||||
/* we include the name of this script in the error message */
|
||||
fprintf(files(2), "usage: %s value ...\n", config("program"));
|
||||
abort "not enough args";
|
||||
argc = argv();
|
||||
stderr = files(2);
|
||||
program = argv(0);
|
||||
if (argc < 2) {
|
||||
/* we include the name of this script in the error message */
|
||||
fprintf(stderr, "usage: %s value ...\n", program);
|
||||
abort "not enough args";
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -45,6 +48,6 @@ if (argv() < 2) {
|
||||
*/
|
||||
sum = 0;
|
||||
for (i=1; i < argv(); ++i) {
|
||||
sum += eval(argv(i));
|
||||
sum += eval(argv(i));
|
||||
}
|
||||
print sum;
|
||||
|
@@ -8,7 +8,7 @@
|
||||
* base_limit largest base we will consider (def: 10000)
|
||||
* value value to convert into sums of powers of integers
|
||||
*
|
||||
* Copyright (C) 2001,2014 Landon Curt Noll
|
||||
* Copyright (C) 2001,2014,2019 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the powerterm of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -35,28 +35,31 @@
|
||||
/*
|
||||
* parse args
|
||||
*/
|
||||
argc = argv();
|
||||
stderr = files(2);
|
||||
program = argv(0);
|
||||
config("verbose_quit", 0),;
|
||||
base_lim = 10000; /* default: highest base we will consider */
|
||||
if (argv() < 2 || argv() > 3) {
|
||||
fprintf(files(2), "usage: %s [base_limit] value\n", argv(0));
|
||||
if (argc < 2 || argc > 3) {
|
||||
fprintf(stderr, "usage: %s [base_limit] value\n", program);
|
||||
exit;
|
||||
}
|
||||
if (argv() == 3) {
|
||||
if (argc == 3) {
|
||||
x = eval(argv(2));
|
||||
base_lim = eval(argv(1));
|
||||
} else {
|
||||
x = eval(argv(1));
|
||||
}
|
||||
if (! isint(x)) {
|
||||
fprintf(files(2), "%s: value must be an integer\n");
|
||||
fprintf(stderr, "%s: value must be an integer\n", program);
|
||||
exit;
|
||||
}
|
||||
if (! isint(base_lim)) {
|
||||
fprintf(files(2), "%s: base limit must be an integer\n");
|
||||
fprintf(stderr, "%s: base limit must be an integer\n", program);
|
||||
exit;
|
||||
}
|
||||
if (base_lim <= 1) {
|
||||
fprintf(files(2), "%s: base limit is too small\n");
|
||||
fprintf(stderr, "%s: base limit is too small\n", program);
|
||||
exit;
|
||||
}
|
||||
++base_lim;
|
||||
|
@@ -1,8 +1,8 @@
|
||||
#!/usr/local/src/bin/calc/calc -q -f
|
||||
#!/usr/local/src/bin/calc/calc -q -s -f
|
||||
/*
|
||||
* simple - an example of a simple calc shell script
|
||||
*
|
||||
* Copyright (C) 1999-2007,2014 Landon Curt Noll
|
||||
* Copyright (C) 1999-2007,2014,2019 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -30,3 +30,9 @@
|
||||
* This is an example of a simple calc shell script.
|
||||
*/
|
||||
print "This simple calc shell script works!"
|
||||
print "config(\"program\")=", config("program");
|
||||
print "argv()=", argv();
|
||||
argc = argv();
|
||||
for (i=0; i < argc; ++i) {
|
||||
print "argv(":i:")=", argv(i);
|
||||
}
|
||||
|
@@ -1,8 +1,8 @@
|
||||
#!/usr/local/src/bin/calc/calc -q -f
|
||||
#!/usr/local/src/bin/calc/calc -q -s -f
|
||||
/*
|
||||
* sqaure - print the squares of input values
|
||||
*
|
||||
* Copyright (C) 2000-2007,2014 Ernest Bowen
|
||||
* Copyright (C) 2000-2007,2014,2019 Ernest Bowen
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -33,10 +33,6 @@
|
||||
* cat file | ./square
|
||||
* echo "123" | ./square
|
||||
*
|
||||
* Within calc:
|
||||
*
|
||||
* > read square
|
||||
*
|
||||
* With input from a terminal, there is no prompt but each non-empty
|
||||
* line of input is evaluated as a calc expression and if it can be
|
||||
* calculated, the square of the value of that expression is displayed.
|
||||
@@ -59,6 +55,6 @@
|
||||
*/
|
||||
|
||||
|
||||
global s;
|
||||
while ((s = prompt("")))
|
||||
while (s = fgetline(files(0))) {
|
||||
print "\t":eval(s)^2;
|
||||
}
|
||||
|
@@ -348,7 +348,7 @@ EXT=
|
||||
|
||||
# The default calc versions
|
||||
#
|
||||
VERSION= 2.12.6.9
|
||||
VERSION= 2.12.7.6
|
||||
|
||||
# Names of shared libraries with versions
|
||||
#
|
||||
|
@@ -348,7 +348,7 @@ EXT=
|
||||
|
||||
# The default calc versions
|
||||
#
|
||||
VERSION= 2.12.6.9
|
||||
VERSION= 2.12.7.6
|
||||
|
||||
# Names of shared libraries with versions
|
||||
#
|
||||
|
1
file.c
1
file.c
@@ -1021,6 +1021,7 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
|
||||
switch (ch) {
|
||||
case 's':
|
||||
printstring = TRUE;
|
||||
/*FALLTHRU*/
|
||||
case 'c':
|
||||
printchar = TRUE;
|
||||
case 'd':
|
||||
|
@@ -125,7 +125,8 @@ main(int argc, char **argv)
|
||||
* systems a FILEPOS is not a scalar hince we must memcpy.
|
||||
*/
|
||||
printf("#define SWAP_HALF_IN_FILEPOS(dest, src)\t%s\n",
|
||||
"memcpy((void *)(dest), (void *)(src), sizeof(FPOS_POS_LEN))");
|
||||
"\\\n\tmemcpy((void *)(dest), (void *)(src), "
|
||||
"sizeof(FPOS_POS_LEN))");
|
||||
#endif /* HAVE_FILEPOS_SCALAR */
|
||||
#endif /* CALC_BYTE_ORDER == BIG_ENDIAN */
|
||||
putchar('\n');
|
||||
|
2
func.c
2
func.c
@@ -335,7 +335,7 @@ f_str(VALUE *vp)
|
||||
break;
|
||||
case V_NUM:
|
||||
math_divertio();
|
||||
qprintnum(vp->v_num, MODE_DEFAULT);
|
||||
qprintnum(vp->v_num, MODE_DEFAULT, conf->outdigits);
|
||||
cp = math_getdivertedio();
|
||||
result.v_str = makestring(cp);
|
||||
break;
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* have_getpgid - determine if we have getpgid()
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999,2021 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -39,7 +39,10 @@
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include "have_unistd.h"
|
||||
#if defined(HAVE_UNISTD_H)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
int
|
||||
main(void)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* have_getprid - determine if we have getprid()
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999,2021 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -40,7 +40,10 @@
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include "have_unistd.h"
|
||||
#if defined(HAVE_UNISTD_H)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
int
|
||||
main(void)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* have_getsid - determine if we have getsid()
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999,2021 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -40,6 +40,10 @@
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include "have_unistd.h"
|
||||
#if defined(HAVE_UNISTD_H)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
int
|
||||
main(void)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* have_memmv - Determine if we have memmove()
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999,2021 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MOVELEN 3
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* have_newstr - Determine if we have a system without ANSI C string functions
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999,2021 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -42,6 +42,7 @@
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MOVELEN 3
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* have_offscl - determine if we have a scalar off_t element
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999,2021 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -46,6 +46,10 @@
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "have_unistd.h"
|
||||
#if defined(HAVE_UNISTD_H)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
int
|
||||
main(void)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* have_posscl - determine if we have a scalar FILEPOS element
|
||||
*
|
||||
* Copyright (C) 1999 Landon Curt Noll
|
||||
* Copyright (C) 1999,2021 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -45,6 +45,10 @@
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "have_unistd.h"
|
||||
#if defined(HAVE_UNISTD_H)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include "have_fpos.h"
|
||||
|
||||
int
|
||||
|
46
help/config
46
help/config
@@ -949,6 +949,48 @@ EXAMPLE
|
||||
; display()
|
||||
50
|
||||
|
||||
; /*
|
||||
* NOTE: When displaying many digits after the decimal point
|
||||
* be sure to set display(digits) (see 'help display') to
|
||||
* large enough AND to set epsilon(eps) (see 'help epsilon')
|
||||
* small enough (or if the function has a esp argument,
|
||||
* give a eps argument that is small enough) to display
|
||||
* the value correctly.
|
||||
*/
|
||||
; config("tilde", 1),;
|
||||
|
||||
; /* NOTE: display has too few digits and epsilon is not small enough */
|
||||
; config("display", 12),; /* or display(12),; */
|
||||
; printf("%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; config("epsilon", 1e-10),; /* or epsilon(1e-10),; */
|
||||
; printf("%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
; /* NOTE: display has too few digits yet epsilon is small enough */
|
||||
; config("display", 12),; /* or display(12),; */
|
||||
; printf("%f\n", pi(1e-72));
|
||||
~3.141592653590
|
||||
; config("epsilon", 1e-72),; /* or epsilon(1e-72),; */
|
||||
; printf("%f\n", pi());
|
||||
~3.141592653590
|
||||
|
||||
; /* NOTE: display has enough digits but epsilon is not small enough */
|
||||
; config("display", 72),; /* or display(72),; */
|
||||
; printf("%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; config("epsilon", 1e-10),; /* or epsilon(1e-10),; */
|
||||
; printf("%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
/* NOTE: display has enough digits and epsilon is small enough */
|
||||
; config("display", 72),; /* or display(72),; */
|
||||
; printf("%f\n", pi(1e-72));
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
; config("epsilon", 1e-72),; /* or epsilon(1e-72),; */
|
||||
; printf("%f\n", pi());
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
|
||||
LIMITS
|
||||
none
|
||||
|
||||
@@ -956,9 +998,9 @@ LINK LIBRARY
|
||||
n/a
|
||||
|
||||
SEE ALSO
|
||||
usage, custom, custom_cal, usage, epsilon, display
|
||||
custom, custom_cal, display, epsilon, fprintf, printf, strprintf, usage
|
||||
|
||||
## Copyright (C) 1999-2007 Landon Curt Noll
|
||||
## Copyright (C) 1999-2007,2018 Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
|
46
help/display
46
help/display
@@ -45,6 +45,48 @@ EXAMPLE
|
||||
; print display(5), 2/3
|
||||
40 ~0.66667
|
||||
|
||||
; /*
|
||||
* NOTE: When displaying many digits after the decimal point
|
||||
* be sure to set display(digits) (see 'help display') to
|
||||
* large enough AND to set epsilon(eps) (see 'help epsilon')
|
||||
* small enough (or if the function has a esp argument,
|
||||
* give a eps argument that is small enough) to display
|
||||
* the value correctly.
|
||||
*/
|
||||
; config("tilde", 1),;
|
||||
|
||||
; /* NOTE: display has too few digits and epsilon is not small enough */
|
||||
; display(12),;
|
||||
; printf("%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; epsilon(1e-10),;
|
||||
; printf("%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
; /* NOTE: display has too few digits yet epsilon is small enough */
|
||||
; display(12),;
|
||||
; printf("%f\n", pi(1e-72));
|
||||
~3.141592653590
|
||||
; epsilon(1e-72),;
|
||||
; printf("%f\n", pi());
|
||||
~3.141592653590
|
||||
|
||||
; /* NOTE: display has enough digits but epsilon is not small enough */
|
||||
; display(72),;
|
||||
; printf("%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; epsilon(1e-10),;
|
||||
; printf("%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
/* NOTE: display has enough digits and epsilon is small enough */
|
||||
; display(72),;
|
||||
; printf("%f\n", pi(1e-72));
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
; epsilon(1e-72),;
|
||||
; printf("%f\n", pi());
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
|
||||
LIMITS
|
||||
d >= 0
|
||||
|
||||
@@ -52,9 +94,9 @@ LINK LIBRARY
|
||||
none
|
||||
|
||||
SEE ALSO
|
||||
config
|
||||
config, epsilon, fprintf, printf, strprintf
|
||||
|
||||
## Copyright (C) 2004 Landon Curt Noll
|
||||
## Copyright (C) 2004,2018 Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
|
@@ -7,7 +7,8 @@ Environment variables
|
||||
|
||||
/ ./ ../ ~
|
||||
|
||||
If this variable does not exist, a compiled value
|
||||
If this variable does not exist, or if this
|
||||
variable is an empty string, a compiled value
|
||||
is used. Typically compiled in value is:
|
||||
|
||||
.:./cal:~/cal:${CALC_SHAREDIR}:${CUSTOMCALDIR}
|
||||
@@ -27,7 +28,8 @@ Environment variables
|
||||
line), calc searches for files along the :-separated
|
||||
$CALCRC environment variable.
|
||||
|
||||
If this variable does not exist, a compiled value
|
||||
If this variable does not exist, or if this
|
||||
variable is an empty string, a compiled value
|
||||
is used. Typically compiled in value is:
|
||||
|
||||
${CALC_SHAREDIR}/startup:~/.calcrc:./.calcinit
|
||||
@@ -66,7 +68,8 @@ Environment variables
|
||||
This value is taken to be the home directory of the
|
||||
current user. It is used when files begin with '~/'.
|
||||
|
||||
If this variable does not exist, the home directory password
|
||||
If this variable does not exist, or if this
|
||||
variable is an empty string, the home directory password
|
||||
entry of the current user is used. If that information
|
||||
is not available, '.' is used.
|
||||
|
||||
@@ -75,7 +78,8 @@ Environment variables
|
||||
When invoking help, this environment variable is used
|
||||
to display a help file.
|
||||
|
||||
If this variable does not exist, a compiled value
|
||||
If this variable does not exist, or if this
|
||||
variable is an empty string, a compiled value
|
||||
is used. Typically compiled in value is something
|
||||
such as 'more', 'less', 'pg' or 'cat'.
|
||||
|
||||
@@ -84,11 +88,20 @@ Environment variables
|
||||
When a !-command is used, the program indicated by
|
||||
this environment variable is used.
|
||||
|
||||
If this variable does not exist, a compiled value
|
||||
If this variable does not exist, or if this
|
||||
variable is an empty string, a compiled value
|
||||
is used. Typically compiled in value is something
|
||||
such as 'sh' is used.
|
||||
|
||||
## Copyright (C) 1999 Landon Curt Noll
|
||||
CALCHISTFILE
|
||||
|
||||
This value is taken to be the calc history file.
|
||||
|
||||
If this variable does not exist, or if this
|
||||
variable is an empty string, then ~/.calc_history
|
||||
is used.
|
||||
|
||||
## Copyright (C) 1999,2021 Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
|
50
help/epsilon
50
help/epsilon
@@ -16,13 +16,57 @@ DESCRIPTION
|
||||
and sets the stored epsilon value to eps.
|
||||
|
||||
The stored epsilon value is used as default value for eps in
|
||||
the functions appr(x, eps, rnd), sqrt(x, eps, rnd), etc.
|
||||
many functions such as appr(x, eps, rnd), sqrt(x, eps, rnd),
|
||||
pi(eps), sin(x, eps), tanh(x, eps), etc.
|
||||
|
||||
EXAMPLE
|
||||
; epsilon(1e-20),;
|
||||
; oldeps = epsilon(1e-6)
|
||||
; print epsilon(), sqrt(2), epsilon(1e-4), sqrt(2), epsilon(oldeps)
|
||||
; .000001 1.414214 .000001 1.4142 .0001
|
||||
|
||||
; /*
|
||||
* NOTE: When displaying many digits after the decimal point
|
||||
* be sure to set display(digits) (see 'help display') to
|
||||
* large enough AND to set epsilon(eps) (see 'help epsilon')
|
||||
* small enough (or if the function has a esp argument,
|
||||
* give a eps argument that is small enough) to display
|
||||
* the value correctly.
|
||||
*/
|
||||
; config("tilde", 1),;
|
||||
|
||||
; /* NOTE: display has too few digits and epsilon is not small enough */
|
||||
; display(12),;
|
||||
; printf("%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; epsilon(1e-10),;
|
||||
; printf("%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
; /* NOTE: display has too few digits yet epsilon is small enough */
|
||||
; display(12),;
|
||||
; printf("%f\n", pi(1e-72));
|
||||
~3.141592653590
|
||||
; epsilon(1e-72),;
|
||||
; printf("%f\n", pi());
|
||||
~3.141592653590
|
||||
|
||||
; /* NOTE: display has enough digits but epsilon is not small enough */
|
||||
; display(72),;
|
||||
; printf("%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; epsilon(1e-10),;
|
||||
; printf("%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
/* NOTE: display has enough digits and epsilon is small enough */
|
||||
; display(72),;
|
||||
; printf("%f\n", pi(1e-72));
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
; epsilon(1e-72),;
|
||||
; printf("%f\n", pi());
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
|
||||
LIMITS
|
||||
none
|
||||
|
||||
@@ -31,9 +75,9 @@ LINK LIBRARY
|
||||
NUMBER *_epsilon_
|
||||
|
||||
SEE ALSO
|
||||
config
|
||||
config, display, fprintf, printf, strprintf
|
||||
|
||||
## Copyright (C) 1999 Landon Curt Noll
|
||||
## Copyright (C) 1999,2018 Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
|
@@ -16,7 +16,8 @@ DESCRIPTION
|
||||
assume n and limit are both nonnegative.
|
||||
|
||||
If n has a prime proper factor less than or equal to limit, then
|
||||
factor(n, limit) returns the smallest such factor.
|
||||
factor(n, limit) returns the smallest such factor, or 1 if no
|
||||
factor was found below the limit.
|
||||
|
||||
NOTE: A proper factor of n>1 is a factor < n. In other words,
|
||||
for n>1 is not a proper factor of itself. The value 1
|
||||
@@ -50,7 +51,7 @@ SEE ALSO
|
||||
isprime, lfactor, nextcand, nextprime, prevcand, prevprime,
|
||||
pfact, pix, ptest
|
||||
|
||||
## Copyright (C) 1999-2006 Landon Curt Noll
|
||||
## Copyright (C) 1999-2006,2021 Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
|
46
help/fprintf
46
help/fprintf
@@ -45,6 +45,48 @@ EXAMPLE
|
||||
[2] = "undefined"
|
||||
[3] = NULL
|
||||
|
||||
; /*
|
||||
* NOTE: When displaying many digits after the decimal point
|
||||
* be sure to set display(digits) (see 'help display') to
|
||||
* large enough AND to set epsilon(eps) (see 'help epsilon')
|
||||
* small enough (or if the function has a esp argument,
|
||||
* give a eps argument that is small enough) to display
|
||||
* the value correctly.
|
||||
*/
|
||||
; config("tilde", 1),;
|
||||
|
||||
; /* NOTE: display has too few digits and epsilon is not small enough */
|
||||
; display(12),;
|
||||
; fprintf(files(1), "%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; epsilon(1e-10),;
|
||||
; fprintf(files(1), "%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
; /* NOTE: display has too few digits yet epsilon is small enough */
|
||||
; display(12),;
|
||||
; fprintf(files(1), "%f\n", pi(1e-72));
|
||||
~3.141592653590
|
||||
; epsilon(1e-72),;
|
||||
; fprintf(files(1), "%f\n", pi());
|
||||
~3.141592653590
|
||||
|
||||
; /* NOTE: display has enough digits but epsilon is not small enough */
|
||||
; display(72),;
|
||||
; fprintf(files(1), "%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; epsilon(1e-10),;
|
||||
; fprintf(files(1), "%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
/* NOTE: display has enough digits and epsilon is small enough */
|
||||
; display(72),;
|
||||
; fprintf(files(1), "%f\n", pi(1e-72));
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
; epsilon(1e-72),;
|
||||
; fprintf(files(1), "%f\n", pi());
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
|
||||
LIMITS
|
||||
The number of arguments of fprintf() is not to exceed 1024.
|
||||
|
||||
@@ -52,9 +94,9 @@ LINK LIBRARY
|
||||
none
|
||||
|
||||
SEE ALSO
|
||||
printf, strprintf, print
|
||||
config, display, epsilon, printf, strprintf
|
||||
|
||||
## Copyright (C) 1999-2006 Landon Curt Noll
|
||||
## Copyright (C) 1999-2006,2018 Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
|
@@ -15,7 +15,7 @@ What is calc?
|
||||
|
||||
15
|
||||
|
||||
Calc as the usual collection of arithmetic operators +, -, /, *
|
||||
Calc has the usual collection of arithmetic operators +, -, /, *
|
||||
as well as ^ (exponentiation), % (modulus) and // (integer divide).
|
||||
For example:
|
||||
|
||||
@@ -137,7 +137,7 @@ What is calc?
|
||||
|
||||
f2(79)
|
||||
|
||||
will produce;
|
||||
will produce:
|
||||
|
||||
1009847364737869270905302433221592504062302663202724609375
|
||||
|
||||
@@ -150,7 +150,7 @@ What is calc?
|
||||
|
||||
sc(31, 61)
|
||||
|
||||
will produce;
|
||||
will produce:
|
||||
|
||||
256772
|
||||
|
||||
|
@@ -6,7 +6,7 @@ SYNOPSIS
|
||||
|
||||
TYPES
|
||||
x number
|
||||
x number
|
||||
y number
|
||||
eps nonzero real, defaults to epsilon()
|
||||
|
||||
return number
|
||||
|
129
help/printf
129
help/printf
@@ -51,7 +51,7 @@ DESCRIPTION
|
||||
d, s, c current config("mode")
|
||||
f real (decimal, floating point)
|
||||
e exponential
|
||||
g real or exponential depending on config("display")
|
||||
g general format (real or exponential)
|
||||
r fractional
|
||||
o octal
|
||||
x hexadecimal
|
||||
@@ -63,15 +63,27 @@ DESCRIPTION
|
||||
if a positive width w has been specified, the effect is to
|
||||
produce w spaces, e.g., printf("abc%6dxyz") prints "abc xyz".
|
||||
|
||||
Control charters may be given in fmt by escaping them with
|
||||
the \ character. The following control charter escape
|
||||
sequences are recognized:
|
||||
|
||||
\a audible bell byte 0x07 in ASCII encoding
|
||||
\b backspace byte 0x08 in ASCII encoding
|
||||
\f form feed byte 0x0c in ASCII encoding
|
||||
\n newline byte 0x0b in ASCII encoding
|
||||
\r return byte 0x0a in ASCII encoding
|
||||
\t tab byte 0x0d in ASCII encoding
|
||||
\v vertical tab byte 0x09 in ASCII encoding
|
||||
|
||||
If i <= the number of specifiers in fmt, the value of argument
|
||||
x_i is printed in the format specified by the i-th specifier.
|
||||
If a positive width w has been specified and normal printing
|
||||
of x_i does not include a '\n' character, what is printed will
|
||||
if necessary be padded with spaces so that the length of the
|
||||
printed output is at least the w. Note that control characters
|
||||
like '\t', '\b' each count as one character. If the 'right-pad'
|
||||
flag has been set, the padding is on the right; otherwise it
|
||||
is on the left.
|
||||
(e.g., '\a', '\b', '\f', '\n', '\r', '\t', '\n') count as one
|
||||
character. If the 'right-pad' flag has been set, the padding
|
||||
is on the right; otherwise it is on the left.
|
||||
|
||||
If i > the number of specifiers in fmt, the value of argument x_i
|
||||
does not contribute to the printing. However, as all arguments
|
||||
@@ -84,22 +96,38 @@ DESCRIPTION
|
||||
specified precision will be ignored except for floating-point
|
||||
mode.
|
||||
|
||||
In the case of floating-point (f) format the precision determines
|
||||
the maximum number of decimal places to be displayed. Other
|
||||
aspects of this printing may be affected by the configuration
|
||||
parameters "outround", "tilde", "fullzero", "leadzero".
|
||||
The (g) general format will print the as real (f) (decimal or
|
||||
floating point) or as an exponential (e) depending on the
|
||||
configuration parameter "display".
|
||||
|
||||
In the case of floating-point (f) format, and the (g) general
|
||||
format, the precision determines the maximum number of decimal
|
||||
places to be displayed. Other aspects of this printing may be
|
||||
affected by the configuration parameters "outround", "tilde",
|
||||
"fullzero", "leadzero".
|
||||
|
||||
EXAMPLE
|
||||
; c = config("epsilon", 1e-6); c = config("display", 6);
|
||||
; c = config("tilde", 1); c = config("outround", 0);
|
||||
; c = config("fullzero", 0);
|
||||
; config("epsilon", 1e-6),;
|
||||
: config("display", 6),;
|
||||
; config("tilde", 1),;
|
||||
; config("outround", 0),;
|
||||
; config("fullzero", 0),;
|
||||
; fmt = "%f,%10f,%-10f,%10.4f,%.4f,%.f.\n";
|
||||
; a = sqrt(3);
|
||||
; printf(fmt,a,a,a,a,a,a);
|
||||
1.732051, 1.732051,1.732051 , ~1.7320,~1.7320,~1.
|
||||
|
||||
; c = config("tilde", 0); c = config("outround",24);
|
||||
; c = config("fullzero", 1);
|
||||
; config("display", 5),;
|
||||
: config("tilde", 0),;
|
||||
; printf("%f\n", pi());
|
||||
3.1416
|
||||
; config("display", 10),;
|
||||
; printf("%f\n", pi());
|
||||
3.141592654
|
||||
|
||||
; config("tilde", 0),;
|
||||
: config("outround",24),;
|
||||
; config("fullzero", 1),;
|
||||
; printf(fmt,a,a,a,a,a,a);
|
||||
1.732051, 1.732051,1.732051 , 1.7321,1.7321,2.
|
||||
|
||||
@@ -117,11 +145,82 @@ EXAMPLE
|
||||
[2] = "undefined"
|
||||
[3] = NULL
|
||||
|
||||
; c = config("display", 50);
|
||||
; config("display", 50),;
|
||||
; printf("%g %g\n%g %g\n", 1e5, 1e49, 1e50, 1e500);
|
||||
100000 100000000000000000000000000000000000000000000000000
|
||||
1e50 1e500
|
||||
|
||||
; config("display", 10),;
|
||||
: config("tilde", 0),;
|
||||
; printf("%f %f %f\n%f %f %f\n",
|
||||
exp(1), exp(2), exp(3), exp(4), exp(5), exp(6));
|
||||
2.7182818285 7.3890560989 20.0855369232
|
||||
54.5981500331 148.4131591026 403.4287934927
|
||||
; printf("%e %e %e\n%e %e %e\n",
|
||||
exp(1), exp(2), exp(3), exp(4), exp(5), exp(6));
|
||||
2.7182818285 7.3890560989 2.0085536923e1
|
||||
5.4598150033e1 1.4841315910e2 4.0342879349e2
|
||||
; printf("%g %g %g\n%g %g %g\n",
|
||||
exp(1), exp(2), exp(3), exp(4), exp(5), exp(6));
|
||||
2.718281828 7.389056099 20.08553692
|
||||
54.59815003 148.4131591 403.4287935
|
||||
|
||||
; config("display", 10),;
|
||||
; config("tilde", 0),;
|
||||
; printf("%f %f %f\n%f %f %f\n",
|
||||
exp(20), exp(21), exp(22), exp(23), exp(24), exp(25));
|
||||
485165195.4097902780 1318815734.4832146972 3584912846.1315915617
|
||||
9744803446.2489026000 26489122129.8434722941 72004899337.3858725242`
|
||||
; printf("%e %e %e\n%e %e %e\n",
|
||||
exp(20), exp(21), exp(22), exp(23), exp(24), exp(25));
|
||||
4.8516519541e8 1.3188157345e9 3.5849128461e9
|
||||
9.7448034462e9 2.6489122130e10 7.2004899337e10
|
||||
; printf("%g %g %g\n%g %g %g\n",
|
||||
exp(20), exp(21), exp(22), exp(23), exp(24), exp(25));
|
||||
485165195.4 1318815734 3584912846
|
||||
9744803446 2.648912213e10 7.200489934e10
|
||||
|
||||
; /*
|
||||
* NOTE: When displaying many digits after the decimal point
|
||||
* be sure to set display(digits) (see 'help display') to
|
||||
* large enough AND to set epsilon(eps) (see 'help epsilon')
|
||||
* small enough (or if the function has a esp argument,
|
||||
* give a eps argument that is small enough) to display
|
||||
* the value correctly.
|
||||
*/
|
||||
; config("tilde", 1),;
|
||||
|
||||
; /* NOTE: display has too few digits and epsilon is not small enough */
|
||||
; display(12),;
|
||||
; printf("%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; epsilon(1e-10),;
|
||||
; printf("%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
; /* NOTE: display has too few digits yet epsilon is small enough */
|
||||
; display(12),;
|
||||
; printf("%f\n", pi(1e-72));
|
||||
~3.141592653590
|
||||
; epsilon(1e-72),;
|
||||
; printf("%f\n", pi());
|
||||
~3.141592653590
|
||||
|
||||
; /* NOTE: display has enough digits but epsilon is not small enough */
|
||||
; display(72),;
|
||||
; printf("%f\n", pi(1e-10));
|
||||
3.1415926536
|
||||
; epsilon(1e-10),;
|
||||
; printf("%f\n", pi());
|
||||
3.1415926536
|
||||
|
||||
/* NOTE: display has enough digits and epsilon is small enough */
|
||||
; display(72),;
|
||||
; printf("%f\n", pi(1e-72));
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
; epsilon(1e-72),;
|
||||
; printf("%f\n", pi());
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406
|
||||
|
||||
LIMITS
|
||||
The number of arguments of printf() is not to exceed 1024.
|
||||
@@ -130,7 +229,7 @@ LINK LIBRARY
|
||||
none
|
||||
|
||||
SEE ALSO
|
||||
fprintf, strprintf, print
|
||||
config, display, epsilon, fprintf, strprintf
|
||||
|
||||
## Copyright (C) 1999-2006,2018 Landon Curt Noll
|
||||
##
|
||||
|
4
help/str
4
help/str
@@ -37,7 +37,7 @@ LIMITS
|
||||
|
||||
LINK LIBRARY
|
||||
void math_divertio();
|
||||
qprintnum(NUMBER *x, int outmode);
|
||||
qprintnum(NUMBER *x, int outmode, LEN outdigits);
|
||||
char *math_getdivertedio();
|
||||
|
||||
math_divertio();
|
||||
@@ -47,7 +47,7 @@ LINK LIBRARY
|
||||
SEE ALSO
|
||||
base, base2, config
|
||||
|
||||
## Copyright (C) 1999-2006 Landon Curt Noll
|
||||
## Copyright (C) 1999-2006,2018 Landon Curt Noll
|
||||
##
|
||||
## Calc is open software; you can redistribute it and/or modify it under
|
||||
## the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
|
@@ -18,22 +18,68 @@ EXAMPLE
|
||||
; strprintf("h=%d, i=%d", 2, 3);
|
||||
"h=2, i=3"
|
||||
|
||||
; c = config("epsilon", 1e-6); c = config("display", 6);
|
||||
; c = config("tilde", 1); c = config("outround", 0);
|
||||
; c = config("fullzero", 0);
|
||||
; config("epsilon", 1e-6),;
|
||||
; config("display", 6),;
|
||||
; config("tilde", 1),;
|
||||
; config("outround", 0),;
|
||||
; config("fullzero", 0),;
|
||||
; fmt = "%f,%10f,%-10f,%10.4f,%.4f,%.f.\n";
|
||||
; a = sqrt(3);
|
||||
; strprintf(fmt,a,a,a,a,a,a);
|
||||
"1.732051, 1.732051,1.732051 , ~1.7320,~1.7320,~1.
|
||||
"
|
||||
|
||||
; c = config("display", 50);
|
||||
; config("display", 50),;
|
||||
; fmt2 = "%g %g\n%g %g\n"
|
||||
; strprintf(fmt2, 1e5, 1e49, 1e50, 1e500);
|
||||
"100000 100000000000000000000000000000000000000000000000000
|
||||
1e50 1e500
|
||||
"
|
||||
|
||||
; /*
|
||||
* NOTE: When displaying many digits after the decimal point
|
||||
* be sure to set display(digits) (see 'help display') to
|
||||
* large enough AND to set epsilon(eps) (see 'help epsilon')
|
||||
* small enough (or if the function has a esp argument,
|
||||
* give a eps argument that is small enough) to display
|
||||
* the value correctly.
|
||||
*/
|
||||
; config("tilde", 1),;
|
||||
; config("tab", 0),;
|
||||
; fmt1 = "%f";
|
||||
|
||||
; /* NOTE: display has too few digits and epsilon is not small enough */
|
||||
; display(12),;
|
||||
; strprintf(fmt1, pi(1e-10));
|
||||
"3.1415926536"
|
||||
; epsilon(1e-10),;
|
||||
; strprintf(fmt1, pi());
|
||||
"3.1415926536"
|
||||
|
||||
; /* NOTE: display has too few digits yet epsilon is small enough */
|
||||
; display(12),;
|
||||
; strprintf(fmt1, pi(1e-72));
|
||||
"~3.141592653590"
|
||||
; epsilon(1e-72),;
|
||||
; strprintf(fmt1, pi());
|
||||
~3.141592653590
|
||||
|
||||
; /* NOTE: display has enough digits but epsilon is not small enough */
|
||||
; display(72),;
|
||||
; strprintf(fmt1, pi(1e-10));
|
||||
"3.1415926536"
|
||||
; epsilon(1e-10),;
|
||||
; strprintf(fmt1, pi());
|
||||
"3.1415926536"
|
||||
|
||||
/* NOTE: display has enough digits and epsilon is small enough */
|
||||
; display(72),;
|
||||
; strprintf(fmt1, pi(1e-72));
|
||||
"3.141592653589793238462643383279502884197169399375105820974944592307816406"
|
||||
; epsilon(1e-72),;
|
||||
; strprintf(fmt1, pi());
|
||||
"3.141592653589793238462643383279502884197169399375105820974944592307816406"
|
||||
|
||||
LIMITS
|
||||
The number of arguments of strprintf() is not to exceed 1024.
|
||||
|
||||
@@ -41,10 +87,9 @@ LINK LIBRARY
|
||||
none
|
||||
|
||||
SEE ALSO
|
||||
strcat, strcpy, strerror, strlen, strncmp, strncpy, strpos,
|
||||
strscan, strscanf, substr,
|
||||
|
||||
printf, fprintf, print
|
||||
config, display, epsilon, fprintf, strcat, strcpy, strerror,
|
||||
strlen, strncmp, strncpy, strpos, strscan, strscanf, substr,
|
||||
printf
|
||||
|
||||
## Copyright (C) 1999-2006,2018 Landon Curt Noll
|
||||
##
|
||||
|
14
hist.c
14
hist.c
@@ -51,6 +51,7 @@
|
||||
#endif
|
||||
|
||||
#include "calc.h"
|
||||
#include "lib_calc.h"
|
||||
#include "hist.h"
|
||||
#include "have_string.h"
|
||||
|
||||
@@ -1461,9 +1462,6 @@ quit_calc(void)
|
||||
*/
|
||||
|
||||
|
||||
/* name of history file */
|
||||
char *my_calc_history = NULL;
|
||||
|
||||
size_t
|
||||
hist_getline(char *prompt, char *buf, size_t len)
|
||||
{
|
||||
@@ -1504,8 +1502,8 @@ my_stifle_history (void)
|
||||
/* only save last number of entries */
|
||||
stifle_history(HISTORY_LEN);
|
||||
|
||||
if (my_calc_history)
|
||||
write_history(my_calc_history);
|
||||
if (calc_history)
|
||||
write_history(calc_history);
|
||||
}
|
||||
|
||||
|
||||
@@ -1519,10 +1517,12 @@ hist_init(char UNUSED *filename)
|
||||
using_history();
|
||||
|
||||
/* name of history file */
|
||||
my_calc_history = tilde_expand("~/.calc_history");
|
||||
if (calc_history == NULL) {
|
||||
calc_history = tilde_expand("~/.calc_history");
|
||||
}
|
||||
|
||||
/* read previous history */
|
||||
read_history(my_calc_history);
|
||||
read_history(calc_history);
|
||||
|
||||
atexit(my_stifle_history);
|
||||
|
||||
|
41
lib_calc.c
41
lib_calc.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* lib_calc - calc link library initialization and shutdown routines
|
||||
*
|
||||
* Copyright (C) 1999-2007 Landon Curt Noll
|
||||
* Copyright (C) 1999-2007,2018 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -145,6 +145,7 @@ char *calcbindings = NULL; /* $CALCBINDINGS or default */
|
||||
char *home = NULL; /* $HOME or default */
|
||||
char *pager = NULL; /* $PAGER or default */
|
||||
char *shell = NULL; /* $SHELL or default */
|
||||
char *calc_history = NULL; /* $CALCHISTFILE or ~/.calc_history */
|
||||
int stdin_tty = FALSE; /* TRUE if stdin is a tty */
|
||||
int havecommands = FALSE; /* TRUE if have one or more cmd args */
|
||||
long stoponerror = 0; /* >0 => stop, <0 => continue, ==0 => use -c */
|
||||
@@ -504,22 +505,36 @@ initenv(void)
|
||||
home = (c ? strdup(c) : NULL);
|
||||
#if defined(_WIN32)
|
||||
if (home == NULL || home[0] == '\0') {
|
||||
/* free home if it was previously allocated, but empty */
|
||||
if (home != NULL) {
|
||||
free(home);
|
||||
}
|
||||
/* just assume . is home if all else fails */
|
||||
home = ".";
|
||||
home = strdup(".");
|
||||
}
|
||||
#else /* Windoz free systems */
|
||||
if (home == NULL || home[0] == '\0') {
|
||||
size_t pw_dir_len;
|
||||
ent = (struct passwd *)getpwuid(geteuid());
|
||||
if (ent == NULL) {
|
||||
/* just assume . is home if all else fails */
|
||||
home = ".";
|
||||
/* free home if it was previously allocated, but empty */
|
||||
if (home != NULL) {
|
||||
free(home);
|
||||
}
|
||||
/* try using the home directory of current effective UID */
|
||||
ent = (struct passwd *)getpwuid(geteuid());
|
||||
if (ent == NULL || ent->pw_dir == NULL ||
|
||||
ent->pw_dir[0] == '\0') {
|
||||
/* just assume . is home if all else fails */
|
||||
home = strdup(".");
|
||||
} else {
|
||||
/* use home directory of current effective UID */
|
||||
home = strdup(ent->pw_dir);
|
||||
}
|
||||
pw_dir_len = strlen(ent->pw_dir);
|
||||
home = (char *)malloc(pw_dir_len+1);
|
||||
strncpy(home, ent->pw_dir, pw_dir_len+1);
|
||||
}
|
||||
#endif /* Windoz free systems */
|
||||
/* paranoia */
|
||||
if (home == NULL) {
|
||||
math_error("Unable to allocate string for $HOME");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
/* determine the $PAGER value */
|
||||
c = (no_env ? NULL : getenv(PAGER));
|
||||
@@ -532,6 +547,12 @@ initenv(void)
|
||||
shell = (c ? strdup(c) : NULL);
|
||||
if (shell == NULL || *shell == '\0')
|
||||
shell = DEFAULTSHELL;
|
||||
|
||||
/* determine the $CALCHISTFILE value */
|
||||
c = (no_env ? NULL : getenv(CALCHISTFILE));
|
||||
calc_history = (c ? strdup(c) : NULL);
|
||||
if (calc_history == NULL || *calc_history == '\0')
|
||||
calc_history = NULL; /* will use ~/.calc_history */
|
||||
}
|
||||
|
||||
|
||||
|
@@ -74,4 +74,9 @@ EXTERN int calc_print_scanwarn_msg;
|
||||
/* number of parse/scan warnings found */
|
||||
EXTERN unsigned long calc_warn_cnt;
|
||||
|
||||
/*
|
||||
* calc history file
|
||||
*/
|
||||
EXTERN char *calc_history;
|
||||
|
||||
#endif /* !INCLUDE_MATH_ERROR_H */
|
||||
|
@@ -92,12 +92,6 @@
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#if defined(__linux)
|
||||
# if !defined(isascii)
|
||||
E_FUNC int isascii(int c);
|
||||
# endif /* !isascii */
|
||||
#endif /* __linux */
|
||||
|
||||
char *program; /* our name */
|
||||
|
||||
int
|
||||
|
@@ -4104,6 +4104,7 @@ freenumbers(FUNC *fp)
|
||||
case OP_QUIT:
|
||||
freestringconstant(
|
||||
(long)fp->f_opcodes[pc]);
|
||||
break;
|
||||
}
|
||||
/*FALLTHRU*/
|
||||
case OPLOC:
|
||||
|
37
qio.c
37
qio.c
@@ -62,12 +62,13 @@ qprintf(char *fmt, ...)
|
||||
if (ch == '\\') {
|
||||
ch = *fmt++;
|
||||
switch (ch) {
|
||||
case 'a': ch = '\a'; break;
|
||||
case 'b': ch = '\b'; break;
|
||||
case 'f': ch = '\f'; break;
|
||||
case 'n': ch = '\n'; break;
|
||||
case 'r': ch = '\r'; break;
|
||||
case 't': ch = '\t'; break;
|
||||
case 'f': ch = '\f'; break;
|
||||
case 'v': ch = '\v'; break;
|
||||
case 'b': ch = '\b'; break;
|
||||
case 0:
|
||||
va_end(ap);
|
||||
return;
|
||||
@@ -143,6 +144,7 @@ qprintf(char *fmt, ...)
|
||||
case '-':
|
||||
sign = -1;
|
||||
ch = *fmt++;
|
||||
/*FALLTHRU*/
|
||||
default:
|
||||
if (('0' <= ch && ch <= '9') ||
|
||||
ch == '.' || ch == '*') {
|
||||
@@ -183,7 +185,7 @@ qprintf(char *fmt, ...)
|
||||
* Integers are always printed as themselves.
|
||||
*/
|
||||
void
|
||||
qprintnum(NUMBER *q, int outmode)
|
||||
qprintnum(NUMBER *q, int outmode, LEN outdigits)
|
||||
{
|
||||
NUMBER tmpval;
|
||||
long prec, exp;
|
||||
@@ -202,13 +204,13 @@ qprintnum(NUMBER *q, int outmode)
|
||||
|
||||
case MODE_REAL:
|
||||
prec = qdecplaces(q);
|
||||
if ((prec < 0) || (prec > conf->outdigits)) {
|
||||
if ((prec < 0) || (prec > outdigits)) {
|
||||
if (conf->tilde_ok)
|
||||
PUTCHAR('~');
|
||||
}
|
||||
if (conf->fullzero || (prec < 0) ||
|
||||
(prec > conf->outdigits))
|
||||
prec = conf->outdigits;
|
||||
(prec > outdigits))
|
||||
prec = outdigits;
|
||||
qprintff(q, 0L, prec);
|
||||
break;
|
||||
|
||||
@@ -225,7 +227,7 @@ qprintnum(NUMBER *q, int outmode)
|
||||
tmpval.num.sign = 0;
|
||||
exp = qilog10(&tmpval);
|
||||
if (exp == 0) { /* in range to output as real */
|
||||
qprintnum(q, MODE_REAL);
|
||||
qprintnum(q, MODE_REAL, outdigits);
|
||||
return;
|
||||
}
|
||||
tmpval.num = _one_;
|
||||
@@ -237,35 +239,22 @@ qprintnum(NUMBER *q, int outmode)
|
||||
q = qmul(q, &tmpval);
|
||||
zfree(tmpval.num);
|
||||
zfree(tmpval.den);
|
||||
qprintnum(q, MODE_REAL);
|
||||
qprintnum(q, MODE_REAL, outdigits);
|
||||
qfree(q);
|
||||
PRINTF1("e%ld", exp);
|
||||
break;
|
||||
|
||||
case MODE_REAL_AUTO:
|
||||
{
|
||||
/*
|
||||
* XXX - re-write to not modify conf->outdigits
|
||||
*
|
||||
* Modifying the configuration value could be dangerious
|
||||
* when a calculation is aborted within an opcode.
|
||||
* Better to use qprintfg() use inline code that
|
||||
* does not depend on changing conf->outdigits.
|
||||
*/
|
||||
const int P = conf->outdigits ? conf->outdigits : 1;
|
||||
long olddigits;
|
||||
tmpval = *q;
|
||||
tmpval.num.sign = 0;
|
||||
exp = qilog10(&tmpval);
|
||||
olddigits = conf->outdigits;
|
||||
if (P > exp && exp >= -P) {
|
||||
conf->outdigits = P - 1 - exp;
|
||||
qprintnum(q, MODE_REAL);
|
||||
qprintnum(q, MODE_REAL, P - 1 - exp);
|
||||
} else {
|
||||
conf->outdigits = P - 1;
|
||||
qprintnum(q, MODE_EXP);
|
||||
qprintnum(q, MODE_EXP, P - 1);
|
||||
}
|
||||
conf->outdigits = olddigits;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -288,7 +277,7 @@ qprintnum(NUMBER *q, int outmode)
|
||||
|
||||
if (outmode2 != MODE2_OFF) {
|
||||
PUTSTR(" /* ");
|
||||
qprintnum(q, outmode2);
|
||||
qprintnum(q, outmode2, outdigits);
|
||||
PUTSTR(" */");
|
||||
}
|
||||
}
|
||||
|
2
qmath.h
2
qmath.h
@@ -67,7 +67,7 @@ E_FUNC FULL qtou(NUMBER *q);
|
||||
E_FUNC SFULL qtos(NUMBER *q);
|
||||
E_FUNC long qparse(char *str, int flags);
|
||||
E_FUNC void qfreenum(NUMBER *q);
|
||||
E_FUNC void qprintnum(NUMBER *q, int mode);
|
||||
E_FUNC void qprintnum(NUMBER *q, int mode, LEN outdigits);
|
||||
E_FUNC void qprintff(NUMBER *q, long width, long precision);
|
||||
E_FUNC void qprintfe(NUMBER *q, long width, long precision);
|
||||
E_FUNC void qprintfr(NUMBER *q, long width, BOOL force);
|
||||
|
2
qmod.c
2
qmod.c
@@ -404,7 +404,7 @@ showredcdata(void)
|
||||
for (i = 0, rcp = redc_cache; i < MAXREDC; i++, rcp++) {
|
||||
if (rcp->age > 0) {
|
||||
printf("%-8ld%-8ld", i, rcp->age);
|
||||
qprintnum(rcp->rnum, 0);
|
||||
qprintnum(rcp->rnum, 0, conf->outdigits);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
19
str.c
19
str.c
@@ -1380,17 +1380,17 @@ printechar(char *c)
|
||||
math_chr('\\');
|
||||
ech = 0;
|
||||
switch (ch) {
|
||||
case '\a': ech = 'a'; break;
|
||||
case '\b': ech = 'b'; break;
|
||||
case '\f': ech = 'f'; break;
|
||||
case '\n': ech = 'n'; break;
|
||||
case '\r': ech = 'r'; break;
|
||||
case '\t': ech = 't'; break;
|
||||
case '\b': ech = 'b'; break;
|
||||
case '\f': ech = 'f'; break;
|
||||
case '\v': ech = 'v'; break;
|
||||
case '\\': ech = '\\'; break;
|
||||
case '\"': ech = '\"'; break;
|
||||
case '\'': ech = '\''; break;
|
||||
case 0: ech = '0'; break;
|
||||
case 7: ech = 'a'; break;
|
||||
case 27: ech = 'e'; break;
|
||||
}
|
||||
if (ech == '0') {
|
||||
@@ -1438,8 +1438,17 @@ fitstring(char *str, long len, long width)
|
||||
continue;
|
||||
n++;
|
||||
switch (ch) {
|
||||
case '\n': case '\r': case '\t': case '\b': case '\f':
|
||||
case '\v': case '\\': case '\"': case 7: case 27:
|
||||
case '\a':
|
||||
case '\b':
|
||||
case '\f':
|
||||
case '\n':
|
||||
case '\r':
|
||||
case '\t':
|
||||
case '\v':
|
||||
case '\\':
|
||||
case '\"':
|
||||
case '\'':
|
||||
case 27:
|
||||
continue;
|
||||
}
|
||||
if (ch >= 64 || (nch >= '0' && nch <= '7')) {
|
||||
|
9
token.c
9
token.c
@@ -183,10 +183,12 @@ gettoken(void)
|
||||
}
|
||||
switch (ch) {
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\r':
|
||||
case '\v':
|
||||
case '\a':
|
||||
case '\b':
|
||||
case '\f':
|
||||
case '\r':
|
||||
case '\t':
|
||||
case '\v':
|
||||
case '\0':
|
||||
break;
|
||||
case '\n':
|
||||
@@ -445,6 +447,7 @@ eatstring(int quotechar)
|
||||
case '\n':
|
||||
if (!newlines)
|
||||
break;
|
||||
/*FALLTHRU*/
|
||||
case EOF:
|
||||
reread();
|
||||
scanerror(T_NULL,
|
||||
|
10
value.c
10
value.c
@@ -1879,9 +1879,9 @@ powvalue(VALUE *v1, VALUE *v2, VALUE *vres)
|
||||
*vres = error_value(E_1OVER0);
|
||||
break;
|
||||
}
|
||||
/* 0 ^ non-neg is zero, including 0^0 */
|
||||
/* 0 ^ non-neg is 1, including 0^0 */
|
||||
vres->v_type = V_NUM;
|
||||
vres->v_num = qlink(&_qzero_);
|
||||
vres->v_num = qlink(&_qone_);
|
||||
} else if (qisint(real_v2)) {
|
||||
vres->v_num = qpowi(v1->v_num, real_v2);
|
||||
} else {
|
||||
@@ -2774,7 +2774,7 @@ printvalue(VALUE *vp, int flags)
|
||||
}
|
||||
switch (type) {
|
||||
case V_NUM:
|
||||
qprintnum(vp->v_num, MODE_DEFAULT);
|
||||
qprintnum(vp->v_num, MODE_DEFAULT, conf->outdigits);
|
||||
if (conf->traceflags & TRACE_LINKS)
|
||||
math_fmt("#%ld", vp->v_num->links);
|
||||
break;
|
||||
@@ -2835,7 +2835,7 @@ printvalue(VALUE *vp, int flags)
|
||||
if (userfunc("octet_print", vp))
|
||||
break;
|
||||
qtemp = itoq((long) *vp->v_octet);
|
||||
qprintnum(qtemp, MODE_DEFAULT);
|
||||
qprintnum(qtemp, MODE_DEFAULT, conf->outdigits);
|
||||
qfree(qtemp);
|
||||
break;
|
||||
case V_OPTR:
|
||||
@@ -2888,7 +2888,7 @@ printestr(VALUE *vp)
|
||||
math_chr('"');
|
||||
return;
|
||||
case V_NUM:
|
||||
qprintnum(vp->v_num, MODE_FRAC);
|
||||
qprintnum(vp->v_num, MODE_FRAC, conf->outdigits);
|
||||
return;
|
||||
case V_COM:
|
||||
mode = math_setmode(MODE_FRAC);
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* version - determine the version of calc
|
||||
*
|
||||
* Copyright (C) 1999-2018 David I. Bell and Landon Curt Noll
|
||||
* Copyright (C) 1999-2021 David I. Bell and Landon Curt Noll
|
||||
*
|
||||
* Primary author: David I. Bell
|
||||
*
|
||||
@@ -44,8 +44,8 @@ static char *program;
|
||||
|
||||
#define MAJOR_VER 2 /* major library version */
|
||||
#define MINOR_VER 12 /* minor library version */
|
||||
#define MAJOR_PATCH 6 /* major software level under library version */
|
||||
#define MINOR_PATCH 9 /* minor software level or 0 if not patched */
|
||||
#define MAJOR_PATCH 7 /* major software level under library version */
|
||||
#define MINOR_PATCH 6 /* minor software level or 0 if not patched */
|
||||
|
||||
|
||||
/*
|
||||
@@ -69,7 +69,7 @@ STATIC char *stored_version = NULL; /* version formed if != NULL */
|
||||
char *Copyright = "\n"
|
||||
"calc - arbitrary precision calculator\n"
|
||||
"\n"
|
||||
"Copyright (C) 1999-2017 David I. Bell, Landon Curt Noll "
|
||||
"Copyright (C) 1999-2021 David I. Bell, Landon Curt Noll "
|
||||
"and Ernest Bowen\n"
|
||||
"\n"
|
||||
"Initial author: David I. Bell\n"
|
||||
|
Reference in New Issue
Block a user