Compare commits

..

141 Commits

Author SHA1 Message Date
Landon Curt Noll
25dcd8cb80 Release v2.14.1.1
The following are the changes in this release:

    Added a few remarks on calc version numbers to version.c.

    Fixed how fposval.h is built.  On a number of systems, the fposval.c
    file failed to compile incorrectly.  This caused problems for systems in
    which fposval.h.def was not correct.

    Fixed how have_memmv.h is built.  On a number of systems, the have_memmv.c
    file failed to compile incorrectly, producing a potentially incorrect
    have_memmv.h file for such systems.

    Fixed how align32.h is built.  On a number of systems, the align32.c
    file failed to compile incorrectly, producing a potentially incorrect
    align32.h file for such systems.

    Fixed how have_newstr.h is built.  On a number of systems, the have_newstr.c
    failed to compile incorrectly, producing a potentially incorrect
    have_newstr.h file for such systems.

    Fixed how have_strdup.h is built.  On a number of systems, the have_strdup.c
    file failed to compile incorrectly, producing a potentially incorrect
    have_strdup.h file for such systems.

    Fixed how have_strlcat.h is built.  On a number of systems, the have_strlcat.c
    file failed to compile incorrectly, producing a potentially incorrect
    have_strlcat.h file for such systems.

    Fixed how have_strlcpy.h is built.  On a number of systems, the have_strlcpy.c
    file failed to compile incorrectly, producing a potentially incorrect
    have_strlcpy.h file for such systems.

    Fixed how have_uid_t.h is built.  On a number of systems, the have_uid_t.c
    file failed to compile incorrectly, producing a potentially incorrect
    have_uid_t.h file for such systems.

    Fixed how have_uid_t.h is built.  On a number of systems, the have_uid_t.c
    file failed to compile incorrectly, producing a potentially incorrect
    have_uid_t.h file for such systems.
2022-11-27 13:41:32 -08:00
Landon Curt Noll
3b3bfb3f74 Proposed changes for v2.14.1.1
Added a few remarks on calc version numbers to version.c.

Fixed how fposval.h is built.  On a number of systems, the fposval.c
file failed to compile incorrectly.  This caused problems for systems in
which fposval.h.def was not correct.

Fixed how have_memmv.h is built.  On a number of systems, the have_memmv.c
file failed to compile incorrectly, producing a potentially incorrect
have_memmv.h file for such systems.

Fixed how align32.h is built.  On a number of systems, the align32.c
file failed to compile incorrectly, producing a potentially incorrect
align32.h file for such systems.

Fixed how have_newstr.h is built.  On a number of systems, the have_newstr.c
failed to compile incorrectly, producing a potentially incorrect
have_newstr.h file for such systems.

Fixed how have_strdup.h is built.  On a number of systems, the have_strdup.c
file failed to compile incorrectly, producing a potentially incorrect
have_strdup.h file for such systems.

Fixed how have_strlcat.h is built.  On a number of systems, the have_strlcat.c
file failed to compile incorrectly, producing a potentially incorrect
have_strlcat.h file for such systems.

Fixed how have_strlcpy.h is built.  On a number of systems, the have_strlcpy.c
file failed to compile incorrectly, producing a potentially incorrect
have_strlcpy.h file for such systems.

Fixed how have_uid_t.h is built.  On a number of systems, the have_uid_t.c
file failed to compile incorrectly, producing a potentially incorrect
have_uid_t.h file for such systems.

Fixed how have_uid_t.h is built.  On a number of systems, the have_uid_t.c
file failed to compile incorrectly, producing a potentially incorrect
have_uid_t.h file for such systems.
2022-11-27 13:28:32 -08:00
Landon Curt Noll
3e4391e2af Fix another comment in comma.cal 2022-06-20 19:39:11 -07:00
Landon Curt Noll
cfc6a6669c Improve comments in comma.cal 2022-06-20 19:36:54 -07:00
Landon Curt Noll
fa457db3cd Fix more comments in cal/comma.cal 2022-06-20 19:30:45 -07:00
Landon Curt Noll
d08b958a15 Fix typo in comma.cal comment 2022-06-20 19:28:16 -07:00
Landon Curt Noll
5f28e5b851 Removed training newline from fprint_comma in comma.cal 2022-06-20 19:26:35 -07:00
Landon Curt Noll
8dc52a532a Fix comma.cal to avoid leading 0's and tilde's 2022-06-20 19:20:34 -07:00
Landon Curt Noll
6fc14730c0 Fix the forming of fraction part in comma.cal 2022-06-20 19:10:20 -07:00
Landon Curt Noll
b97093e58c Fix calc man page \-escape, add cal/comma.cal
Fixed a \-escape bug in calc(1) man page.

Added cal/comma.cal:

    Convert numbers into strings with 3-digit group and integer-fraction
    separators.

    If the value is an integer, the integer-fraction separator is not used.

    str_comma(x, [group, [decimal]])

	Convert x into a string.

	If group is given and is a string, group will be used as
	the 3-digit group separator, otherwise the default 3-digit
	group separator will be used.

	If decimal is given and is a string, group will be used as
	the integer-fraction separator, otherwise the default
	integer-fraction separator will be used.

	The decimal and group arguments are optional.

    set_default_group_separator(group)

	Change the default 3-digit group separator if group is a string,
	otherwise the default 3-digit group separator will not be
	changed.  Return the old 3-digit group separator.

    set_default_decimal_separator(decimal)

	Change the default 3-digit group separator if decimal is a
	string, otherwise the default integer-fraction separator
	will not be changed.  Return the old integer-fraction separator.

    print_comma(x, [group, [decimal]])

	Print the value produced by str_comma(x, [group, [decimal]])
	followed by a newline.

	If the str_comma() does not return a string, nothing is printed.

	The decimal and group arguments are optional.

	The value produced by str_comma() is returned.

    fprint_comma(fd, x, [group, [decimal]])

	Print the value produced by str_comma(x, [group, [decimal]]),
	without a trailing newline, on file fd.

	If the str_comma() does not return a string, nothing is printed.

	If fd is not an open file, nothing is printed.

	The decimal and group arguments are optional.

	The value produced by str_comma() is returned.
2022-06-20 18:25:12 -07:00
Landon Curt Noll
923c36e475 Remove excess whitespace under SECURITY.md 2022-04-08 00:24:42 -07:00
Landon Curt Noll
741ea46853 Release v2.14.1.0
The following are the changes from calc version 2.14.1.0 to date:

    Fixed alignment of show item section of help command.

    Bug fix: While 0^0 == 1, now for y > 0, 0^y == 0.
    Adjusted cal/test8900.cal to reflect this bug fix.
    Added tests to cal/regress.cal to help verify bug fix is fixed.
2022-04-08 00:02:44 -07:00
Landon Curt Noll
56b6613da8 Fixed 0^y for y > 0
While 0^0 == 1, now for y > 0, 0^y == 0.

Adjusted cal/test8900.cal to reflect the this bug fix.

Added tests to cal/regress.cal to help verify bug fix is fixed.
2022-04-07 23:54:06 -07:00
Landon Curt Noll
e9eef2dfa2 Merge branch 'master' of github.com:lcn2/calc 2022-04-07 23:44:38 -07:00
Landon Curt Noll
0dbf258696 Fixed alignment of show item section of help command 2022-04-07 23:44:05 -07:00
Landon Curt Noll
f6d558783a Improved security issue template
create a calc GitHub repo issue for a security issue
2022-02-24 13:58:56 -08:00
Landon Curt Noll
6f27a32f79 Calc bug report template version: 1.2 2022-02-24
Added template version and made a minor edit
2022-02-24 12:42:32 -08:00
Landon Curt Noll
d58f605866 Update issue templates
Updated calc Bug report
2022-02-24 12:30:36 -08:00
Landon Curt Noll
b83c5be515 Update issue templates
Add default GitHub Bug and Feature templates
2022-02-15 13:35:46 -08:00
Landon Curt Noll
561928a45c Checkpint disbale use of gettime() under _WIN32 or _WIN64 2022-02-12 13:52:06 -08:00
Landon Curt Noll
7f89af37f5 Checkpoint more Windows 11 Cygwin MINGW64 changes 2022-02-12 13:41:16 -08:00
Landon Curt Noll
4470f1f62e Checkpoint - Windows 11 with Cygwin and MinGW64 packages. 2022-02-12 12:44:32 -08:00
Landon Curt Noll
8217c49b94 Fix lack of quotes in PASSDOWN variables 2022-02-12 11:37:53 -08:00
Landon Curt Noll
d2cb03b4cc Add ${MSYS} to Makefile for Windows 11 MINGW64_NT users 2022-02-12 11:18:49 -08:00
Landon Curt Noll
80f13a4e45 Changed Makefiles as per make depend 2022-01-22 02:52:02 -08:00
Landon Curt Noll
1658343227 Changes to use attributes for noreturn and printf-like functions 2022-01-22 02:48:50 -08:00
Landon Curt Noll
3f177f2d81 Improved source code flow
Changed /*NOTREACHED*/ to not_reached(); and use "attribute.h".

Added .PHONY rule, just after all rule, to Makefiles.

Fixed an improper indentation issue.
2022-01-22 01:16:07 -08:00
Landon Curt Noll
dcd5a987af Added better examples of asan debugging use with gcc and clang 2022-01-13 11:11:32 -08:00
Landon Curt Noll
cb77888045 Expand certain table sizes, add comments to Makefile.local
Expanded the globalsymbol string table size: from 1024 to 65536.

    Expanded the how often to reallocate string table is performed:
    from 100 to 1024.

    Expanded the number env_pool elements to allocate at a time:
    from 10 to 256.

    Improve comments on Makefile.local and add a few more examples
    of how it might be used.
2022-01-02 18:01:21 -08:00
Landon Curt Noll
ce17b267be Minor changes to Makefile, HOWTO.INSTALL, CONTRIBUTING.md
Changed Makefile to set shell before setting the SHELL Makefile
    variable.

    Added text to HOWTO.INSTALL to help people with systems that
    lack the readline package.

    Trimmed long line in the CONTRIBUTING.md file.
2021-12-29 15:16:40 -08:00
Landon Curt Noll
738dd0334e Create CONTRIBUTING.md
Create initial CONTRIBUTING.md file.
2021-12-27 20:01:26 -08:00
Landon Curt Noll
7ba1dbdc65 Create CODE_OF_CONDUCT.md
Initial release of CODE_OF_CONDUCT.md
2021-12-27 19:56:02 -08:00
Landon Curt Noll
ee70c12481 Release v2.14.0.14
The following are the changes in this release:

    Fixed typo in Makefile.local comment.

    Established a tagging procedure for a production release.
    Production git tags will be of the form:

	prod-2.x.y.z
2021-12-27 19:10:56 -08:00
Landon Curt Noll
d4970d66ce Merge branch 'master' of github.com:lcn2/calc 2021-12-27 19:04:53 -08:00
Landon Curt Noll
c3ea3d28a4 Added 2.14.0.14 CHANGES 2021-12-27 19:04:08 -08:00
Landon Curt Noll
3fa34dabfe Fixed typo in comment for Makefile.local 2021-12-13 22:12:03 -08:00
Landon Curt Noll
ffd4422870 Release v2.14.0.13
We apologize for the calc v2.14.0.12 source tarball that was missing
critical files.  While the executable was well tested, our release
process was deficient.

We are improved our release process and added tests during the release
procedure to help verify that we are not regressing in to the
"v2.14.0.12 source tarball" issue, among other things.

Depending on how things do, you might is several releases come out over
a short period of time.  The core of calc isn't changing, so the calc
executable will be the same as we focus on the Makefiles, our release
procedure, and related documentation / help files.

Removed constructed help file that incorrectly added as a src file.

=-=

The following are the changes in this release:

    Made major changes to our release process in order to avoid
    missing critical files that happened in calc v2.4.0.12.

    Minor tweak to seed() builtin.  Updated help/srand and help/srandom.

    Moved Makefile.ship into Makefile.

    Removed custom/Makefile.head and custom/Makefile.tail.

    The custom/Makefile is now part of source and includes Makefile.
    In particular, custom/Makefile makes use of the 'middle' of
    the new top level Makefile where calc's top level Makefile
    variables are defined.

    Makefile.simple and custom/Makefile.simple are now part of the source
    and are constructed from Makefile and custom/Makefile respectively.
    The Makefile.simple and custom/Makefile.simple avoid using GNU
    conditionals. They may be used with older/classic make commands.

    Makefile.local will include comments about how to better use
    it. Between releases, Makefile.local at the top of the master branch
    will contain how we typically build calc and test calc (FYI: we
    normally enable things such as -Werror -Wextra -pedantic).  When we
    push out a release, Makefile.local will be stripped of non-comment
    lines.  Thus, releases of calc, and, released "calc*.src.rpm"
    files and the source tarballs, will have a Makefile.local with
    only comments.

    The "README.*" files and "HOWTO.INSTALL" file have been updated.

    By default, compiler warnings have been turned up.  The Makefile
    variable ${CCWARN} now defaults to:

	CCWARN= -Wall -Wextra -pedantic

    The previous level of compiler warnings can be easily restored by
    adding to Makefile.local:

	CCWARN:= -Wall

    The readline, history and ncurses libraries are now default.
    The Makefile variables ${USE_READLINE}, ${READLINE_LIB}, and
    ${READLINE_EXTRAS} now default to:

	USE_READLINE= -DUSE_READLINE
	READLINE_LIB= -lreadline
	READLINE_EXTRAS= -lhistory -lncurses

    The previous mode where readline, history and ncurses libraries
    were not compiled in by default can be easily restored by
    adding to Makefile.local:

	USE_READLINE:=
	READLINE_LIB:=
	READLINE_EXTRAS:=

    We have renamed "stable" as "production".
    We have renamed "unstable" as "tested".

    On the web site:

	http://www.isthe.com/chongo/src/calc/

    these files has been renamed:

	2.x.y.z_IS_LATEST_STABLE   ==> 2.x.y.z_IS_LATEST_PRODUCTION
	2.x.y.z_IS_LATEST_UNSTABLE ==> 2.x.y.z_IS_LATEST_TESTED

    The terms 'stable' and 'unstable' were both misleading and
    inaccurate.  For details see the new documention file:

	README.RELEASE

    See also the help command:

	; help release

    Fixed bug impacting how have_ustat.h was formed.

    Updated help/archive, BUGS, HOWTO.INSTALL to reflect GitHub use.
2021-12-13 17:41:35 -08:00
Landon Curt Noll
b5b2c3f812 Updated CHANGES to reflect recent commits 2021-12-13 17:00:01 -08:00
Landon Curt Noll
f7dadbf1f8 Improve how Makefiles are formed, updated related doc 2021-12-13 16:54:45 -08:00
Landon Curt Noll
22e123140c Fix to add missing Makefiles to distlist
The output of the distlist rule was used to form the source tarball.
2021-12-13 16:27:37 -08:00
Landon Curt Noll
1242700601 Fix how Makefile.simple and custom/Makefile.simple are formed 2021-12-13 16:11:38 -08:00
Landon Curt Noll
5b7dfeaf11 Release v2.14.0.13
We apologize for the calc v2.14.0.12 source tarball that was missing
critical files.  While the executable was well tested, our release
process was deficient.

We are improved our release process and added tests during the release
procedure to help verify that we are not regressing in to the "v2.14.0.12
source tarball" issue, among other things.

Depending on how things do, you might is several releases come out over
a short period of time.  The core of calc isn't changing, so the calc
executable will be the same as we focus on the Makefiles, our release
procedure, and related documentation / help files.

Removed constructed help file that incorrectly added as a src file.

=-=

The following are the changes in this release:

    Minor tweak to seed() builtin.  Updated help/srand and help/srandom.

    Moved Makefile.ship into Makefile.

    Removed custom/Makefile.head and custom/Makefile.tail.

    The custom/Makefile is now part of source and includes Makefile.
    In particular, custom/Makefile makes use of the 'middle' of
    the new top level Makefile where calc's top level Makefile
    variables are defined.

    Makefile.simple and custom/Makefile.simple are now part of the source
    and are constructed from Makefile and custom/Makefile respectively.
    The Makefile.simple and custom/Makefile.simple avoid using GNU
    conditionals. They may be used with older/classic make commands.

    Makefile.local will include comments about how to better use
    it. Between releases, Makefile.local at the top of the master branch
    will contain how we typically build calc and test calc (FYI: we
    normally enable things such as -Werror -Wextra -pedantic).  When we
    push out a release, Makefile.local will be stripped of non-comment
    lines.  Thus, releases of calc, and, released "calc*.src.rpm"
    files and the source tarballs, will have a Makefile.local with
    only comments.

    The "README.*" files and "HOWTO.INSTALL" file have been updated.

    By default, compiler warnings have been turned up.  The Makefile
    variable ${CCWARN} now defaults to:

	CCWARN= -Wall -Wextra -pedantic

    The previous level of compiler warnings can be easily restored by
    adding to Makefile.local:

	CCWARN:= -Wall

    The readline, history and ncurses libraries are now default.
    The Makefile variables ${USE_READLINE}, ${READLINE_LIB}, and
    ${READLINE_EXTRAS} now default to:

	USE_READLINE= -DUSE_READLINE
	READLINE_LIB= -lreadline
	READLINE_EXTRAS= -lhistory -lncurses

    The previous mode where readline, history and ncurses libraries
    were not compiled in by default can be easily restored by
    adding to Makefile.local:

	USE_READLINE:=
	READLINE_LIB:=
	READLINE_EXTRAS:=

    We have renamed "stable" as "production".
    We have renamed "unstable" as "tested".

    On the web site:

	http://www.isthe.com/chongo/src/calc/

    these files has been renamed:

	2.x.y.z_IS_LATEST_STABLE   ==> 2.x.y.z_IS_LATEST_PRODUCTION
	2.x.y.z_IS_LATEST_UNSTABLE ==> 2.x.y.z_IS_LATEST_TESTED

    The terms 'stable' and 'unstable' were both misleading and
    inaccurate.  For details see the new documention file:

	README.RELEASE

    See also the help command:

	; help release

    Fixed bug impacting how have_ustat.h was formed.

    Updated help/archive to reflect GitHub use.
2021-12-13 14:43:37 -08:00
Landon Curt Noll
b3c015d338 Release v2.14.0.13
We apologize for the calc v2.14.0.12 source tarball that was missing
critical files.  While the executable was well tested, our release
process was deficient.

We are improved our release process and added tests during the release
procedure to help verify that we are not regressing in to the "v2.14.0.12
source tarball" issue, among other things.

Depending on how things do, you might is several releases come out over
a short period of time.  The core of calc isn't changing, so the calc
executable will be the same as we focus on the Makefiles, our release
procedure, and related documentation / help files.

=-=

The following are the changes in this release:

    Minor tweak to seed() builtin.  Updated help/srand and help/srandom.

    Moved Makefile.ship into Makefile.

    Removed custom/Makefile.head and custom/Makefile.tail.

    The custom/Makefile is now part of source and includes Makefile.
    In particular, custom/Makefile makes use of the 'middle' of
    the new top level Makefile where calc's top level Makefile
    variables are defined.

    Makefile.simple and custom/Makefile.simple are now part of the source
    and are constructed from Makefile and custom/Makefile respectively.
    The Makefile.simple and custom/Makefile.simple avoid using GNU
    conditionals. They may be used with older/classic make commands.

    Makefile.local will include comments about how to better use
    it. Between releases, Makefile.local at the top of the master branch
    will contain how we typically build calc and test calc (FYI: we
    normally enable things such as -Werror -Wextra -pedantic).  When we
    push out a release, Makefile.local will be stripped of non-comment
    lines.  Thus, releases of calc, and, released "calc*.src.rpm"
    files and the source tarballs, will have a Makefile.local with
    only comments.

    The "README.*" files and "HOWTO.INSTALL" file have been updated.

    By default, compiler warnings have been turned up.  The Makefile
    variable ${CCWARN} now defaults to:

	CCWARN= -Wall -Wextra -pedantic

    The previous level of compiler warnings can be easily restored by
    adding to Makefile.local:

	CCWARN:= -Wall

    The readline, history and ncurses libraries are now default.
    The Makefile variables ${USE_READLINE}, ${READLINE_LIB}, and
    ${READLINE_EXTRAS} now default to:

	USE_READLINE= -DUSE_READLINE
	READLINE_LIB= -lreadline
	READLINE_EXTRAS= -lhistory -lncurses

    The previous mode where readline, history and ncurses libraries
    were not compiled in by default can be easily restored by
    adding to Makefile.local:

	USE_READLINE:=
	READLINE_LIB:=
	READLINE_EXTRAS:=

    We have renamed "stable" as "production".
    We have renamed "unstable" as "tested".

    On the web site:

	http://www.isthe.com/chongo/src/calc/

    these files has been renamed:

	2.x.y.z_IS_LATEST_STABLE   ==> 2.x.y.z_IS_LATEST_PRODUCTION
	2.x.y.z_IS_LATEST_UNSTABLE ==> 2.x.y.z_IS_LATEST_TESTED

    The terms 'stable' and 'unstable' were both misleading and
    inaccurate.  For details see the new documention file:

	README.RELEASE

    See also the help command:

	; help release

    Fixed bug impacting how have_ustat.h was formed.

    Updated help/archive to reflect GitHub use.
2021-12-13 14:23:47 -08:00
Landon Curt Noll
5985ad2f33 Updated Makefile.simple due to recent changes in Makefile 2021-12-13 14:16:02 -08:00
Landon Curt Noll
e401c9abf1 Added code to handle HomeBrew macOS libs, added a few #'s 2021-12-13 14:07:51 -08:00
Landon Curt Noll
ad79b6384d Remove leading spaces before a tab in CHANGES 2021-12-13 12:33:35 -08:00
Landon Curt Noll
862dbd6777 Improve the calc build and release process
We apologize for the calc v2.14.0.12 source tarball that was missing
critical files.  While the executable was well tested, our release
process was deficient.

We are improved our release process and added tests during the release
procedure to help verify that we are not regressing in to the "v2.14.0.12
source tarball" issue, among other things.

Depending on how things do, you might is several releases come out over
a short period of time.  The core of calc isn't changing, so the calc
executable will be the same as we focus on the Makefiles, our release
procedure, and related documentation / help files.

We made several changes to the Makefiles.  We also added a new
README.RELEASE document (see "help release") that is a work in
progress. Along the way we discovered a few things that needed to be
updated in documentation.

See the CHANGES file for details.
2021-12-13 12:17:51 -08:00
Landon Curt Noll
0d31eb6828 Recommend calling srand() or srandom() with seed() 2021-12-09 01:34:58 -08:00
Landon Curt Noll
c0be37d4e3 Added paranoia size limited code for seed() builtin.
Just to be padanticly sure, we prevent seed() from
ever returning a value >= 2^64.
2021-12-09 01:12:44 -08:00
Landon Curt Noll
4344532c28 Improve how a seed is loaded into ZVALUE 2021-12-09 00:49:16 -08:00
Landon Curt Noll
0f6efb29bb Release v2.14.0.12
The following are the changes in this release:

    Fixed a number of typos.

    Drop support for SunOS, IRIX and MINGW32_NT-5.0 targets.
    Drop support for CLOCK_SGI_CYCLE.  Drop testing for __MSDOS__.

    Minor improvement of various help files.  Made format of help
    files more consistent.

    Corrected a few comments in zrandom.c, including a case where
    the comment referred to 1007 when it should have used 2^32.

    Improved seed() generation.  Improved some comments in seed.c.
    Added have_environ.c to build have_environ.h in order to
    determine if:

	extern char **environ;	/* user environment */

    is an valid external symbol.

    Fixed documentation that referred to the old additive 55
    generator.  We have been using the subtractive 100 in place
    of the additive 55 generator for a while now.

    Fixed depend rule for custom/Makefile.

    Fixed how Makefile variable SHELL is set on macOS vs. Linux.
    Using /bin/sh on macOS due to how zsh treats globs by default.

    Added charbit.h to define CALC_CHARBIT which is either CHAR_BIT
    from <limits.h> or 8 or a value set by the Makefile variable
    CALC_CHARBIT.  Added have_limits.h to determine if <limits.h>
    is a system include file.

    Compiling now tests for _WIN64 as well when testing for _WIN32.

    Now assuming that <stdio.h> is available under _WIN32 and _WIN64.

    Added some preliminary notes about attempts to compile calc
    under Windows 11.

	BTW: While we are unable to use Windows 11, we welcome
	     Windows 11 developers to try compiling calc natively
	     (instead of via a Linux virtual machine).  If you are
	     able to compile Windows 11 natively, we would welcome
	     GitHub pull requests showing any needed modifications:

		https://github.com/lcn2/calc/pulls

	     Please also add notes to the 'Compiling calc under Windows 11'
	     section in README.WINDOWS file.

    We added Makefile.simple as part of the master branch source
    to help those who may be using a make tool that does not support
    GNU Make-like features such as "ifeq" and ":=".

    Fixed incorrect ustat_dev member ref in seed() builtin that
    was part of the unreleased calc v2.12.0.11.
2021-12-08 16:04:40 -08:00
Landon Curt Noll
39c0cba1ca Release v2.14.0.12
The following are the changes in this release:

    Fixed a number of typos.

    Drop support for SunOS, IRIX and MINGW32_NT-5.0 targets.
    Drop support for CLOCK_SGI_CYCLE.  Drop testing for __MSDOS__.

    Minor improvement of various help files.  Made format of help
    files more consistent.

    Corrected a few comments in zrandom.c, including a case where
    the comment referred to 1007 when it should have used 2^32.

    Improved seed() generation.  Improved some comments in seed.c.
    Added have_environ.c to build have_environ.h in order to
    determine if:

	extern char **environ;	/* user environment */

    is an valid external symbol.

    Fixed documentation that referred to the old additive 55
    generator.  We have been using the subtractive 100 in place
    of the additive 55 generator for a while now.

    Fixed depend rule for custom/Makefile.

    Fixed how Makefile variable SHELL is set on macOS vs. Linux.
    Using /bin/sh on macOS due to how zsh treats globs by default.

    Added charbit.h to define CALC_CHARBIT which is either CHAR_BIT
    from <limits.h> or 8 or a value set by the Makefile variable
    CALC_CHARBIT.  Added have_limits.h to determine if <limits.h>
    is a system include file.

    Compiling now tests for _WIN64 as well when testing for _WIN32.

    Now assuming that <stdio.h> is available under _WIN32 and _WIN64.

    Added some preliminary notes about attempts to compile calc
    under Windows 11.

	BTW: While we are unable to use Windows 11, we welcome
	     Windows 11 developers to try compiling calc natively
	     (instead of via a Linux virtual machine).  If you are
	     able to compile Windows 11 natively, we would welcome
	     GitHub pull requests showing any needed modifications:

		https://github.com/lcn2/calc/pulls

	     Please also add notes to the 'Compiling calc under Windows 11'
	     section in README.WINDOWS file.

    We added Makefile.simple as part of the master branch source
    to help those who may be using a make tool that does not support
    GNU Make-like features such as "ifeq" and ":=".

    Fixed incorrect ustat_dev member ref in seed() builtin that
    was part of the unreleased calc v2.12.0.11.
2021-12-08 15:52:34 -08:00
Landon Curt Noll
a68e41248f Fixed incorrect ustat_dev member ref in seed() 2021-12-08 15:43:27 -08:00
Landon Curt Noll
e213cc5072 Release v2.14.0.11
The following are the changes in this release:

    Fixed a number of typos.

    Drop support for SunOS, IRIX and MINGW32_NT-5.0 targets.
    Drop support for CLOCK_SGI_CYCLE.  Drop testing for __MSDOS__.

    Minor improvement of various help files.  Made format of help
    files more consistent.

    Corrected a few comments in zrandom.c, including a case where
    the comment referred to 1007 when it should have used 2^32.

    Improved seed() generation.  Improved some comments in seed.c.
    Added have_environ.c to build have_environ.h in order to
    determine if:

	extern char **environ;	/* user environment */

    is an valid external symbol.

    Fixed documentation that referred to the old additive 55
    generator.  We have been using the subtractive 100 in place
    of the additive 55 generator for a while now.

    Fixed depend rule for custom/Makefile.

    Fixed how Makefile variable SHELL is set on macOS vs. Linux.
    Using /bin/sh on macOS due to how zsh treats globs by default.

    Added charbit.h to define CALC_CHARBIT which is either CHAR_BIT
    from <limits.h> or 8 or a value set by the Makefile variable
    CALC_CHARBIT.  Added have_limits.h to determine if <limits.h>
    is a system include file.

    Compiling now tests for _WIN64 as well when testing for _WIN32.

    Now assuming that <stdio.h> is available under _WIN32 and _WIN64.

    Added some preliminary notes about attempts to compile calc
    under Windows 11.

	BTW: While we are unable to use Windows 11, we welcome
	     Windows 11 developers to try compiling calc natively
	     (instead of via a Linux virtual machine).  If you are
	     able to compile Windows 11 natively, we would welcome
	     GitHub pull requests showing any needed modifications:

		https://github.com/lcn2/calc/pulls

	     Please also add notes to the 'Compiling calc under Windows 11'
	     section in README.WINDOWS file.

    We added Makefile.simple as part of the master branch source
    to help those who may be using a make tool that does not support
    GNU Make-like features such as "ifeq" and ":=".
2021-12-08 15:30:08 -08:00
Landon Curt Noll
95ebb60619 Remove old MSDOS code in favor of _WIN32 & _WIN64 2021-12-08 15:02:36 -08:00
Landon Curt Noll
e5c8f00adc Ship with Makefile.simple & custom/Makefile.simple 2021-12-08 14:55:23 -08:00
Landon Curt Noll
265713778f Improved top level documentation 2021-12-08 14:12:23 -08:00
Landon Curt Noll
4b08a896b0 Fix comments about _WIN64 2021-12-08 12:51:10 -08:00
Landon Curt Noll
44f3778af1 More DJGPP cleanup 2021-12-08 12:33:46 -08:00
Landon Curt Noll
8db8f93ae0 Change -DWINDOZ to -D_WIN32 for DJGPP 2021-12-08 12:25:16 -08:00
Landon Curt Noll
e688c22c0e Add missing have_limits.h rule for Makefile 2021-12-08 12:18:23 -08:00
Landon Curt Noll
af72992ead Added testing for _WIN64 when testing for _WIN32 2021-12-08 12:04:13 -08:00
Landon Curt Noll
9f3a7817d3 Improve seed()
Do not rehash the hash.
2021-12-07 22:05:47 -08:00
Landon Curt Noll
dd0610db0a Improve seed()
xor-fold FNV hashes as seeds.
2021-12-07 22:01:23 -08:00
Landon Curt Noll
177a5d00d1 Improve seed()
Added charbit.h to define CALC_CHARBIT which is either CHAR_BIT
from <limits.h> or 8 or a value set by the Makefile variable
CALC_CHARBIT.  Added have_limits.h to determine if <limits.h>
is a system include file.
2021-12-07 21:41:28 -08:00
Landon Curt Noll
a02f8aa9f9 Improve seed() builtin
Increase size of random() data used by seed().
2021-12-07 13:47:00 -08:00
Landon Curt Noll
b7d1fb096d Improve the seed() builtin
Set seed() use of arc4random to same level as /dev/urandom.
Restore state size for initstated random().
2021-12-07 13:42:03 -08:00
Landon Curt Noll
48c4f3b948 Improve seed() builtin 2021-12-07 13:39:07 -08:00
Landon Curt Noll
2023175fcc Change how SHELL is set for all calc Makefiles
Using /bin/sh on macOS due to how zsh treats globs by default.
2021-12-07 04:45:23 -08:00
Landon Curt Noll
c54e2648dc Set SHELL=/bin/sh for macOS in Makefiles 2021-12-07 04:35:42 -08:00
Landon Curt Noll
faf40b7149 Fixed how SHELL is set in Makefiles, fix make depend on linux 2021-12-07 04:18:39 -08:00
Landon Curt Noll
4b2ae40c86 Fixed make depend on linux 2021-12-07 04:00:36 -08:00
Landon Curt Noll
af57104e25 Fixed depend rule for custom/Makefile 2021-12-07 03:01:46 -08:00
Landon Curt Noll
5ae3ca059a Fixed old references additive 55
Fixed documentation that referred to the old additive 55
generator.  We have been using the subtractive 100 in place
of the additive 55 generator for a while now.
2021-12-07 02:24:50 -08:00
Landon Curt Noll
cc5fb9a45b Improve the seed() function 2021-12-07 01:56:46 -08:00
Landon Curt Noll
5dcadad8b6 Fix long line in have_arc4random.c 2021-12-07 01:54:55 -08:00
Landon Curt Noll
9c67ceeed8 Fix have_arc4random.h generation 2021-12-07 00:48:28 -08:00
Landon Curt Noll
7ffbaf922e Improve seed() function 2021-12-07 00:44:57 -08:00
Landon Curt Noll
f9464652fe Improve seed() even more 2021-12-06 23:30:52 -08:00
Landon Curt Noll
b30c5c1855 Improved seed() generation
Drop support for CLOCK_SGI_CYCLE.

Improved seed() generation.  Improved some comments in seed.c.
Added have_environ.c to build have_environ.h in order to
determine if:

    extern char **environ;	/* user environment */

is an valid external symbol.
2021-12-06 21:16:08 -08:00
Landon Curt Noll
7417f2e776 Remove excess blank line from calc.c 2021-12-06 21:13:53 -08:00
Landon Curt Noll
71138215a9 Noted changes to zrandom.c comments 2021-12-05 23:38:28 -08:00
Landon Curt Noll
241f777d07 Minor updates to comments
We also corrected a comment mistake where 1007 should have been 2^32.
2021-12-05 23:36:05 -08:00
Landon Curt Noll
9d27f0aaa7 Update security policy. 2021-12-05 23:12:24 -08:00
Landon Curt Noll
a28edba4e9 Improve help files
Minor improvement of various help files.  Made format of help
files more consistent.
2021-12-05 23:02:12 -08:00
Landon Curt Noll
de47c960d3 Change remaining Email addresses to use at and dot 2021-12-05 21:29:46 -08:00
Landon Curt Noll
c3a51f42e2 Drop support for SunOS, IRIX and MINGW32_NT-5.0 targets 2021-12-05 19:02:09 -08:00
Landon Curt Noll
f5c5cea8b0 Correct typos 2021-12-05 18:23:27 -08:00
Landon Curt Noll
769ac51f8c Release v2.14.0.10 2021-12-01 23:38:56 -08:00
Landon Curt Noll
cdda633369 Update CHANGES file to note previous 2 commits 2021-12-01 23:34:40 -08:00
Landon Curt Noll
50f349f4d7 Update copyright dates to account for 2021 mods 2021-12-01 23:28:59 -08:00
Landon Curt Noll
ef00e00328 Remove unnecessary spaces inbetween or next to tabs 2021-12-01 23:25:49 -08:00
Landon Curt Noll
bb041098bc Reduce the length of long lines 2021-12-01 23:15:06 -08:00
Landon Curt Noll
f794b8d859 Reduce global status constants
The constants:

	9, 9/10, 10/9, 24, 360, 400

are used by func.c only, so there were moved
from {q,z}math.{c,h} to func.c.

The constants:

	3, 4

are used by zrandom.c only, so there were moved
from {q,z}math.{c,h} to zrandom.c.
2021-12-01 22:50:52 -08:00
Landon Curt Noll
bd990cef1f Added freeglobals() to libcalc_call_me_last() 2021-12-01 21:56:01 -08:00
Landon Curt Noll
febb9d96b3 Convert freeh() call to zfree() call 2021-12-01 21:55:18 -08:00
Landon Curt Noll
13ae9b804e Add missing blank lines 2021-12-01 21:53:46 -08:00
Landon Curt Noll
56cc4897d6 Reapply memory leak fixes to zmod.c
Revert previously applied zmod.c mods and
then apply better mods to fix zmod memory leaks.
2021-12-01 21:48:13 -08:00
Landon Curt Noll
eb940e0a21 Fix paranoia guard in literal string alloc 2021-11-30 03:44:38 -08:00
Landon Curt Noll
f3adb35e36 Add string and symbol guard allocation paranoia 2021-11-30 03:40:40 -08:00
Landon Curt Noll
d1d365d7ba Added initialization paranoia 2021-11-30 03:37:20 -08:00
Landon Curt Noll
af214b166d Reorder zfree ops to assign NULL to ptr after free 2021-11-30 03:36:22 -08:00
Landon Curt Noll
51b933dfff Add initialization paranoia 2021-11-30 03:35:09 -08:00
Landon Curt Noll
c4e5007587 Clarify strlcpy size check 2021-11-30 03:33:48 -08:00
Landon Curt Noll
c838798f04 Fix more memory leaks, improve zfree() action 2021-11-29 01:55:53 -08:00
Landon Curt Noll
23d49a41fe Remove references to externals that are no longer used 2021-11-28 20:52:03 -08:00
Landon Curt Noll
3d300acca1 Improve internal pre-defined constant handling
Improved the way that internal pre-defined constants are managed.
Removed unused internal pre-defined constants.  Added code to
prevent an internal pre-defined constant (that was never
allocated) from being freed.
2021-11-28 20:47:52 -08:00
Landon Curt Noll
8f449ba6d2 Revert local test mistake in Makefile.local 2021-11-27 00:23:54 -08:00
Landon Curt Noll
f4d754b47d Checkpoint in valgrind work 2021-11-27 00:05:28 -08:00
Landon Curt Noll
fde724aa2d Release v2.14.0.9
The following are the changes in this release:

    Due to issues with clang and Apple Silicon, ARCH_CFLAGS is now,
    by default, empty:

	ARCH_CFLAGS=

    If you want to use, say, -march=native, then either change
    the Makefile or make with:

	make all ARCH_CFLAGS='-march=native'

    Added arch and hardware as GNU Makefile computed values.
    As with ${target}, ${arch} and ${hardware} is computed by uname:

	target: uname -a
	arch: uname -p
	hardware: uname -m

    Fixed compiling calc on Apple Silicon with homebrew.  On Apple
    Silicon, HomeBrew installs on into a different location.  The
    Makefile checks if ${hardware} is arm64 and adjusts the location
    of libraries such as readline and history accordingly.
2021-11-24 01:35:01 -08:00
Landon Curt Noll
e411a3e6bf Trim long lines in Makefile 2021-11-24 01:33:00 -08:00
Landon Curt Noll
7db81649b0 Fixed compiling for Apple Silicon arm64 w/HomeBrew 2021-11-24 01:25:49 -08:00
Landon Curt Noll
08fe6f13f4 Release v2.14.0.8
The following are the changes in this release:

    Identical to v2.14.0.7: now declared a stable release.
2021-11-23 00:04:09 -08:00
Landon Curt Noll
e11d159c81 Release v2.14.0.7
The following are the changes in this release:

    Fizzbin is a better word. :-)

    The help and man builtin commands now return an error when a
    help file cannot be opened, such as when there is no help file.

    Added palindrome.cal resource file.  For example, to find the
    largest (highly probable) prime palindrome under 280 decimal
    digits (text tweet limit):

	prevprimepal(1e280)
2021-11-07 20:36:07 -08:00
Landon Curt Noll
dfd66be871 Adjusted calc in prep for 2.14.0.7 release 2021-11-07 20:30:23 -08:00
Landon Curt Noll
27f977b545 Remove unnecessary leading line whitespace before a tab 2021-11-07 20:14:28 -08:00
Landon Curt Noll
2ca6e789ca Add ignore win32 to .gitignore 2021-11-07 20:11:21 -08:00
Landon Curt Noll
ff8f921ebc Fix CHANGES note for palindrome.cal 2021-11-07 18:39:43 -08:00
Landon Curt Noll
005b78227a Minor comment changes to palindrome.cal 2021-11-07 18:36:06 -08:00
Landon Curt Noll
b7a42a9d3d Optimize palindrome.cal
In cal/palindrome.cal:

Improved the performace of nextpal() and nextprimepal()
by adding and using palnextpal().

Improved the performace of prevpal() and prevprimepal()
by adding and using palprevpal().

Test showed that runs that took 0.0530 cpu seconds can
now be done in as little as 0.0327 cpu seconds.
2021-11-07 14:15:19 -08:00
Landon Curt Noll
3d1e938cb6 Remove user_debug references in palindrome.cal 2021-11-07 13:34:58 -08:00
Landon Curt Noll
8b98a7c1f6 Add cal/palindrome.cal resource file 2021-11-06 14:48:45 -07:00
Landon Curt Noll
dbf5acf5e8 Improved help error messages
The help and man commands now issue an error message when
the help file cannot be opened: say because there is a
help command typo and there is no such help file.
2021-11-06 12:47:19 -07:00
Landon Curt Noll
5fe5ab1c4b Minor help improvement
Fizzbin is better than gleet.
2021-11-06 12:44:16 -07:00
Landon Curt Noll
e0cd9bb3db Release v2.14.0.6
The following are the changes in this release:

    Fixed typo in cal/statistics.cal thanks to a report by <GitHub user
    dennisaldea>.

    Fixed an old Windoz pun in README.WINDOWS as requested by <GitHub
    user marcodegio>.

    Fixed a really obscure bug in the internal initconstants()
    function of const.c that has been sitting for over 31 years!

	We are amazed that nobody has encountered this bug before
	now.  Nevertheless, our very extensive regression and
	multi-architecture testing found the bug.  Now, after all
	those years, it is fixed.

    Fixed issues identied by the default CodeUL GitHub security code scan:

	Wrong type of arguments to printf in have_fpos_pos.c
	Multiplication result converted to larger type in zfunc.c
2021-10-22 03:36:40 -07:00
Landon Curt Noll
f0f6171354 Release v2.14.0.5
Fixed a really obscure bug in the internal initconstants()
function of const.c that has been sitting for over 31 years!

    We are amazed that nobody has encountered this bug before
    now.  Nevertheless, our very extensive regression and
    multi-architecture testing found the bug.  Now, after all
    those years, it is fixed.

Fixed issues identied by the default CodeUL GitHub security code
scan:

    Wrong type of arguments to printf in have_fpos_pos.c
    Multiplication result converted to larger type in zfunc.c
2021-10-22 03:20:58 -07:00
Landon Curt Noll
94861cc6d2 Improved an internal allocation
Improved the way that the internal array,
consttable, is allocated.
2021-10-22 03:09:08 -07:00
Landon Curt Noll
286233e28f Fixed internal code bugs
Fixed a really obscure bug in the internal initconstants()
function of const.c that has been sitting for over 31 years!

    We are amazed that nobody has encountered this bug before
    now.  Nevertheless, our very extensive regression and
    multi-architecture testing found the bug.  Now, after all
    those years, it is fixed.

Fixed issues identied by the default CodeUL GitHub security code scan:

    Wrong type of arguments to printf in have_fpos_pos.c
    Multiplication result converted to larger type in zfunc.c
2021-10-22 03:05:12 -07:00
Landon Curt Noll
99ac7836aa Create SECURITY.md 2021-10-22 01:46:12 -07:00
Landon Curt Noll
6c0c8e0ef6 Fixed issues noted by default GitHub code scan 2021-10-22 01:39:07 -07:00
Landon Curt Noll
8aa5f140bf Release v2.12.0.4 2021-10-22 01:26:25 -07:00
Landon Curt Noll
2fcb9a5995 Create codeql-analysis.yml 2021-10-22 01:25:16 -07:00
Landon Curt Noll
8b018b697d Updated CHANGES as per GitHub pull request #35 2021-10-21 12:21:10 -07:00
Landon Curt Noll
0e269ecd67 Merge pull request #35 from marcodegio/patch-1
Update README.WINDOWS
2021-10-21 12:15:56 -07:00
Landon Curt Noll
a640bc4656 Fixed typo in cal/statistics.cal
Thanks to a report by <GitHub user dennisaldea>.
2021-10-21 12:12:31 -07:00
Marco Degiovanni
62a95499ef Update README.WINDOWS
i changed the first line from Windoz to Windows
2021-10-21 20:05:11 +02:00
Landon Curt Noll
9e92d4a35a Change initnumbs[] to be NULL terminated 2021-09-28 22:32:06 -07:00
Landon Curt Noll
459c07b121 Release v2.14.0.3
The following are the changes in this release:

    Added builtin functions to convert between degrees and
    degrees, minutes and seconds under the config("mod")
    round rules:

	d2dms(degs, d, m, s [,rnd]) - given degs, compute d, m, s
	d2dm(degs, d, m [,rnd]) - given degs, compute d, m

	See help/d2dms and help/d2dm.

    Example:

	; print d2dms(360.321,deg=,min=,sec=), deg, min, sec;
	0.321 0 19 15.6

	; print d2dm(360.321,deg=,min=), deg, min;
	0.321 0 19.26

    Added builtin functions to convert between gradians and
    gradians, minutes and seconds under the config("mod")
    round rules:

	g2gms(grads, g, m, s [,rnd]) - given grads, compute g, m, s
	g2gm(grads, g, m [,rnd]) - given grads, compute g, m

	See help/g2gms and help/g2gm.

    Example:

	; print g2gms(400.321,grad=,min=,sec=), grad, min, sec;
	0.321 0 19 15.6

	; print g2gm(400.321,grad=,min=), grad, min;
	0.321 0 19.26

    Added builtin functions to convert between hours and
    hours, minutes and seconds under the config("mod")
    round rules:

	h2hms(hours, h, m, s [,rnd]) - given hours, compute h, m, s
	h2hm(hours, h, m [,rnd]) - given hours, compute h, m

	See help/h2hms and help/h2hm.

    Example:

	; print h2hms(24.321,hour=,min=,sec=), hour, min, sec;
	0.321 0 19 15.6

	; print h2hm(24.321,hour=,min=), hour, min;
	0.321 0 19.26

    Renumbered regression tests 3408 thru 3437, to 9102 thru 9131.

    Updated Added hms.cal resource file to use h2hms() builtin.
    Updated Added dms.cal resource file to use d2dms() builtin.

    Fix minor typo in help/mod SYNOPSIS.
    Fix minor typo in help/quo SYNOPSIS.

    Added a few more examples to help/strcmp.

    Added builtin functions to convert between degrees, minutes and
    seconds and degrees under the config("mod") round rules:

	dms2d(d, m, s [,rnd]) - convert deg, min, and secs to deg
	dm2d(d, m [,rnd]) - convert deg, min to deg

	See help/dms2d and help/dm2d.

    Example:

	; print dms2d(12, 20, 44.16);
	12.3456

	; print dm2d(3601, -25.5594);
	0.57401

    Added builtin functions to convert between gradians, minutes and
    seconds and gradians under the config("mod") round rules:

	gms2g(g, m, s [,rnd]) - convert grad, min, and secs to grad
	gm2g(g, m [,rnd]) - convert grad and min to grad

	See help/g2gms and help/g2gm.

    Example:

	; print gms2g(12, 20, 44.16);
	12.3456

	; print gm2g(4001, -25.5594);
	0.57401

    Added builtin functions to convert between hours, minutes and
    seconds and hours under the config("mod") round rules:

	hms2h(h, m, s [,rnd]) - convert hours, min, and secs to hours
	hm2h(h, m [,rnd]) - convert hours, min to hours

	See help/hms2h and help/hm2h.

    Example:

	; print hms2h(12, 20, 44.16);
	12.3456

	; print hm2h(241, -25.5594);
	0.57401
2021-09-27 02:49:06 -07:00
Landon Curt Noll
ada15fdabc Added more builtin inverse conversion functions
Added builtin functions to convert between degrees, minutes and
    seconds and degrees under the config("mod") round rules:

	dms2d(d, m, s [,rnd]) - convert deg, min, and secs to deg
	dm2d(d, m [,rnd]) - convert deg, min to deg

	See help/dms2d and help/dm2d.

    Example:

	; print dms2d(12, 20, 44.16);
	12.3456

	; print dm2d(3601, -25.5594);
	0.57401

    Added builtin functions to convert between gradians, minutes and
    seconds and gradians under the config("mod") round rules:

	gms2g(g, m, s [,rnd]) - convert grad, min, and secs to grad
	gm2g(g, m [,rnd]) - convert grad and min to grad

	See help/g2gms and help/g2gm.

    Example:

	; print gms2g(12, 20, 44.16);
	12.3456

	; print gm2g(4001, -25.5594);
	0.57401

    Added builtin functions to convert between hours, minutes and
    seconds and hours under the config("mod") round rules:

	hms2h(h, m, s [,rnd]) - convert hours, min, and secs to hours
	hm2h(h, m [,rnd]) - convert hours, min to hours

	See help/hms2h and help/hm2h.

    Example:

	; print hms2h(12, 20, 44.16);
	12.3456

	; print hm2h(241, -25.5594);
	0.57401
2021-09-27 02:14:18 -07:00
Landon Curt Noll
d5de36841a Improve error codes for some invalid rounding args 2021-09-26 23:50:45 -07:00
Landon Curt Noll
cf419fb329 Added several conversion funcions, plus minor updates
Added several conversion functions:

    Added builtin functions to convert between degrees and
    degrees, minutes and seconds under the config("mod")
    round rules:

	d2dms(degs, d, m, s [,rnd]) - given degs, compute d, m, s
	d2dm(degs, d, m [,rnd]) - given degs, compute d, m

	See help/d2dms and help/d2dm.

    Example:

	; print d2dms(360.321,deg=,min=,sec=), deg, min, sec;
	0.321 0 19 15.6

	; print d2dm(360.321,deg=,min=), deg, min;
	0.321 0 19.26

    Added builtin functions to convert between gradians and
    gradians, minutes and seconds under the config("mod")
    round rules:

	g2gms(grads, g, m, s [,rnd]) - given grads, compute g, m, s
	g2gm(grads, g, m [,rnd]) - given grads, compute g, m

	See help/g2gms and help/g2gm.

    Example:

	; print g2gms(400.321,grad=,min=,sec=), grad, min, sec;
	0.321 0 19 15.6

	; print g2gm(400.321,grad=,min=), grad, min;
	0.321 0 19.26

    Added builtin functions to convert between hours and
    hours, minutes and seconds under the config("mod")
    round rules:

	h2hms(hours, h, m, s [,rnd]) - given hours, compute h, m, s
	h2hm(hours, h, m [,rnd]) - given hours, compute h, m

	See help/h2hms and help/h2hm.

    Example:

	; print h2hms(24.321,hour=,min=,sec=), hour, min, sec;
	0.321 0 19 15.6

	; print h2hm(24.321,hour=,min=), hour, min;
	0.321 0 19.26

In addtion:

    Renumbered regression tests 3408 thru 3437, to 9102 thru 9131.

    Updated Added hms.cal resource file to use h2hms() builtin.
    Updated Added dms.cal resource file to use d2dms() builtin.

    Fix minor typo in help/mod SYNOPSIS.
    Fix minor typo in help/quo SYNOPSIS.

    Added a few more examples to help/strcmp.
2021-09-26 04:38:09 -07:00
256 changed files with 15864 additions and 4917 deletions

View File

@@ -0,0 +1,70 @@
---
name: Calc bug report
about: Create a report to help us improve
title: 'Bug: XXX-change-this-part-XXX'
labels: bug
assignees: ''
---
Calc bug report template version: 1.2 2022-02-24
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
0. How you started calc
I.e., provide the command line you used to launch calc
1. Calc commands and their output
Please provide any calc commands you entered on the the terminal.
Please provide the calc command line output inline as well.
If the above is long, please attach a file.
Or if you cannot compile calc: The make command you used try and compile calc
and all error and warning messages produced during that action. If long, consider
attaching a file.
2. Indicate where the problem is
Referring to the information for step 1 above, indicate where the problem is to be found
**Expected behavior**
A clear and concise description of what you expected to happen.
**Attach make debug output**
IMPORTANT: Please attach the output from `make debug`.
**Screenshots**
If applicable, attach screenshots to help explain your problem.
**Execution environment (please complete the following information):**
- OS:
E.g., macOS, FreeBSD, Linux, Windows 11, etc.
- OS version:
E.g., Preferred: give the output of `uname -a`
or if no uname command, a description of the OS version/release you are using
- OS distribution:
E.g., macOS Monterey, contents of /etc/redhat-releaseor /etc/os-release, etc.
- Calc Version
E.g., output of calc -v
or if you cannot compile calc, the version you downloaded and from where it came from
- Shell and shell version
E.g.., bash, zsh, power shell, etc.
and the version of the shell you are using, if known
**Calc mods**
If you have modified the calc source for some reason, please description what you modified.
Please consider attaching a patch (diff -u) between an official calc release and the source
you are using.
**Patch**
If you have a recommended code patch to address the problem, please attach your file
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

71
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@@ -0,0 +1,71 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '41 1 * * 6'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'cpp' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

9
.gitignore vendored
View File

@@ -6,7 +6,6 @@
#
.dynamic
.hsrc
Makefile.simple
NOTES
align32.h
args.h
@@ -16,6 +15,7 @@ calc.1
calc.usage
calcerr.c
calcerr.h
charbit.h
conf.h
cscript/.all
cscript/4dsphere
@@ -28,19 +28,21 @@ cscript/powerterm
cscript/simple
cscript/square
custom/.all
custom/Makefile.simple
custom/libcustcalc*
endian
endian_calc.h
fposval.h
have_arc4random.h
have_ban_pragma.h
have_const.h
have_environ.h
have_fpos.h
have_fpos_pos.h
have_getpgid.h
have_getprid.h
have_getsid.h
have_gettime.h
have_limits.h
have_memmv.h
have_newstr.h
have_offscl.h
@@ -82,6 +84,7 @@ help/man
help/new_custom
help/question
help/questions
help/releases
help/resource
help/type
help/usage
@@ -89,11 +92,13 @@ libcalc*
libcustcalc*
longbits
longbits.h
Makefile.our
sample_many
sample_rand
tags
terminal.h
ver_calc
win32/
# other commonly excluded patterns
#

28
BUGS
View File

@@ -15,19 +15,37 @@ Look at the end of the output, it should say something like:
If it does not, then something is really broken!
To be sure that your version of calc is up to date, check out:
To be sure that your version of calc is up to date.
Look for the latest release on GitHub:
http://www.isthe.com/chongo/tech/comp/calc/calc-mirror.html
https://github.com/lcn2/calc/releases
Just below latest GitHub release sectiop is something called:
> Assets
Click in the triangle to open up the Assets then click on
the approptiate package to download.
If you made and modifications to calc beyond the simple Makefile
configuration, try backing them out and see if things get better.
configuration, try backing those changges out and see if things get
better.
If you have tried all of the above and things still are not right,
then it may be time to send in a bug report.
=-=
The BEST WAY TO SEND IN A BUG REPORT is via calc GitHub issue URL:
If you encounter a warning or error in compiling, or if you
find a calc bug and you wish to send is a fix, we recommend
that you submit your change using the GitHub pull request:
https://github.com/lcn2/calc/pulls
=-=
If you just want to send us a bug report, we recommend
doing so via the GitHub issue process:
https://github.com/lcn2/calc/issues
@@ -119,6 +137,8 @@ Known bugs in calc:
The output of the alg_config.cal resource file is bogus.
We would welcome a replacement for this code.
Calc may not compile natively under Windows 11. See README.WINDOWS.
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.

595
CHANGES
View File

@@ -1,4 +1,355 @@
The following are the changes from calc version 2.14.0.0 to date:
The following are the changes from calc version 2.14.1.0 to date:
Fixed alignment of show item section of help command.
Bug fix: While 0^0 == 1, now for y > 0, 0^y == 0.
Adjusted cal/test8900.cal to reflect this bug fix.
Added tests to cal/regress.cal to help verify bug fix is fixed.
Fixed a \-escape bug in calc(1) man page.
Added cal/comma.cal:
Convert numbers into strings with 3-digit group and integer-fraction
separators.
If the value is an integer, the integer-fraction separator is not used.
str_comma(x, [group, [decimal]])
Convert x into a string.
If group is given and is a string, group will be used as
the 3-digit group separator, otherwise the default 3-digit
group separator will be used.
If decimal is given and is a string, group will be used as
the integer-fraction separator, otherwise the default
integer-fraction separator will be used.
The decimal and group arguments are optional.
set_default_group_separator(group)
Change the default 3-digit group separator if group is a string,
otherwise the default 3-digit group separator will not be
changed. Return the old 3-digit group separator.
set_default_decimal_separator(decimal)
Change the default 3-digit group separator if decimal is a
string, otherwise the default integer-fraction separator
will not be changed. Return the old integer-fraction separator.
print_comma(x, [group, [decimal]])
Print the value produced by str_comma(x, [group, [decimal]])
followed by a newline.
If the str_comma() does not return a string, nothing is printed.
The decimal and group arguments are optional.
The value produced by str_comma() is returned.
fprint_comma(fd, x, [group, [decimal]])
Print the value produced by str_comma(x, [group, [decimal]]),
without a trailing newline, on file fd.
If the str_comma() does not return a string, nothing is printed.
If fd is not an open file, nothing is printed.
The decimal and group arguments are optional.
The value produced by str_comma() is returned.
Added a few remarks on calc version numbers to version.c.
Fixed how fposval.h is built. On a number of systems, the fposval.c
file failed to compile incorrectly. This caused problems for systems in
which fposval.h.def was not correct.
Fixed how have_memmv.h is built. On a number of systems, the have_memmv.c
file failed to compile incorrectly, producing a potentially incorrect
have_memmv.h file for such systems.
Fixed how align32.h is built. On a number of systems, the align32.c
file failed to compile incorrectly, producing a potentially incorrect
align32.h file for such systems.
Fixed how have_newstr.h is built. On a number of systems, the have_newstr.c
failed to compile incorrectly, producing a potentially incorrect
have_newstr.h file for such systems.
Fixed how have_strdup.h is built. On a number of systems, the have_strdup.c
file failed to compile incorrectly, producing a potentially incorrect
have_strdup.h file for such systems.
Fixed how have_strlcat.h is built. On a number of systems, the have_strlcat.c
file failed to compile incorrectly, producing a potentially incorrect
have_strlcat.h file for such systems.
Fixed how have_strlcpy.h is built. On a number of systems, the have_strlcpy.c
file failed to compile incorrectly, producing a potentially incorrect
have_strlcpy.h file for such systems.
Fixed how have_uid_t.h is built. On a number of systems, the have_uid_t.c
file failed to compile incorrectly, producing a potentially incorrect
have_uid_t.h file for such systems.
Fixed how have_uid_t.h is built. On a number of systems, the have_uid_t.c
file failed to compile incorrectly, producing a potentially incorrect
have_uid_t.h file for such systems.
The following are the changes from calc version 2.14.0.15 to 2.14.0.15:
Changed Makefile to set shell before setting the SHELL Makefile
variable.
Added text to HOWTO.INSTALL to help people with systems that
lack the readline package.
Trimmed long line in the CONTRIBUTING.md file.
Expanded the globalsymbol string table size: from 1024 to 65536.
Expanded the how often to reallocate string table is performed:
from 100 to 1024.
Expanded the number env_pool elements to allocate at a time:
from 10 to 256.
Improve comments on Makefile.local and add a few more examples
of how it might be used.
Changed /*NOTREACHED*/ to not_reached(); and use "attribute.h".
Added .PHONY rule, just after all rule, to Makefiles.
Made minor format update on help/commands.
Added ${WINGM} Makefile variable for users under Windows 11 who
use Cygwin and the MinGW64 packages.
Updated README.WINDOWS for Windows 11 users based on advice
form a Microsoft 11 developer.
Fixed missing quotes in the PASSDOWN makefile variables.
Disable use of gettime() under _WIN32 or _WIN64.
The following are the changes from calc version 2.14.0.14 to 2.14.0.14:
Fixed typo in Makefile.local comment.
Established a tagging procedure for a production release.
Production git tags will be of the form:
prod-2.x.y.z
The following are the changes from calc version 2.14.0.13 to 2.14.0.13:
Made major changes to our release process in order to avoid
missing critical files that happened in calc v2.4.0.12.
Minor tweak to seed() builtin. Updated help/srand and help/srandom.
Moved Makefile.ship into Makefile.
Removed custom/Makefile.head and custom/Makefile.tail.
The custom/Makefile is now part of source and includes Makefile.
In particular, custom/Makefile makes use of the 'middle' of
the new top level Makefile where calc's top level Makefile
variables are defined.
Makefile.simple and custom/Makefile.simple are now part of the source
and are constructed from Makefile and custom/Makefile respectively.
The Makefile.simple and custom/Makefile.simple avoid using GNU
conditionals. They may be used with older/classic make commands.
Makefile.local will include comments about how to better use
it. Between releases, Makefile.local at the top of the master branch
will contain how we typically build calc and test calc (FYI: we
normally enable things such as -Werror -Wextra -pedantic). When we
push out a release, Makefile.local will be stripped of non-comment
lines. Thus, releases of calc, and, released "calc*.src.rpm"
files and the source tarballs, will have a Makefile.local with
only comments.
The "README.*" files and "HOWTO.INSTALL" file have been updated.
By default, compiler warnings have been turned up. The Makefile
variable ${CCWARN} now defaults to:
CCWARN= -Wall -Wextra -pedantic
The previous level of compiler warnings can be easily restored by
adding to Makefile.local:
CCWARN:= -Wall
The readline, history and ncurses libraries are now default.
The Makefile variables ${USE_READLINE}, ${READLINE_LIB}, and
${READLINE_EXTRAS} now default to:
USE_READLINE= -DUSE_READLINE
READLINE_LIB= -lreadline
READLINE_EXTRAS= -lhistory -lncurses
The previous mode where readline, history and ncurses libraries
were not compiled in by default can be easily restored by
adding to Makefile.local:
USE_READLINE:=
READLINE_LIB:=
READLINE_EXTRAS:=
We have renamed "stable" as "production".
We have renamed "unstable" as "tested".
On the web site:
http://www.isthe.com/chongo/src/calc/
these files has been renamed:
2.x.y.z_IS_LATEST_STABLE ==> 2.x.y.z_IS_LATEST_PRODUCTION
2.x.y.z_IS_LATEST_UNSTABLE ==> 2.x.y.z_IS_LATEST_TESTED
The terms 'stable' and 'unstable' were both misleading and
inaccurate. For details see the new documention file:
README.RELEASE
See also the help command:
; help release
Fixed bug impacting how have_ustat.h was formed.
Updated help/archive, BUGS, HOWTO.INSTALL to reflect GitHub use.
The following are the changes from calc version 2.14.0.11 to 2.14.0.12:
Fixed a number of typos.
Drop support for SunOS, IRIX and MINGW32_NT-5.0 targets.
Drop support for CLOCK_SGI_CYCLE. Drop testing for __MSDOS__.
Minor improvement of various help files. Made format of help
files more consistent.
Corrected a few comments in zrandom.c, including a case where
the comment referred to 1007 when it should have used 2^32.
Improved seed() generation. Improved some comments in seed.c.
Added have_environ.c to build have_environ.h in order to
determine if:
extern char **environ; /* user environment */
is an valid external symbol.
Fixed documentation that referred to the old additive 55
generator. We have been using the subtractive 100 in place
of the additive 55 generator for a while now.
Fixed depend rule for custom/Makefile.
Fixed how Makefile variable SHELL is set on macOS vs. Linux.
Using /bin/sh on macOS due to how zsh treats globs by default.
Added charbit.h to define CALC_CHARBIT which is either CHAR_BIT
from <limits.h> or 8 or a value set by the Makefile variable
CALC_CHARBIT. Added have_limits.h to determine if <limits.h>
is a system include file.
Compiling now tests for _WIN64 as well when testing for _WIN32.
Now assuming that <stdio.h> is available under _WIN32 and _WIN64.
Added some preliminary notes about attempts to compile calc
under Windows 11.
BTW: While we are unable to use Windows 11, we welcome
Windows 11 developers to try compiling calc natively
(instead of via a Linux virtual machine). If you are
able to compile Windows 11 natively, we would welcome
GitHub pull requests showing any needed modifications:
https://github.com/lcn2/calc/pulls
Please also add notes to the 'Compiling calc under Windows 11'
section in README.WINDOWS file.
We added Makefile.simple as part of the master branch source
to help those who may be using a make tool that does not support
GNU Make-like features such as "ifeq" and ":=".
Fixed incorrect ustat_dev member ref in seed() builtin that
was part of the unreleased calc v2.12.0.11.
The following are the changes from calc version 2.14.0.9 to 2.14.0.10:
Due to issues with clang and Apple Silicon, ARCH_CFLAGS is now,
by default, empty:
ARCH_CFLAGS=
If you want to use, say, -march=native, then either change
the Makefile or make with:
make all ARCH_CFLAGS='-march=native'
Added arch and hardware as GNU Makefile computed values.
As with ${target}, ${arch} and ${hardware} is computed by uname:
target: uname -a
arch: uname -p
hardware: uname -m
Fixed compiling calc on Apple Silicon with HomeBrew. On Apple
Silicon, HomeBrew installs on into a different location. The
Makefile checks if ${hardware} is arm64 and adjusts the location
of libraries such as readline and history accordingly.
Plugged a number of memory leaks.
Fixed a few cases where v_subtype was not properly initialized.
Improved the way that internal pre-defined constants are managed.
Removed unused internal pre-defined constants. Added code to
prevent an internal pre-defined constant (that was never allocated)
from being freed.
Remove unnecessary spaces in-between or next to tabs.
Update Copyright dates to account for 2021 modifications.
The following are the changes from calc version 2.14.0.7 to 2.14.0.8:
Fizzbin is a better word. :-)
The help and man builtin commands now return an error when a
help file cannot be opened, such as when there is no help file.
Added palindrome.cal resource file. For example, to find the
largest (highly probable) prime palindrome under 280 decimal
digits (text tweet limit):
prevprimepal(1e280)
The following are the changes from calc version 2.14.0.0 to 2.14.0.6:
The :-separated default CALCRC value has been reversed.
The default CALCRC was:
@@ -56,7 +407,7 @@ The following are the changes from calc version 2.14.0.0 to date:
The optional 2nd argument is ignored by g2d(grad, ep) and d2g(deg, ep).
The clean and clobber makefile rules no longer list custom/Makefile
as a dependecy.
as a dependency.
Unfortunately due to the complex dependency issues between
Makefile, Makefile.ship and custom/Makefile, parallel GNU make
@@ -78,10 +429,138 @@ The following are the changes from calc version 2.14.0.0 to date:
More changes are likely, so we might see another v2.14.0.x release
before things are declared "recommended stable".
Not that we wan to discourage people from trying v2.14.0, you should
Not that we want to discourage people from trying v2.14.0, you should
try it. We just want things to become stable and well field tested
before we reach the "recommended stable" release state.
Added builtin functions to convert between degrees and
degrees, minutes and seconds under the config("mod")
round rules:
d2dms(degs, d, m, s [,rnd]) - given degs, compute d, m, s
d2dm(degs, d, m [,rnd]) - given degs, compute d, m
See help/d2dms and help/d2dm.
Example:
; print d2dms(360.321,deg=,min=,sec=), deg, min, sec;
0.321 0 19 15.6
; print d2dm(360.321,deg=,min=), deg, min;
0.321 0 19.26
Added builtin functions to convert between gradians and
gradians, minutes and seconds under the config("mod")
round rules:
g2gms(grads, g, m, s [,rnd]) - given grads, compute g, m, s
g2gm(grads, g, m [,rnd]) - given grads, compute g, m
See help/g2gms and help/g2gm.
Example:
; print g2gms(400.321,grad=,min=,sec=), grad, min, sec;
0.321 0 19 15.6
; print g2gm(400.321,grad=,min=), grad, min;
0.321 0 19.26
Added builtin functions to convert between hours and
hours, minutes and seconds under the config("mod")
round rules:
h2hms(hours, h, m, s [,rnd]) - given hours, compute h, m, s
h2hm(hours, h, m [,rnd]) - given hours, compute h, m
See help/h2hms and help/h2hm.
Example:
; print h2hms(24.321,hour=,min=,sec=), hour, min, sec;
0.321 0 19 15.6
; print h2hm(24.321,hour=,min=), hour, min;
0.321 0 19.26
Renumbered regression tests 3408 thru 3437, to 9102 thru 9131.
Updated Added hms.cal resource file to use h2hms() builtin.
Updated Added dms.cal resource file to use d2dms() builtin.
Fix minor typo in help/mod SYNOPSIS.
Fix minor typo in help/quo SYNOPSIS.
Added a few more examples to help/strcmp.
Added builtin functions to convert between degrees, minutes and
seconds and degrees under the config("mod") round rules:
dms2d(d, m, s [,rnd]) - convert deg, min, and secs to deg
dm2d(d, m [,rnd]) - convert deg, min to deg
See help/dms2d and help/dm2d.
Example:
; print dms2d(12, 20, 44.16);
12.3456
; print dm2d(3601, -25.5594);
0.57401
Added builtin functions to convert between gradians, minutes and
seconds and gradians under the config("mod") round rules:
gms2g(g, m, s [,rnd]) - convert grad, min, and secs to grad
gm2g(g, m [,rnd]) - convert grad and min to grad
See help/g2gms and help/g2gm.
Example:
; print gms2g(12, 20, 44.16);
12.3456
; print gm2g(4001, -25.5594);
0.57401
Added builtin functions to convert between hours, minutes and
seconds and hours under the config("mod") round rules:
hms2h(h, m, s [,rnd]) - convert hours, min, and secs to hours
hm2h(h, m [,rnd]) - convert hours, min to hours
See help/hms2h and help/hm2h.
Example:
; print hms2h(12, 20, 44.16);
12.3456
; print hm2h(241, -25.5594);
0.57401
Fixed typo in cal/statistics.cal thanks to a report by <GitHub user
dennisaldea>.
Fixed an old Windows pun in README.WINDOWS as requested by <GitHub
user marcodegio>.
Fixed a really obscure bug in the internal initconstants()
function of const.c that has been sitting for over 31 years!
We are amazed that nobody has encountered this bug before
now. Nevertheless, our very extensive regression and
multi-architecture testing found the bug. Now, after all
those years, it is fixed.
Fixed issues identified by the default CodeUL GitHub security code scan:
Wrong type of arguments to printf in have_fpos_pos.c
Multiplication result converted to larger type in zfunc.c
The following are the changes from calc version 2.13.0.1 to 2.13.0.1:
@@ -700,7 +1179,7 @@ The following are the changes from calc version 2.12.5.4 to 2.12.5.6:
Rewrote gen_v1() in the lucas.cal resource file using the method
based on a paper:
"A note on primality tests for N = h*2^n-1", by Oystein J. Rodseth,
"A note on primality tests for N = h*2^n-1", by Oystein J. Rodseth,
Department of Mathematics, University of Bergen, BIT Numerical
Mathematics. 34 (3): pp 451-454.
@@ -759,13 +1238,13 @@ The following are the changes from calc version 2.12.5.3 to 2.12.5.3:
macOS (Darwin) users who installed calc version 2.12.5.2
should, after installing version 2.12.5.3:
rm -rf /opt/calc
rm -rf /opt/calc
The following are the changes from calc version 2.12.5.1 to 2.12.5.2:
NOTE: calc version 2.12.5.2, for macOS (Darwin) users,
installed under /opt/calc. We neglected to mention this
installed under /opt/calc. We neglected to mention this
AND /usr/local would have been a better choice. Sorry!
Fixed in calc version 2.12.5.3.
@@ -838,7 +1317,7 @@ The following are the changes from calc version 2.12.4.14 to 2.12.5.0:
For Apple OS X / Darwin target:
MACOSX_DEPLOYMENT_TARGET is no longer defined
MACOSX_DEPLOYMENT_TARGET is no longer defined
using clang compiler
By default, -install-name is used when forming shared libs.
@@ -882,9 +1361,9 @@ The following are the changes from calc version 2.12.4.14 to 2.12.5.0:
for mul2, sq2, and pow2. However, it has been shown that this
code is not correct. Suggestions for a replacement are welcome!
calc -u 'read alg_config; config("user_debug", 2),; best_mul2();'
calc -u 'read alg_config; config("user_debug", 2),; best_sq2();'
calc -u 'read alg_config; config("user_debug", 2),; best_pow2();'
calc -u 'read alg_config; config("user_debug", 2),; best_mul2();'
calc -u 'read alg_config; config("user_debug", 2),; best_sq2();'
calc -u 'read alg_config; config("user_debug", 2),; best_pow2();'
Fixed a number of pedantic compiler warnings.
@@ -1051,7 +1530,7 @@ The following are the changes from calc version 2.12.4.6 to version 2.12.4.10:
With the exception of 3 source files, we became "picky" about
line lengths and other issues reported by the picky tool:
cal/test8900.cal
cal/test8900.cal
cal/set8700.line
help/errorcodes.sed
@@ -1107,7 +1586,7 @@ The following are the changes from calc version 2.12.4.0 to 2.12.4.2:
Added prep makefile rule to make is easier to compile calc without
an optimizer. By doing:
make clobber prep
make clobber prep
one may build a calc binary that is easier to debug.
@@ -1124,7 +1603,7 @@ The following are the changes from calc version 2.12.4.0 to 2.12.4.2:
dot org) for this patch.
Michael Penk (mpenk at wuska dot com) reported success in installs
under windoz via Cygwin by making a change to the Cygwin target.
under Windows via Cygwin by making a change to the Cygwin target.
These changes have been folded into the main calc Makefile.
The old recommendation of using 'make win32_hsrc' is no longer
required for Cygwin. See the README.WINDOWS file for details.
@@ -1264,7 +1743,7 @@ The following are the changes from calc version 2.12.1.1 to 2.12.2.2:
what was calc-something.tar.gz is now calc-something.tar.bz2.
To "uncompress" use:
bunzip2 calc-something.tar.bz2
bunzip2 calc-something.tar.bz2
On some systems, one may untar directly by:
@@ -1298,7 +1777,7 @@ The following are the changes from calc version 2.12.1.10 to 2.12.2:
All extern functions are now declared with the symbol E_FUNC.
The include file decl.h defines these 4 symbols by default
to static, extern, static, and extern respectively. Under
Windoz, DLL is also defined according to the _EXPORTING symbol
Windows, DLL is also defined according to the _EXPORTING symbol
and is prepended to the EXTERN and E_FUNC symbols. The decl.h
file has replaced the win32dll.h file.
@@ -1329,7 +1808,7 @@ The following are the changes from calc version 2.12.1.10 to 2.12.2:
Renamed the following variables related to calc error processing:
int calc_jmp ==> int calc_use_matherr_jmpbuf
jmp_buf calc_jmp_buf ==> jmp_buf calc_matherr_jmpbuf
jmp_buf calc_jmp_buf ==> jmp_buf calc_matherr_jmpbuf
int post_init ==> int calc_use_scanerr_jmpbuf
jmp_buf jmpbuf ==> jmpbuf calc_scanerr_jmpbuf
@@ -1344,7 +1823,7 @@ The following are the changes from calc version 2.12.1.10 to 2.12.2:
Parse/scan errors will not be printed if calc_print_scanerr_msg
is zero. By default:
int calc_print_scanerr_msg = 1;
int calc_print_scanerr_msg = 1;
This variable is declared in the lib_calc.h include file. Storage
comes from libcalc.
@@ -1352,7 +1831,7 @@ The following are the changes from calc version 2.12.1.10 to 2.12.2:
Parse/scan warnings will not be printed if calc_print_scanwarn_msg
is zero. By default:
int calc_print_scanwarn_msg = 1;
int calc_print_scanwarn_msg = 1;
This variable is declared in the lib_calc.h include file. Storage
comes from libcalc.
@@ -1388,16 +1867,16 @@ The following are the changes from calc version 2.12.1.10 to 2.12.2:
Replaced the concept of compiler sets in the Makefile with
host target section in the Makefile. Initial host targets are:
Linux
Linux
Darwin
FreeBSD
(default) <<== Target does not match any previous target name
Simple
NOTE: If your target is not supported below and the default target
NOTE: If your target is not supported below and the default target
is not suitable for your needs, please send to the:
calc-contrib at asthe dot com
calc-contrib at asthe dot com
Email address an "ifeq ($(target),YOUR_TARGET_NAME)"
... "endif" set of lines from the Makefile so that
@@ -1542,7 +2021,7 @@ The following are the changes from calc version 2.12.1.8 to 2.12.1.9:
comments. Improved calc comment documentation in "help unexpected"
to help other avoid similar mistakes. Calc comments are of the form:
/* c style comments */
/* c style comments */
/*
* multi-line
* comments
@@ -1556,7 +2035,7 @@ The following are the changes from calc version 2.12.1.8 to 2.12.1.9:
Documented these help commands in "help help":
help ->
help ->
help *
help .
help %
@@ -1737,7 +2216,7 @@ The following are the changes from calc version 2.12.0 to 2.12.0.8:
Added the builtin function fpathopen() to open a file while
searching along a path:
; fd2 = fpathopen("tmp/date", "r", ".:~:~sc:/tmp:/var/tmp:/var")
; fd2 = fpathopen("tmp/date", "r", ".:~:~sc:/tmp:/var/tmp:/var")
; print fd2
"/var/tmp/date"
@@ -1787,12 +2266,12 @@ The following are the changes from calc version 2.12.0 to 2.12.0.8:
level. When comparing with older source, one may use the -b argument
of the diff command to ignore changes in amount of white space:
diff -b -r -u calc-2.11.11 calc-2.12.0
diff -b -r -u calc-2.11.11 calc-2.12.0
The read, write, and help commands use the value of global string
variable if the symbol name starts with a $. For example:
global x = "lucas.cal";
global x = "lucas.cal";
read $x; /* same as read lucas.cal or read "lucas.cal" */
Added dotest.cal resource. Based on a design by Ernest Bowen
@@ -1902,7 +2381,7 @@ The following are the changes from calc version 2.12.0 to 2.12.0.8:
Changed the default values for the following config() parameters:
config("mul2") == 1780
config("mul2") == 1780
config("sq2") == 3388
config("pow2") == 176
@@ -1997,10 +2476,10 @@ The following are the changes from calc version 2.12.0 to 2.12.0.8:
value is TRUE by default. Examples of variable name collisions
include when:
* both local and static variables have the same name
* both local and global variables have the same name
* both function parameter and local variables have the same name
* both function parameter and global variables have the same name
* both local and static variables have the same name
* both local and global variables have the same name
* both function parameter and local variables have the same name
* both function parameter and global variables have the same name
Fix of a bug which causes some static variables not to be correctly
unscoped when their identifiers are used in a global declaration.
@@ -2020,7 +2499,7 @@ The following are the changes from calc version 2.12.0 to 2.12.0.8:
Changed the definition of the function ssq() to enable list arguments
to be processed in the same way as in sum(). For example:
ssq(1,2, list(3,4,list(5,6)), list(), 7, 8)
ssq(1,2, list(3,4,list(5,6)), list(), 7, 8)
returns the value of 1^2 + 2^2 + ... + 8^2 == 204.
@@ -2028,12 +2507,12 @@ The following are the changes from calc version 2.12.0 to 2.12.0.8:
various ways of evaluating sums, sums of squares, etc, for large
lists and matrices. For example:
read sumtimes
read sumtimes
doalltimes(1e6)
Calc now ignores carriage returns (\r), vertical tabs (\v), and
form feeds (\f) when token parsing. Thus users on Windoz systems
can write files using their \r\n format and users on non-Windoz
form feeds (\f) when token parsing. Thus users on Windows systems
can write files using their \r\n format and users on non-Windows
systems can read them without errors.
The quomod() builtin function now takes an optional 5th argument
@@ -2067,7 +2546,7 @@ The following are the changes from calc version 2.11.10.1 to 2.11.11:
Fixed a bug reported by the sourceforge user: cedars where:
ln(exp(6)) == 3 /* WRONG!!! */
ln(exp(6)) == 3 /* WRONG!!! */
incorrectly returned 1. This bug was fixed by Ernest Bowen
<ebowen at une dot edu dot au>. The regression test
@@ -2172,7 +2651,7 @@ The following are the changes from calc version 2.11.10 to 2.11.10:
Fixed -d so that:
calc -d 2/3
calc -d 2/3
will print 0.66666666666666666667 without the leading tilde as
advertised in the man page.
@@ -2192,7 +2671,7 @@ The following are the changes from calc version 2.11.10 to 2.11.10:
Added custom function:
custom("pmodm127", q)
custom("pmodm127", q)
to compute 2^(2^127-1) mod q. While currently slower than just
doing pmod(2,2^127-1,q), it is added to give an example of a
@@ -2283,7 +2762,7 @@ The following are the changes from calc version 2.11.8.0 to 2.11.8.1:
configuration (calc -n or config("all", "newstd")) is now the default
calc configuration. The flag:
calc -O
calc -O
was added to get the old classic calc configuration. The flag command
line flag, -n, now does nothing. Use of -n is deprecated and may go
@@ -2296,7 +2775,7 @@ The following are the changes from calc version 2.11.8.0 to 2.11.8.1:
and oldstd -n & newstd classic cfg default
--------------------------------------------------------
epsilon 1e-20 1e-10 1e-20 1e-20
quo 2 2 2 2
quo 2 2 2 2
outround 2 24 2 24
leadzero 0 1 0 1
fullzero 0 1 0 0
@@ -2375,7 +2854,7 @@ The following are the changes from calc version 2.11.6.0 to 2.11.6.2:
Fixed help typos reported by Marc Mezzarobba <mm at mm dot ovh dot org>.
Forced system("") to return 0 under windoz.
Forced system("") to return 0 under Windows.
The direct.h include file is not used when compiling under Cygwin.
@@ -2460,16 +2939,16 @@ The following are the changes from calc version 2.11.5.5 to 2.11.5.9:
Now using version numbers of one of these forms:
x.y.z.w
x.y.z
x.y
x.y.z.w
x.y.z
x.y
Changed the READLINE_LIB Makefile variable to not link with -lreadline
by default. If you do have readline, we recommend that you use it.
If you can install the GNU readline:
http://freshmeat.net/projects/gnureadline/
http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html
http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html
we recommend it. But if not, you should set the USE_READLINE,
READLINE_LIB, and READLINE_INCLUDE Makefile variables to empty.
@@ -2541,7 +3020,7 @@ The following are the changes from calc version 2.11.5t4.1 to 2.11.5t4.4:
Added subject requirements for the calc-tester-request and
calc-bugs-mail Email aliases. See:
http://www.isthe.com/chongo/tech/comp/calc/email.html
http://www.isthe.com/chongo/tech/comp/calc/email.html
for details.
@@ -2685,10 +3164,10 @@ The following are the changes from calc version 2.11.5t2 to 2.11.5t2.1:
The calc builtin function, fopen(), now allows one to specify
opening files in binary modes. On POSIX / Linux / Un*x-like systems,
text file is the same as a binary file and so 'b' to an fopen has
no effect and is ignored. However on systems such as MS Windoz
no effect and is ignored. However on systems such as MS Windows
the 'b' / binary mode has meaning. See 'help fopen' for details.
On systems (such as MS Windoz), calc will produce a different error
On systems (such as MS Windows), calc will produce a different error
message when it attempts to open /dev/tty. This will condition
will occur in things like calc scripts when they switch from ``batch
processing'' commands from and want to start interactive mode.
@@ -2708,7 +3187,7 @@ The following are the changes from calc version 2.11.5t2 to 2.11.5t2.1:
Applied a bug fix from Ernest Bowen <ernie at turing dot une dot
edu dot au> dealing with one-line "static" declaration like:
static a = 1, b;
static a = 1, b;
Added regression test 8310 to test for the static bug fix.
@@ -2723,14 +3202,14 @@ The following are the changes from calc version 2.11.5t0 to 2.11.5t1.1:
Thanks goes to Martin Buck <m at rtin-buck dot de> for reporting
this bug and testing the fix.
An effort was made to make calc easier to build under Windoz
An effort was made to make calc easier to build under Windows
using the Cygwin project (http://sources.redhat.com/cygwin/).
Thanks to the work of Thomas Jones-Low (tjoneslo at softstart
dot com), a number of #if defined(_WIN32)'s have been added
to calc source. These changes should not effect Windoz
to calc source. These changes should not effect Windows
free system such as GNU/Linux, Solaris, POSIX-like, etc ...
Added windll.h to deal with Windoz related DLL issues.
Added windll.h to deal with Windows related DLL issues.
Using the convention of 'extern DLL' instead of 'DLL extern'
to deal with symbols that export to or import from a DLL.
@@ -2747,12 +3226,12 @@ The following are the changes from calc version 2.11.5t0 to 2.11.5t1.1:
If HAVE_URANDOM is NO, then the Makefile will assume /dev/urandom does
not exist.
If TERMCONTROL is -DUSE_WIN32, then the Windoz terminal control
If TERMCONTROL is -DUSE_WIN32, then the Windows terminal control
(no TERMIOS, no TERMIO, no SGTTY) will be assumed.
Added a win32_hsrc Makefile rule to create hsrc files appropriate
for a Windoz system using Cygwin gcc environment. Added win32.mkdef
which is used by the win32_hsrc rule to set the Windoz specific
for a Windows system using Cygwin gcc environment. Added win32.mkdef
which is used by the win32_hsrc rule to set the Windows specific
Makefile values to build hsrc files. The hsrc files are built
under the win32 directory.
@@ -2821,7 +3300,7 @@ The following are the changes from calc version 2.11.5t0 to 2.11.5t1.1:
Configuration values that used to return "true" or "false" now return
1 (a true value) or 0 (a false value). Thus one can do:
if (config("tab")) { ... } else { ... }
if (config("tab")) { ... } else { ... }
The configuration values that now return 1 or 0 are:
@@ -2833,7 +3312,7 @@ The following are the changes from calc version 2.11.5t0 to 2.11.5t1.1:
config("windows")
Now shipping a win32 sub-directory that contains hsrc .h files
that have been attempted to be built for windoz.
that have been attempted to be built for Windows.
The following are the changes from calc version 2.11.4t1 to 2.11.4t2:
@@ -7862,7 +8341,7 @@ Following is a list of visible changes to calc from version 1.24.7 to 1.26.1:
A small bug in the library file regress.cal was fixed.
## Copyright (C) 2001-2017,2021 Landon Curt Noll
## Copyright (C) 2001-2017,2021,2022 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

128
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
https://github.com/lcn2/calc/blob/master/QUESTIONS.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

7
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,7 @@
# How to contribue code to calc
## CONTRIB-CODE
See the file
<A HREF="https://github.com/lcn2/calc/blob/master/CONTRIB-CODE">CONTRIB-CODE</A>
for how to contribue code to calc.

View File

@@ -3,20 +3,21 @@ IMPORTANT: Please see the section at the bottom of this file for
some important information on Makefiles used in calc.
###################################################################
# IMPORTANT: DO NOT run GNU make in parallel mode!!! #
# IMPORTANT: DO NOT use make in parallel mode!!! #
###################################################################
# Unfortunately due to the complex dependency issues between #
# Makefile, Makefile.ship and custom/Makefile, parallel GNU make #
# Makefile, Makefile.ship and custom/Makefile, parallel make #
# is NOT recommended. Sorry (tm Canada) :) #
###################################################################
Installing calc from the bzip2-ed tarball in 4 easy steps:
Installing calc from the bzip2-ed tarball: 4 easy steps:
(0) If your platform supports i686 RPMs, you may want to go to:
(0) If your platform supports i686 RPMs, you may want to go to:
http://www.isthe.com/chongo/src/calc/
https://github.com/lcn2/calc/releases
and use these RPMs:
Open up the 'Assets' tag below a given release and
download these RPMs:
* calc*.i686.rpm
- all that is needed if you just want to use calc
@@ -25,36 +26,137 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
- calc *.h header and *.a lib files for use in other programs
* calc.*.src.rpm
- calc source in RPM package form
- calc source via a SRPM package
The following 4 steps apply to calc source tree that comes from either:
Alternately to the above github link, you might try looking at
the RPMs under:
bunzip2 -c calc-*.tar.bz2 | tar -xvf -
http://www.isthe.com/chongo/src/calc/
or from:
=-=
rpm -ivh calc-*.src.rpm
cd /var/tmp
bunzip2 -c /usr/src/redhat/SOURCES/calc-*.tar.bz2 | tar -xvf -
The following 4 steps apply to calc source tree that comes from either:
(1) Look at the makefile, and adjust it to suit your needs.
bunzip2 -c calc-*.tar.bz2 | tar -xvf -
or from:
rpm -ivh calc-*.src.rpm
cd /var/tmp
bunzip2 -c /usr/src/redhat/SOURCES/calc-*.tar.bz2 | tar -xvf -
4 steps:
(1) Look at the makefile, and adjust it to suit your needs.
The top level Makefile and the custom/Makefile require a modern
Make (such as gmake) or an equivalently advanced make. On many
targets, the default make is sufficient. On FreeBSD for example,
probably want to use gmake instead of make.
Some report that under macOS, one has to declare the target
to be Darwin. So for macOS, one might have to do:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! By default, calc assumes you have the readline package installed !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! macOS does not have readline, so mac users need to make a choice !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# for macOS users only, force the target to be Darwin
#
make target=Darwin clobber
make target=Darwin all
make target=Darwin chk
make target=Darwin install
The readline package (-lreadline, -lhistory, -lncurses) used by and
linked into calc by default. If your system does NOT have those
libaraies, then you have two options:
If your target system does not have a moderm Makefile (such as gmake),
(1-with readline) Install the readline package <- Recommended
Install the readline package first, then compile calc.
For information on the readline package, see:
https://tiswww.case.edu/php/chet/readline/rltop.html
MacOS users can use MacPorts or HomeBrew to install readline:
https://www.macports.org
https://brew.sh
Or compile from the readline.git repo:
http://git.savannah.gnu.org/cgit/readline.git/
(1-w/o readline) Compile calc without readline (not recommended)
Why do we not recommend (1b)? Because using calc with readline
provides a beter user experience.
If you feel you must use calc without the readline package, then you
will need to change your calc Makefile with this patch:
--- Makefile.old 2021-12-29 14:57:56.000000000 -0800
+++ Makefile 2021-12-29 14:59:13.000000000 -0800
@@ -1140,14 +1140,14 @@
#
# If in doubt, set USE_READLINE, READLINE_LIB and READLINE_INCLUDE to nothing.
#
-#USE_READLINE=
-USE_READLINE= -DUSE_READLINE
+USE_READLINE=
+#USE_READLINE= -DUSE_READLINE
#
-#READLINE_LIB=
-#READLINE_EXTRAS=
+READLINE_LIB=
+READLINE_EXTRAS=
#
-READLINE_LIB= -lreadline
-READLINE_EXTRAS= -lhistory -lncurses
+#READLINE_LIB= -lreadline
+#READLINE_EXTRAS= -lhistory -lncurses
#
#READLINE_LIB= -L/usr/gnu/lib -lreadline
#READLINE_EXTRAS= -lhistory -lncurses
@@ -1181,8 +1181,8 @@
# # and using the readline, history, and ncurses libraries.
# #
ifneq ($(HOMEBREW_PREFIX),)
-READLINE_LIB:= -L${HOMEBREW_PREFIX}/opt/readline/lib -lreadline
-READLINE_INCLUDE:= -I${HOMEBREW_PREFIX}/opt/readline/include
+#READLINE_LIB:= -L${HOMEBREW_PREFIX}/opt/readline/lib -lreadline
+#READLINE_INCLUDE:= -I${HOMEBREW_PREFIX}/opt/readline/include
endif
#
#endif /* end of skip for non-Gnu makefiles */
If your target system does not have a modern Makefile
(such as gmake), then you will need to change your
Makefile.simple with this patch:
--- Makefile.simple.orig 2021-12-29 15:00:53.000000000 -0800
+++ Makefile.simple 2021-12-29 15:01:00.000000000 -0800
@@ -1005,14 +1005,14 @@
#
# If in doubt, set USE_READLINE, READLINE_LIB and READLINE_INCLUDE to nothing.
#
-#USE_READLINE=
-USE_READLINE= -DUSE_READLINE
+USE_READLINE=
+#USE_READLINE= -DUSE_READLINE
#
-#READLINE_LIB=
-#READLINE_EXTRAS=
+READLINE_LIB=
+READLINE_EXTRAS=
#
-READLINE_LIB= -lreadline
-READLINE_EXTRAS= -lhistory -lncurses
+#READLINE_LIB= -lreadline
+#READLINE_EXTRAS= -lhistory -lncurses
#
#READLINE_LIB= -L/usr/gnu/lib -lreadline
#READLINE_EXTRAS= -lhistory -lncurses
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! By default, calc assumes you are using a modern gnu-like make tool !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
If your target system does not have a modern Makefile (such as gmake),
then you should try using the Makefile.simple and custom/Makefile.simple
files:
@@ -69,17 +171,17 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
suggestion.
If you are using a modern make (such as gmake), you may override
any values set in the Mkefile by adding them to Makefile.local
any values set in the Makefile by adding them to Makefile.local
using the := directive. For example:
HAVE_STRING_H:= YES
HAVE_TIMES_H:= YES
SED:= /usr/local/bin/nsed
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! If you are building under Windoz or a Windoz-like environment !
! (such as Cygwin or DJGPP), read the README.WINDOWS file. !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! If you are building under Windows or a Windows-like environment !
! (such as Cygwin or DJGPP), read the README.WINDOWS file. !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
You should determine if these Makefile variables are reasonable:
@@ -87,7 +189,7 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
BINDIR Where to install calc binary files.
LIBDIR Where to install calc link library (*.a) files.
CALC_SHAREDIR Where to install calc help, .cal, startup, and
config files.
config files.
You may want to change the default installation locations for
these values, which are based on the 4 values listed above:
@@ -108,13 +210,13 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
For example, if:
BINDIR= /usr/bin
BINDIR= /usr/bin
LIBDIR= /usr/lib
CALC_SHAREDIR= /usr/share/calc
and if:
T= /var/tmp/testing
T= /var/tmp/testing
Then the installation locations will be:
@@ -202,22 +304,22 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
(3) test calc:
make check
==> If you run into problems, read the BUGS file and follow
the instructions found in there.
make check
NOTE: For a quiet check which only prints if something goes wrong:
make chk
make chk
(4) install calc:
make install
make install
We suggest that you might want to read the README.FIRST file and look at
the calc help subsystem. See also the README.md file.
In general, if you run into problems, read the BUGS file and follow
the instructions.
=-=
On calc Makefiles:
@@ -241,50 +343,38 @@ SHELL= ...
On some systems such as macOS, the bash shell is very
far behind to the point where is cannot be depended on.
On such systems, the zsh may be a much better alternative
On such systems, the sh may be a much better alternative
shell for this Makefile to use:
SHELL= /bin/zsh
SHELL= /bin/sh
Makefile
Makefile.local
# SRC: Makefile - Our calc build environment
# SRC: Makefile.local - tweaks to the top level Makefile
This is our internal Makefile that drives how we build calc.
For critical rules in Makefile.ship, there is a corresponding
rule in Makefile that calls ${MAKE} -f Makefile.ship with,
additional commands, args and Makefile variables. The ${XVAR}
Makefile variable, for example, is passed on each call to
${MAKE} -f Makefile.ship so that the environment and parameters of
Makefile.ship may be managed for our build environment.
Between releases, Makefile.local at the top of the master branch
will contain how we typically build calc and test calc (FYI: we
normally enable things such as -Werror -Wextra -pedantic). When we
push out a release, Makefile.local will be stripped of non-comment
lines. Thus, releases of calc, and, released "calc*.src.rpm"
files and the source tarballs, will have a Makefile.local with
only comments.
This Makefile is used to make the calc rpm. In addition to these
comments, this Makefile differs from the non-rpm bzip2-ed tarball
source Makefile in at least the the following ways:
If the Makefile is not suitable for you (say because you fetch it
from the top of the master branch between releases), then you may
wish to remove all non-comment lines. I.e., lines that do not start
with the # character.
CCWERR= -Werror
USE_READLINE= -DUSE_READLINE
READLINE_LIB= -lreadline -lhistory -lncurses
If the Makefile is not suitable for you, then
you may wish to replace it with Makefile.ship:
mv -f -v Makefile.ship Makefile
This Makefile assumes you have a modern make command such as
This Makefile.local assumes you have a modern make command such as
the GNU make. See Makefile.simple comment below if you do not
have such a modern make command.
In packages such as RPMs, and the tar.bz2 source tarball,
Makefile contains the contents of Makefile.ship. If Makefile.ship
is missing it has likely moved to replace Makefile.
In the calc GitHub repo, Makefile is the calc build environment
and Makefile.ship is the top level Makefile:
https://github.com/lcn2/calc
Makefile.ship
Makefile
# SRC: Makefile.ship - top level Makefile
@@ -324,16 +414,9 @@ Makefile.ship
...
#endif /* DO NOT DO THIS */
The custom/Makefile rule of Makefile.ship is used to form
the custom/Makefile. In particular the Makefile.ship lines:
# start of host target cut
... these go in between custom/Makefile.head and custom/Makefile.tail
# end of host target cut
Makefile.simple
# SRC: non-GNU Makefile via make -f Makefile.ship Makefile.simple
# SRC: Makefile.simple - non-GNU version
This is a non-GNU or simple Makefile designed for environments
that do not have a modern make command.
@@ -360,36 +443,15 @@ Makefile.simple
http://www.isthe.com/chongo/tech/comp/calc/calc-mirror.html
custom/Makefile.head
# SRC: custom/Makefile.head
This file forms the top part of the custom/Makefile.
custom/Makefile.tail
# SRC: custom/Makefile.tail
This file forms the bottom part of the custom/Makefile.
custom/Makefile
# SRC: Makefile via make -f Makefile custom/Makefile
This is the custom directory Makefile.
The custom/Makefile rule of Makefile.ship is used to form
the custom/Makefile. In particular the Makefile.ship lines:
# start of host target cut
... these go in between custom/Makefile.head and custom/Makefile.tail
# end of host target cut
NOTE: The clobber rule does not remove this file. - XXX
custom/Makefile.simple
# SRC: non-GNU Makefile via make -f Makefile custom/Makefile.simple
# SRC: custom/Makefile.simple - non-GNU version
This is a non-GNU or simple Makefile for the custom directory
that is designed for environments that do not have a modern make

14
LIBRARY
View File

@@ -216,7 +216,7 @@ Your program must handle parse/scan errors in one of two ways:
/* report the parse/scan */
if (calc_use_scanerr_jmpbuf == 0) {
printf("parse error: %s\n", calc_err_msg);
}
}
/* initialize calc after the longjmp */
initialize();
@@ -320,10 +320,10 @@ The arbitrary precision integer routines define a structure called a ZVALUE.
This is defined in zmath.h. A ZVALUE contains a pointer to an array of
integers, the length of the array, and a sign flag. The array is allocated
using malloc, so you need to free this array when you are done with a
ZVALUE. To do this, you should call zfree with the ZVALUE as an argument
(or call freeh with the pointer as an argument) and never try to free the
array yourself using free. The reason for this is that sometimes the pointer
points to one of two statically allocated arrays which should NOT be freed.
ZVALUE. To do this, you should call zfree() with the ZVALUE as an argument
and never try to free the array yourself using free(). The reason for this
is that sometimes the pointer points to a statically allocated arrays which
should NOT be freed.
The ZVALUE structures are passed to routines by value, and are returned
through pointers. For example, to multiply two small integers together,
@@ -615,14 +615,14 @@ These have the values 0, 1, and i.
LAST THINGS LAST
----------------
If you wish, when you are all doen you can call libcalc_call_me_last()
If you wish, when you are all done you can call libcalc_call_me_last()
to free a small amount of storage associated with the libcalc_call_me_first()
call. This is not required, but is does bring things to a closure.
The function libcalc_call_me_last() takes no args and returns void. You
need call libcalc_call_me_last() only once.
## Copyright (C) 1999 David I. Bell and Landon Curt Noll
## Copyright (C) 1999,2021 David I. Bell and 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

7544
Makefile

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1,39 @@
# Add below to override Makefile values (using :=) as in: HAVE_STRING_H:= YES
#
# Makefile.local - local Makefile variables
#
# This file is included by Makefile after the last Makefile is set and
# before the first make rule. This makes this file suitable to override
# Makefile variables.
#
# To replace a Makefile variable, use := symbols. For example:
#
# CCWERR:= -Werror
###################################################################
# NOTE: For this and other commended out examples in this file, #
# you need to remove the leading '#<whitespaces>' to take effect. #
# #
# Comments start with a #-character. #
###################################################################
# You can append to an existing Makefile variable using '+=' symbols.
# For example:
#
# CFLAGS+= -Ofast
# For example, a AddressSanitizer. You do NOT want to do this by
# by default! Do this only if you are debugging with libasan:
#
# For Linux gcc version 4.8.5 with libasan-4.8.5-4 you might try:
#
# CDEBUG:= -O0 -g
# CFLAGS+= -fsanitize=address -fno-omit-frame-pointer
# LDFLAGS+= -fsanitize=address -fno-omit-frame-pointer
# CALC_ENV+= ASAN_OPTIONS=detect_stack_use_after_return=1
#
# For macOS 12.1 with clang version 13.0.0 (clang-1300.0.29.30) you might try:
#
# CDEBUG:= -O0 -g
# CFLAGS+= -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
# LDFLAGS+= -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined
# CALC_ENV+= ASAN_OPTIONS=detect_stack_use_after_return=1

File diff suppressed because it is too large Load Diff

117
README.RELEASE Normal file
View File

@@ -0,0 +1,117 @@
On calc versions and releases
Calc version numbers have 4 levels. For example:
++=== top 2 levels: calc builtin functions compatibility
||
vvvv
2.14.0.8
\\\\\\
^ \\\\----> top 3 levels: calc important code base change
|
+--- top version level: internal representation compatibility
The top version level (e.g., 2) refers to the internal representation
of values. Any library or hardware linked/built for calc 2 will be able
to use values from other 2.x.y.z versions.
The top 2 levels (e.g., 2.14) refers to a specific compatible set of
builtin functions. Calc interpreted code (such as calc resource files)
written for, say calc 2.14, will be able to use the same set of builtin
functions for any other 2.14.y.z version. Any new builtin functions or
significant changes to existing builtin functions would be introduced in
a later release such as version 2.15.y.z. While calc scripts written for
2.14.y.z will highly likely be able to run under version 2.15.y.z, any
new builtin functions added in calc 2.15 may collide with an identically
named used defined function.
The top 3 levels (e.g., 2.14.0) change to reflect an important change to
the code base such as a bug fix or performance improvement. There was
neither a change to the internal representation format (a top level
version change), nor were there new calc builtins introduced in such
a top 3 level release.
There are 3 classes of changes to the calc source tree:
alpha => untagged GitHub commit
Any untagged commit to the GitHub master branch should be
considered as alpha code that may make calc unstable.
While we try to avoid breaking the calc code with commits,
there is a risk that picking up such a change could
negatively impact the code.
tested => tagged GitHub pre-release commit
A new version of calc has been released and has recently passed
regression testing on at least to different platforms and chip
architectures.
The "tested" class was historically called "untested",
however this term was misleading as such releases ARE tested.
Since 2.14.0.13 we have used the term "tested".
All tested releases are tagged with a new version number.
Such releases have GitHub assets such as a source tarball,
zip file, source rpm, development rpm and binary rpm. See the
orange "Pre-release" GitHub releases under:
https://github.com/lcn2/calc/releases
At the bottom of a given release is a "> Assets" that may
be opened to reveal down-loadable files.
production => tagged GitHub release commit
A new version of calc has been released and has undergone
extensive testing over time over a number of platforms.
Sometimes a "tested" release that is found work well over
a period of time will be re-released with a new version
number as a "production" release.
The latest production GitHub release is marked with green
"Latest" label under:
https://github.com/lcn2/calc/releases
A release that has neither an orange "Pre-release" nor
a green "Latest" label is a prior production class release.
At the bottom of a given release is a "> Assets" that may
be opened to reveal down-loadable files.
Production class code where stability is critical should use a
"production" release.
A historical note and apology:
In the past, some version number changes were made that did not fully
reflect the above version number or change class. Moreover older terms
such as "stable" and "unstable" were misleading and did not properly
reflect the nature of the change. Sorry! The purpose of this document
is to try and bring a better level of conformity to source code updates,
tagged releases and version numbers.
## Copyright (C) 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
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## Under source code control: 2021/12/12 19:36:26
## File existed as early as: 2021
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

View File

@@ -1,19 +1,55 @@
Dear calc user on a Windoz based system,
Dear calc user on a Windows based system,
See the HOWTO.INSTALL file for information on how to build and install calc.
See also the README file.
NOTE: The main developers do not have access to a Windoz based platform.
While we will make an effort to not break calc Windoz based system,
our lack of a Windoz test environment will mean we will make mistakes
from time to time. Hopefully Windowz users can overcome these mistakes.
BTW: While we are unable to use Windows 11, we welcome
Windows 11 developers to try compiling calc natively
(instead of via a Linux virtual machine). If you are
able to compile Windows 11 natively, we would welcome
GitHub pull requests showing any needed modifications:
https://github.com/lcn2/calc/pulls
Please also add notes to the 'Compiling calc under Windows 11'
section in README.WINDOWS file.
NOTE: The main developers do not have access to a Windows based platform.
While we will make an effort to not break calc Windows based system,
our lack of a Windows test environment will mean we will make mistakes
from time to time. Hopefully Windows users can overcome these mistakes.
Of course you are welcome to send us any patches that fix your
Windoz build environment.
Windows build environment.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-= Compiling calc under Windows 11 =-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-= compiling with Windows Subsystem for Linux (WSL) =-Cygwin =-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
We were given this advice from a Windows 11 developer:
Windows 11 users could use Cygwin:
https://cygwin.com/install.html
IMPORTANT: While installing Cygwin, and during Cygwin Setup, be sure to
select all the MinGW64 packages relating to gcc.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-= Compiling calc via virtual machine under Windows 11 =-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
We would prefer a Windows 11 solution that does not require a Windows 11
developer to install a Linux virtual machine. Nevertheless, a Windows 11
user might want to use the Microsoft Windows Subsystem (WSL) for Linux:
https://docs.microsoft.com/en-us/windows/wsl/
We have been told that you will need to turn on virtualization
to use this WSL subsystem.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-= Compiling calc under Windows 10 via Windows Subsystem for Linux (WSL) =-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
It has been reported that calc version 2.12.6.4 has been successfully
compiled, installed and running on Windows 10 on 2018 Jan 21.
@@ -78,9 +114,9 @@ needs.
In particular:
Just copy the win32/*.[ch] files up into the top level calc
source directory, edit them (if needed) and build using the
Cygwin GCC compiler and Cygwin build environment.
Just copy the win32/*.[ch] files up into the top level calc
source directory, edit them (if needed) and build using the
Cygwin GCC compiler and Cygwin build environment.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-= compiling under DJGPP =-=
@@ -128,7 +164,9 @@ recommends the following settings:
CALCPATH= .;./cal;~/.cal;${CALC_SHAREDIR};${CUSTOMCALDIR}
CALCRC= ./.calcinit;~/.calcrc;${CALC_SHAREDIR}/startup
CALCPAGER= less.exe -ci
DEBUG= -O2 -gstabs+ -DWINDOZ
DEBUG= -O2 -gstabs+ -D_WIN32
HAVE_ENVIRON=-DHAVE_NO_ENVIRON
HAVE_ARC4RANDOM=-DHAVE_NO_ARC4RANDOM
The 'Linux set' or 'gcc set' (see the Select your compiler type section)
should work for DJGPP systems if you set the above Makefile variables.
@@ -141,7 +179,7 @@ Follow those recommendations. In cases where they conflict with
the above Makefile list, follow the recommendation in the Makefile.
## Copyright (C) 2002-2009 Landon Curt Noll and Thomas Jones-Low
## Copyright (C) 2002-2009,2021 Landon Curt Noll and Thomas Jones-Low
##
## 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

19
SECURITY.md Normal file
View File

@@ -0,0 +1,19 @@
# Security Policy
## Supported Versions
The most recent version of calc is supported with security updates.
If the most recent stable of calc is also supported with security updates.
FYI: please review the BUGS file, or enter the calc command:
; help BUGS
## Reporting a Vulnerability
Please create a calc GitHub repo issue:
https://github.com/lcn2/calc/issues
Click on ((New issue)) and follow the issue template.

21
addop.c
View File

@@ -1,7 +1,7 @@
/*
* addop - add opcodes to a function being compiled
*
* Copyright (C) 1999-2007,2021 David I. Bell and Ernest Bowen
* Copyright (C) 1999-2007,2021,2022 David I. Bell and Ernest Bowen
*
* Primary author: David I. Bell
*
@@ -37,6 +37,7 @@
#include "symbol.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -68,12 +69,12 @@ initfunctions(void)
functemplate = (FUNC *) malloc(funcsize(maxopcodes));
if (functemplate == NULL) {
math_error("Cannot allocate function template");
/*NOTREACHED*/
not_reached();
}
functions = (FUNC **) malloc(sizeof(FUNC *) * FUNCALLOCSIZE);
if (functions == NULL) {
math_error("Cannot allocate function table");
/*NOTREACHED*/
not_reached();
}
funccount = 0;
funcavail = FUNCALLOCSIZE;
@@ -155,7 +156,7 @@ beginfunc(char *name, BOOL newflag)
fp = (FUNC *) malloc(funcsize(maxopcodes));
if (fp == NULL) {
math_error("Cannot allocate temporary function");
/*NOTREACHED*/
not_reached();
}
}
fp->f_next = NULL;
@@ -203,7 +204,7 @@ endfunc(void)
fp = (FUNC *) malloc(size);
if (fp == NULL) {
math_error("Cannot commit function");
/*NOTREACHED*/
not_reached();
}
memcpy((char *) fp, (char *) curfunc, size);
if (curfunc != functemplate)
@@ -257,13 +258,13 @@ adduserfunc(char *name)
sizeof(FUNC *) * (funcavail + FUNCALLOCSIZE));
if (functions == NULL) {
math_error("Failed to reallocate function table");
/*NOTREACHED*/
not_reached();
}
funcavail += FUNCALLOCSIZE;
}
if (addstr(&funcnames, name) == NULL) {
math_error("Cannot save function name");
/*NOTREACHED*/
not_reached();
}
index = funccount++;
functions[index] = NULL;
@@ -316,7 +317,7 @@ freefunc(FUNC *fp)
}
if (index == funccount) {
math_error("Bad call to freefunc!!!");
/*NOTREACHED*/
not_reached();
}
}
if (newname[0] != '*' && (conf->traceflags & TRACE_FNCODES)) {
@@ -386,7 +387,7 @@ findfunc(long index)
{
if (index >= funccount) {
math_error("Undefined function");
/*NOTREACHED*/
not_reached();
}
return functions[index];
}
@@ -438,7 +439,7 @@ addop(long op)
fp = (FUNC *) malloc(funcsize(maxopcodes));
if (fp == NULL) {
math_error("cannot malloc function");
/*NOTREACHED*/
not_reached();
}
memcpy((char *) fp, (char *) curfunc,
funcsize(curfunc->f_opcodecount));

View File

@@ -27,6 +27,11 @@
#include <stdio.h>
#include <signal.h>
#include "have_stdlib.h"
#if defined(HAVE_STDLIB_H)
#include <stdlib.h>
#endif
#include "longbits.h"
#include "have_unistd.h"
@@ -34,11 +39,13 @@
#include <unistd.h>
#endif
#include "have_unused.h"
#include "banned.h" /* include after system header <> includes */
static void buserr(void); /* catch alignment errors */
static void buserr(int arg); /* catch alignment errors */
int
@@ -46,7 +53,7 @@ main(void)
{
char byte[2*sizeof(USB32)]; /* mis-alignment buffer */
USB32 *p; /* mis-alignment pointer */
int i;
unsigned long i;
#if defined(MUST_ALIGN32)
/* force alignment */
@@ -82,7 +89,7 @@ main(void)
*/
/*ARGSUSED*/
static void
buserr(int arg)
buserr(int UNUSED(arg))
{
/* alignment is required */
printf("#define MUST_ALIGN32\t%c* must align 32 bit values *%c\n",

View File

@@ -42,9 +42,7 @@
# include <string.h>
#else
#if defined(_WIN32) && defined(NOTCYGWIN)
#include <stdio.h>
#endif
# if defined(HAVE_NEWSTR)
E_FUNC void *memcpy();

View File

@@ -1,7 +1,7 @@
/*
* assocfunc - association table routines
*
* Copyright (C) 1999-2007,2021 David I. Bell
* Copyright (C) 1999-2007,2021,2022 David I. Bell
*
* 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
@@ -36,6 +36,7 @@
#include "value.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -74,7 +75,7 @@ associndex(ASSOC *ap, BOOL create, long dim, VALUE *indices)
if (dim < 0) {
math_error("Negative dimension for indexing association");
/*NOTREACHED*/
not_reached();
}
/*
@@ -112,7 +113,7 @@ associndex(ASSOC *ap, BOOL create, long dim, VALUE *indices)
ep = (ASSOCELEM *) malloc(ELEMSIZE(dim));
if (ep == NULL) {
math_error("Cannot allocate association element");
/*NOTREACHED*/
not_reached();
}
ep->e_dim = dim;
ep->e_hash = hash;
@@ -142,13 +143,13 @@ assocsearch(ASSOC *ap, VALUE *vp, long i, long j, ZVALUE *index)
if (i < 0 || j > ap->a_count) {
math_error("This should not happen in assocsearch");
/*NOTREACHED*/
not_reached();
}
while (i < j) {
ep = elemindex(ap, i);
if (ep == NULL) {
math_error("This should not happen in assocsearch");
/*NOTREACHED*/
not_reached();
}
if (acceptvalue(&ep->e_value, vp)) {
utoz(i, index);
@@ -172,14 +173,14 @@ assocrsearch(ASSOC *ap, VALUE *vp, long i, long j, ZVALUE *index)
if (i < 0 || j > ap->a_count) {
math_error("This should not happen in assocsearch");
/*NOTREACHED*/
not_reached();
}
j--;
while (j >= i) {
ep = elemindex(ap, j);
if (ep == NULL) {
math_error("This should not happen in assocsearch");
/*NOTREACHED*/
not_reached();
}
if (acceptvalue(&ep->e_value, vp)) {
utoz(j, index);
@@ -333,7 +334,7 @@ assoccopy(ASSOC *oldap)
if (ep == NULL) {
math_error("Cannot allocate "
"association element");
/*NOTREACHED*/
not_reached();
}
ep->e_dim = oldep->e_dim;
ep->e_hash = oldep->e_hash;
@@ -374,7 +375,7 @@ resize(ASSOC *ap, long newsize)
newtable = (ASSOCELEM **) malloc(sizeof(ASSOCELEM *) * newsize);
if (newtable == NULL) {
math_error("No memory to grow association");
/*NOTREACHED*/
not_reached();
}
for (i = 0; i < newsize; i++)
newtable[i] = NULL;
@@ -430,7 +431,7 @@ assocalloc(long initsize)
ap = (ASSOC *) malloc(sizeof(ASSOC));
if (ap == NULL) {
math_error("No memory for association");
/*NOTREACHED*/
not_reached();
}
ap->a_count = 0;
ap->a_size = initsize;
@@ -438,7 +439,7 @@ assocalloc(long initsize)
if (ap->a_table == NULL) {
free((char *) ap);
math_error("No memory for association");
/*NOTREACHED*/
not_reached();
}
for (i = 0; i < initsize; i++)
ap->a_table[i] = NULL;

69
attribute.h Normal file
View File

@@ -0,0 +1,69 @@
/*
* attribute - control use of attributes in a backward compatible way
*
* Copyright (C) 2022 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
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Under source code control: 2022/01/21 22:51:25
* File existed as early as: 2022
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
#if !defined(INCLUDE_ATTRIBUTE_H)
#define INCLUDE_ATTRIBUTE_H
/*
* backward compatibility
*
* Not all compilers support __attribute__ nor do they suuport __has_builtin.
* For example, MSVC, TenDRAm and Little C Compiler doesn't support __attribute__.
* Early gcc does not support __attribute__.
*
* Not all compiles have __has_builtin
*/
#if !defined(__attribute__) && \
(defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
# define __attribute__(A)
#endif
#if !defined __has_builtin
# define __has_builtin(x) 0
#endif
/*
* not_reached
*
* In the old days of lint, one could give lint and friends a hint by
* placing the token NOTREACHED immediately between opening and closing
* comments. Modern compilers do not honor such commented tokens
* and instead rely on features such as __builtin_unreachable
* and __attribute__((noreturn)).
*
* The not_reached will either yield a __builtin_unreachable() feature call,
* or it will call abort from stdlib.
*/
#if __has_builtin(__builtin_unreachable)
# define not_reached() __builtin_unreachable()
#else
# define not_reached() abort()
#endif /* __has_builtin(__builtin_unreachable) */
#endif /* !INCLUDE_ATTRIBUTE_H */

View File

@@ -1,14 +1,14 @@
/*
* banned - optionally ban dqngerious functions
* banned - optionally ban dangerous functions
*
* Unless UNBAN is defined, this file will turn the use
* of certain dangerous functions into syntax errors.
*
* In the case of calc, we are motivated in part by the desire for
* calc to correctly calculate: even durings extremely long calculations.
* calc to correctly calculate: even during extremely long calculations.
*
* If UNBAN is NOT defined, then calling certain functions
* will result in a syntaxc error.
* will result in a syntax error.
*
* If we define UNBAN, then the effect of this file is disabled.
*
@@ -17,7 +17,7 @@
* if calculations.
*
* In the case of calc, we are motivated in part by the desire for calc
* to correctly calculate: even durings extremely long calculations.
* to correctly calculate: even during extremely long calculations.
*
* If UNBAN is NOT defined, then calling certain functions
* will result in a call to a non-existent function (link error).
@@ -88,11 +88,11 @@
* then into function calls that do not exist.
*
* In the case of calc, we are motivated in part by the desire
* for calc to correctly calculate: even durings extremely long
* for calc to correctly calculate: even during extremely long
* calculations.
*
* If UNBAN is NOT defined, then calling certain functions
* will result in a syntaxc error.
* will result in a syntax error.
*
* Unlike the above URL, we suggest an alternative function.
* In many cases, additional logic is required to use the

View File

@@ -1,7 +1,7 @@
/*
* blkcpy - general values and related routines used by the calculator
*
* Copyright (C) 1999-2007,2021 Landon Curt Noll and Ernest Bowen
* Copyright (C) 1999-2007,2021,2022 Landon Curt Noll and Ernest Bowen
*
* Primary author: Landon Curt Noll
*
@@ -36,6 +36,7 @@
#include "str.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -298,7 +299,7 @@ copymat2mat(MATRIX *smat, long ssi, long num, MATRIX *dmat, long dsi)
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
if (vtemp == NULL) {
math_error("Out of memory for mat-to-mat copy");
/*NOTREACHED*/
not_reached();
}
vp = smat->m_table + ssi;
vq = vtemp;
@@ -347,7 +348,7 @@ copyblk2mat(BLOCK *blk, long ssi, long num, MATRIX *dmat, long dsi)
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
if (vtemp == NULL) {
math_error("Out of memory for block-to-matrix copy");
/*NOTREACHED*/
not_reached();
}
vp = vtemp;
i = num;
@@ -404,7 +405,7 @@ copymat2blk(MATRIX *smat, long ssi, long num, BLOCK *dblk, long dsi,
newdata = (USB8*) realloc(dblk->data, newsize);
if (newdata == NULL) {
math_error("Out of memory for matrix-to-block copy");
/*NOTREACHED*/
not_reached();
}
dblk->data = newdata;
dblk->maxsize = newsize;
@@ -447,7 +448,7 @@ copymat2list(MATRIX *smat, long ssi, long num, LIST *lp, long dsi)
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
if (vtemp == NULL) {
math_error("Out of memory for matrix-to-list copy");
/*NOTREACHED*/
not_reached();
}
vp = smat->m_table + ssi;
vq = vtemp;
@@ -497,7 +498,7 @@ copylist2mat(LIST *lp, long ssi, long num, MATRIX *dmat, long dsi)
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
if (vtemp == NULL) {
math_error("Out of memory for list-to-matrix copy");
/*NOTREACHED*/
not_reached();
}
ep = listelement(lp, (long) ssi);
vp = vtemp;
@@ -547,7 +548,7 @@ copylist2list(LIST *slp, long ssi, long num, LIST *dlp, long dsi)
vtemp = (VALUE *) malloc(num * sizeof(VALUE));
if (vtemp == NULL) {
math_error("Out of memory for list-to-list copy");
/*NOTREACHED*/
not_reached();
}
sep = listelement(slp, (long) ssi);
vp = vtemp;
@@ -662,7 +663,7 @@ copyfile2blk(FILEID id, long ssi, long num, BLOCK *dblk, long dsi, BOOL noreloc)
newdata = (USB8*) realloc(dblk->data, newsize);
if (newdata == NULL) {
math_error("Out of memory for block-to-block copy");
/*NOTREACHED*/
not_reached();
}
dblk->data = newdata;
dblk->maxsize = newsize;
@@ -748,7 +749,7 @@ copyblk2blk(BLOCK *sblk, long ssi, long num, BLOCK *dblk, long dsi,
newdata = (USB8*) realloc(dblk->data, newsize);
if (newdata == NULL) {
math_error("Out of memory for block-to-block copy");
/*NOTREACHED*/
not_reached();
}
dblk->data = newdata;
dblk->maxsize = newsize;
@@ -792,7 +793,7 @@ copystr2blk(STRING *str, long ssi, long num, BLOCK *dblk, long dsi,
newdata = (USB8*) realloc(dblk->data, newsize);
if (newdata == NULL) {
math_error("Out of memory for string-to-block copy");
/*NOTREACHED*/
not_reached();
}
dblk->data = newdata;
dblk->maxsize = newsize;
@@ -913,7 +914,7 @@ copyostr2blk(char *str,long ssi,long num,BLOCK *dblk,long dsi,BOOL noreloc)
newdata = (USB8*) realloc(dblk->data, newsize);
if (newdata == NULL) {
math_error("Out of memory for string-to-block copy");
/*NOTREACHED*/
not_reached();
}
dblk->data = newdata;
dblk->maxsize = newsize;
@@ -945,7 +946,7 @@ memmove(void *s1, CONST void *s2, MEMMOVE_SIZE_T n)
*/
if (s1 == NULL || s2 == NULL) {
math_error("bogus memmove NULL ptr");
/*NOTREACHED*/
not_reached();
}
if (n <= 0) {
/* neg or 0 count does nothing */
@@ -1015,7 +1016,7 @@ copynum2blk(NUMBER *snum, long ssi, long num, BLOCK *dblk, long dsi,
newdata = (USB8*) realloc(dblk->data, newsize);
if (newdata == NULL) {
math_error("Out of memory for num-to-block copy");
/*NOTREACHED*/
not_reached();
}
dblk->data = newdata;
dblk->maxsize = newsize;
@@ -1086,7 +1087,7 @@ copyblk2num(BLOCK *sblk, long ssi, long num, NUMBER *dnum, long dsi,
swapped = (HALF *)malloc(halflen * sizeof(HALF));
if (swapped == NULL) {
math_error("Out of memory for block-to-num copy");
/*NOTREACHED*/
not_reached();
}
/* ensure that any trailing octets will be zero filled */
swapped[halflen-1] = 0;

41
block.c
View File

@@ -1,7 +1,7 @@
/*
* block - fixed, dynamic, fifo and circular memory blocks
*
* Copyright (C) 1999-2007,2021 Landon Curt Noll and Ernest Bowen
* Copyright (C) 1999-2007,2021,2022 Landon Curt Noll and Ernest Bowen
*
* Primary author: Landon Curt Noll
*
@@ -42,6 +42,7 @@
#include "calcerr.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -87,7 +88,7 @@ blkalloc(int len, int chunk)
nblk = (BLOCK *)malloc(sizeof(BLOCK));
if (nblk == NULL) {
math_error("cannot allocate block");
/*NOTREACHED*/
not_reached();
}
/*
@@ -98,7 +99,7 @@ blkalloc(int len, int chunk)
nblk->data = (USB8*)malloc(nblk->maxsize);
if (nblk->data == NULL) {
math_error("cannot allocate block data storage");
/*NOTREACHED*/
not_reached();
}
memset(nblk->data, 0, nblk->maxsize);
nblk->datalen = len;
@@ -156,7 +157,7 @@ blk_free(BLOCK *blk)
* blk - the BLOCK to check
*
* returns:
* if all is ok, otherwise math_error() is called and this
* if all is OK, otherwise math_error() is called and this
* function does not return
*/
S_FUNC void
@@ -172,7 +173,7 @@ blkchk(BLOCK *blk)
}
if (blk == NULL) {
math_error("internal: blk ptr is NULL");
/*NOTREACHED*/
not_reached();
}
/*
@@ -180,7 +181,7 @@ blkchk(BLOCK *blk)
*/
if (blk->data == NULL) {
math_error("internal: blk->data ptr is NULL");
/*NOTREACHED*/
not_reached();
}
/*
@@ -188,7 +189,7 @@ blkchk(BLOCK *blk)
*/
if (blk->datalen < 0) {
math_error("internal: blk->datalen < 0");
/*NOTREACHED*/
not_reached();
}
/*
@@ -196,7 +197,7 @@ blkchk(BLOCK *blk)
*/
if (blk->datalen < 0) {
math_error("internal: blk->datalen < 0");
/*NOTREACHED*/
not_reached();
}
return;
}
@@ -259,7 +260,7 @@ blkrealloc(BLOCK *blk, int newlen, int newchunk)
nblk = (USB8*)realloc(blk->data, newmax);
if (nblk == NULL) {
math_error("cannot reallocate block storage");
/*NOTREACHED*/
not_reached();
}
/* clear any new storage */
@@ -367,7 +368,7 @@ blktrunc(BLOCK *blk)
blk->data = (USB8*)malloc(1);
if (blk->data == NULL) {
math_error("cannot allocate truncated block storage");
/*NOTREACHED*/
not_reached();
}
blk->data[0] = (USB8)0;
if (conf->calc_debug & CALCDBG_BLOCK) {
@@ -397,7 +398,7 @@ blk_copy(BLOCK *blk)
nblk = (BLOCK *)malloc(sizeof(BLOCK));
if (nblk == NULL) {
math_error("blk_copy: cannot malloc BLOCK");
/*NOTREACHED*/
not_reached();
}
/*
@@ -411,7 +412,7 @@ blk_copy(BLOCK *blk)
nblk->data = (USB8 *)malloc(blk->maxsize);
if (nblk->data == NULL) {
math_error("blk_copy: cannot duplicate block data");
/*NOTREACHED*/
not_reached();
}
memcpy(nblk->data, blk->data, blk->maxsize);
return nblk;
@@ -539,7 +540,7 @@ reallocnblock(int id, int len, int chunk)
/* Fire wall */
if (id < 0 || id >= nblockcount) {
math_error("Bad id in call to reallocnblock");
/*NOTREACHED*/
not_reached();
}
blk = nblocks[id]->blk;
@@ -556,13 +557,13 @@ reallocnblock(int id, int len, int chunk)
newdata = malloc(newsize);
if (newdata == NULL) {
math_error("Allocation failed");
/*NOTREACHED*/
not_reached();
}
} else if (newsize != oldsize) {
newdata = realloc(blk->data, newsize);
if (newdata == NULL) {
math_error("Reallocation failed");
/*NOTREACHED*/
not_reached();
}
}
memset(newdata + len, 0, newsize - len);
@@ -593,7 +594,7 @@ createnblock(char *name, int len, int chunk)
if (nblocks == NULL) {
maxnblockcount = 0;
math_error("unable to malloc new named blocks");
/*NOTREACHED*/
not_reached();
}
} else {
maxnblockcount += NBLOCKCHUNK;
@@ -602,7 +603,7 @@ createnblock(char *name, int len, int chunk)
if (nblocks == NULL) {
maxnblockcount = 0;
math_error("cannot malloc more named blocks");
/*NOTREACHED*/
not_reached();
}
}
}
@@ -610,18 +611,18 @@ createnblock(char *name, int len, int chunk)
initstr(&nblocknames);
if (findstr(&nblocknames, name) >= 0) {
math_error("Named block already exists!!!");
/*NOTREACHED*/
not_reached();
}
newname = addstr(&nblocknames, name);
if (newname == NULL) {
math_error("Block name allocation failed");
/*NOTREACHED*/
not_reached();
}
res = (NBLOCK *) malloc(sizeof(NBLOCK));
if (res == NULL) {
math_error("Named block allocation failed");
/*NOTREACHED*/
not_reached();
}
nblocks[nblockcount] = res;

View File

@@ -1,7 +1,7 @@
/*
* byteswap - byte swapping routines
*
* Copyright (C) 1999,2021 Landon Curt Noll
* Copyright (C) 1999,2021,2022 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
@@ -29,6 +29,7 @@
#include "byteswap.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -36,7 +37,7 @@
* swap_b8_in_HALFs - swap 8 and if needed, 16 bits in an array of HALFs
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a HALF array to swap
* len - length of the src HALF array
@@ -76,7 +77,7 @@ swap_b8_in_HALFs(HALF *dest, HALF *src, LEN len)
* swap_b8_in_ZVALUE - swap 8 and if needed, 16 bits in a ZVALUE
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a ZVALUE to swap
* all - TRUE => swap every element, FALSE => swap only the
@@ -103,7 +104,7 @@ swap_b8_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all)
if (dest == NULL) {
math_error("swap_b8_in_ZVALUE: swap_b8_in_ZVALUE: "
"Not enough memory");
/*NOTREACHED*/
not_reached();
}
/*
@@ -144,7 +145,7 @@ swap_b8_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all)
* swap_b8_in_NUMBER - swap 8 and if needed, 16 bits in a NUMBER
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a NUMBER to swap
* all - TRUE => swap every element, FALSE => swap only the
@@ -170,7 +171,7 @@ swap_b8_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all)
dest = malloc(sizeof(NUMBER));
if (dest == NULL) {
math_error("swap_b8_in_NUMBER: Not enough memory");
/*NOTREACHED*/
not_reached();
}
/*
@@ -208,7 +209,7 @@ swap_b8_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all)
* swap_b8_in_COMPLEX - swap 8 and if needed, 16 bits in a COMPLEX
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a COMPLEX to swap
* all - TRUE => swap every element, FALSE => swap only the
@@ -234,7 +235,7 @@ swap_b8_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all)
dest = malloc(sizeof(COMPLEX));
if (dest == NULL) {
math_error("swap_b8_in_COMPLEX: Not enough memory");
/*NOTREACHED*/
not_reached();
}
/*
@@ -272,7 +273,7 @@ swap_b8_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all)
* swap_b16_in_HALFs - swap 16 bits in an array of HALFs
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a HALF array to swap
* len - length of the src HALF array
@@ -312,7 +313,7 @@ swap_b16_in_HALFs(HALF *dest, HALF *src, LEN len)
* swap_b16_in_ZVALUE - swap 16 bits in a ZVALUE
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a ZVALUE to swap
* all - TRUE => swap every element, FALSE => swap only the
@@ -338,7 +339,7 @@ swap_b16_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all)
dest = malloc(sizeof(ZVALUE));
if (dest == NULL) {
math_error("swap_b16_in_ZVALUE: Not enough memory");
/*NOTREACHED*/
not_reached();
}
/*
@@ -379,7 +380,7 @@ swap_b16_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all)
* swap_b16_in_NUMBER - swap 16 bits in a NUMBER
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a NUMBER to swap
* all - TRUE => swap every element, FALSE => swap only the
@@ -405,7 +406,7 @@ swap_b16_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all)
dest = malloc(sizeof(NUMBER));
if (dest == NULL) {
math_error("swap_b16_in_NUMBER: Not enough memory");
/*NOTREACHED*/
not_reached();
}
/*
@@ -443,7 +444,7 @@ swap_b16_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all)
* swap_b16_in_COMPLEX - swap 16 bits in a COMPLEX
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a COMPLEX to swap
* all - TRUE => swap every element, FALSE => swap only the
@@ -469,7 +470,7 @@ swap_b16_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all)
dest = malloc(sizeof(COMPLEX));
if (dest == NULL) {
math_error("swap_b16_in_COMPLEX: Not enough memory");
/*NOTREACHED*/
not_reached();
}
/*
@@ -507,7 +508,7 @@ swap_b16_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all)
* swap_HALF_in_ZVALUE - swap HALFs in a ZVALUE
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a ZVALUE to swap
* all - TRUE => swap every element, FALSE => swap only the
@@ -533,7 +534,7 @@ swap_HALF_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all)
dest = malloc(sizeof(ZVALUE));
if (dest == NULL) {
math_error("swap_HALF_in_ZVALUE: Not enough memory");
/*NOTREACHED*/
not_reached();
}
/*
@@ -575,7 +576,7 @@ swap_HALF_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all)
* swap_HALF_in_NUMBER - swap HALFs in a NUMBER
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a NUMBER to swap
* all - TRUE => swap every element, FALSE => swap only the
@@ -601,7 +602,7 @@ swap_HALF_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all)
dest = malloc(sizeof(NUMBER));
if (dest == NULL) {
math_error("swap_HALF_in_NUMBER: Not enough memory");
/*NOTREACHED*/
not_reached();
}
/*
@@ -639,7 +640,7 @@ swap_HALF_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all)
* swap_HALF_in_COMPLEX - swap HALFs in a COMPLEX
*
* given:
* dest - pointer to where the swapped src wil be put or
* dest - pointer to where the swapped src will be put or
* NULL to allocate the storage
* src - pointer to a COMPLEX to swap
* all - TRUE => swap every element, FALSE => swap only the
@@ -665,7 +666,7 @@ swap_HALF_in_COMPLEX(COMPLEX *dest, COMPLEX *src, BOOL all)
dest = malloc(sizeof(COMPLEX));
if (dest == NULL) {
math_error("swap_HALF_in_COMPLEX: Not enough memory");
/*NOTREACHED*/
not_reached();
}
/*

View File

@@ -1,7 +1,7 @@
/*
* byteswap - byte swapping macros
*
* Copyright (C) 1999,2014 Landon Curt Noll
* Copyright (C) 1999,2014,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,7 @@
/*
* SWAP_B8_IN_B16 - swap 8 bits in 16 bits
*
* dest - pointer to where the swapped src wil be put
* dest - pointer to where the swapped src will be put
* src - pointer to a 16 bit value to swap
*
* This macro will either switch to the opposite byte sex (Big Endian vs.
@@ -53,7 +53,7 @@
/*
* SWAP_B16_IN_B32 - swap 16 bits in 32 bits
*
* dest - pointer to where the swapped src wil be put
* dest - pointer to where the swapped src will be put
* src - pointer to a 32 bit value to swap
*/
#define SWAP_B16_IN_B32(dest, src) ( \
@@ -64,7 +64,7 @@
/*
* SWAP_B8_IN_B32 - swap 8 & 16 bits in 32 bits
*
* dest - pointer to where the swapped src wil be put
* dest - pointer to where the swapped src will be put
* src - pointer to a 32 bit value to swap
*
* This macro will either switch to the opposite byte sex (Big Endian vs.
@@ -82,7 +82,7 @@
/*
* SWAP_B32_IN_B64 - swap 32 bits in 64 bits
*
* dest - pointer to where the swapped src wil be put
* dest - pointer to where the swapped src will be put
* src - pointer to a 64 bit value to swap
*/
#define SWAP_B32_IN_B64(dest, src) ( \
@@ -93,7 +93,7 @@
/*
* SWAP_B16_IN_B64 - swap 16 & 32 bits in 64 bits
*
* dest - pointer to where the swapped src wil be put
* dest - pointer to where the swapped src will be put
* src - pointer to a 64 bit value to swap
*/
#define SWAP_B16_IN_B64(dest, src) ( \
@@ -106,7 +106,7 @@
/*
* SWAP_B8_IN_B64 - swap 16 & 32 bits in 64 bits
*
* dest - pointer to where the swapped src wil be put
* dest - pointer to where the swapped src will be put
* src - pointer to a 64 bit value to swap
*
* This macro will either switch to the opposite byte sex (Big Endian vs.
@@ -124,7 +124,7 @@
/*
* SWAP_B32_IN_B64 - swap 32 bits in 64 bits (simulated by 2 32 bit values)
*
* dest - pointer to where the swapped src wil be put
* dest - pointer to where the swapped src will be put
* src - pointer to a 64 bit value to swap
*/
#define SWAP_B32_IN_B64(dest, src) ( \
@@ -135,7 +135,7 @@
/*
* SWAP_B16_IN_B64 - swap 16 & 32 bits in 64 bits (simulated by 2 32 bit vals)
*
* dest - pointer to where the swapped src wil be put
* dest - pointer to where the swapped src will be put
* src - pointer to a 64 bit value to swap
*/
#define SWAP_B16_IN_B64(dest, src) ( \
@@ -146,7 +146,7 @@
/*
* SWAP_B8_IN_B64 - swap 16 & 32 bits in 64 bits (simulated by 2 32 bit vals)
*
* dest - pointer to where the swapped src wil be put
* dest - pointer to where the swapped src will be put
* src - pointer to a 64 bit value to swap
*
* This macro will either switch to the opposite byte sex (Big Endian vs.

View File

@@ -2,7 +2,7 @@
#
# cal - makefile for calc standard resource files
#
# Copyright (C) 1999-2006,2017,2021 Landon Curt Noll
# Copyright (C) 1999-2006,2017,2021,2022 Landon Curt Noll
#
# SRC: cal/Makefile
#
@@ -48,14 +48,18 @@
#
# On some systems such as macOS, the bash shell is very
# far behind to the point where is cannot be depended on.
# On such systems, the zsh may be a much better alternative
# On such systems, the sh may be a much better alternative
# shell for this Makefile to use:
#
# SHELL= /bin/zsh
# SHELL= /bin/sh
#
SHELL= /bin/sh
#SHELL= /bin/bash
#SHELL= /bin/zsh
SHELL= /bin/bash
#SHELL= /bin/sh
#if 0 /* start of skip for non-Gnu makefiles */
ifeq ($(target),Darwin)
SHELL:= /bin/zsh
endif
#endif /* end of skip for non-Gnu makefiles */
####
@@ -102,15 +106,6 @@ PREFIX= /usr/local
#
MAKE_FILE= Makefile
# Controlling file makefile basename (without the path)
#
# This is the basename same of the makefile that may/does/will drive
# this makefile.
#
# If in doubt, set TOP_MAKE_FILE to Makefile
#
TOP_MAKE_FILE= Makefile
# Where the system include (.h) files are kept
#
# For DJGPP, select:
@@ -220,10 +215,10 @@ T=
# H=@: do not report hsrc file formation progress
# H=@ do echo hsrc file formation progress
#
# S= >/dev/null 2>&1 slience ${CC} output during hsrc file formation
# S= >/dev/null 2>&1 silence ${CC} output during hsrc file formation
# S= full ${CC} output during hsrc file formation
#
# E= 2>/dev/null slience command stderr during hsrc file formation
# E= 2>/dev/null silence command stderr during hsrc file formation
# E= full command stderr during hsrc file formation
#
# V=@: do not echo debug statements (quiet mode)
@@ -272,20 +267,20 @@ TRUE= true
#
CALC_FILES= README alg_config.cal beer.cal bernoulli.cal \
bernpoly.cal bigprime.cal bindings brentsolve.cal chi.cal chrem.cal \
constants.cal deg.cal dms.cal dotest.cal ellip.cal factorial.cal \
factorial2.cal gvec.cal hello.cal hms.cal infinities.cal intfile.cal \
intnum.cal lambertw.cal linear.cal lnseries.cal lucas.cal \
lucas_chk.cal mersenne.cal mfactor.cal mod.cal natnumset.cal pell.cal \
pi.cal pix.cal pollard.cal poly.cal prompt.cal psqrt.cal qtime.cal \
quat.cal randbitrun.cal randmprime.cal randombitrun.cal randomrun.cal \
randrun.cal regress.cal repeat.cal screen.cal seedrandom.cal \
set8700.cal set8700.line smallfactors.cal solve.cal \
specialfunctions.cal statistics.cal strings.cal sumsq.cal sumtimes.cal \
surd.cal test1700.cal test2300.cal test2600.cal test2700.cal \
test3100.cal test3300.cal test3400.cal test3500.cal test4000.cal \
test4100.cal test4600.cal test5100.cal test5200.cal test8400.cal \
test8500.cal test8600.cal test8900.cal toomcook.cal unitfrac.cal \
varargs.cal xx_print.cal zeta2.cal
comma.cal constants.cal deg.cal dms.cal dotest.cal ellip.cal \
factorial.cal factorial2.cal gvec.cal hello.cal hms.cal infinities.cal \
intfile.cal intnum.cal lambertw.cal linear.cal lnseries.cal lucas.cal \
lucas_chk.cal mersenne.cal mfactor.cal mod.cal natnumset.cal \
palindrome.cal pell.cal pi.cal pix.cal pollard.cal poly.cal prompt.cal \
psqrt.cal qtime.cal quat.cal randbitrun.cal randmprime.cal \
randombitrun.cal randomrun.cal randrun.cal regress.cal repeat.cal \
screen.cal seedrandom.cal set8700.cal set8700.line smallfactors.cal \
solve.cal specialfunctions.cal statistics.cal strings.cal sumsq.cal \
sumtimes.cal surd.cal test1700.cal test2300.cal test2600.cal \
test2700.cal test3100.cal test3300.cal test3400.cal test3500.cal \
test4000.cal test4100.cal test4600.cal test5100.cal test5200.cal \
test8400.cal test8500.cal test8600.cal test8900.cal toomcook.cal \
unitfrac.cal varargs.cal xx_print.cal zeta2.cal
# These calc files are now obsolete and are removed by the install rule.
#
@@ -298,6 +293,10 @@ DISTLIST= ${CALC_FILES} ${MAKE_FILE}
# These files are used to make (but not built) a calc .a link library
#
CALCLIBLIST=
#
# rules that are not also names of files
#
PHONY= all clobber distlist install
all: ${CALC_FILES} ${MAKE_FILE} .all
@@ -307,6 +306,8 @@ all: ${CALC_FILES} ${MAKE_FILE} .all
${RM} -f .all
${TOUCH} .all
.PHONY: ${PHONY}
##
#
# File list generation. You can ignore this section.
@@ -461,7 +462,7 @@ uninstall:
continue; \
fi; \
if [ -f "${T}${CALC_SHAREDIR}/$$i" ]; then \
${RM} -f "${T}${CALC_SHAREDIR}/$$i"; \
${RM} -f "${T}${CALC_SHAREDIR}/$$i"; \
if [ -f "${T}${CALC_SHAREDIR}/$$i" ]; then \
echo "cannot uninstall ${T}${CALC_SHAREDIR}/$$i"; \
else \

View File

@@ -186,7 +186,7 @@ bernoulli.cal
Calculate the nth Bernoulli number.
NOTE: There is now a bernoulli() builtin function. This file is
left here for backward compatibility and now simply returns
left here for backward compatibility and now simply returns
the builtin function.
@@ -263,6 +263,64 @@ chrem.cal
Chinese remainder theorem/problem solver.
comma.cal
Convert numbers into strings with 3-digit group and integer-fraction
separators.
If the value is an integer, the integer-fraction separator is not used.
str_comma(x, [group, [decimal]])
Convert x into a string.
If group is given and is a string, group will be used as
the 3-digit group separator, otherwise the default 3-digit
group separator will be used.
If decimal is given and is a string, group will be used as
the integer-fraction separator, otherwise the default
integer-fraction separator will be used.
The decimal and group arguments are optional.
set_default_group_separator(group)
Change the default 3-digit group separator if group is a string,
otherwise the default 3-digit group separator will not be
changed. Return the old 3-digit group separator.
set_default_decimal_separator(decimal)
Change the default 3-digit group separator if decimal is a
string, otherwise the default integer-fraction separator
will not be changed. Return the old integer-fraction separator.
print_comma(x, [group, [decimal]])
Print the value produced by str_comma(x, [group, [decimal]])
followed by a newline.
If the str_comma() does not return a string, nothing is printed.
The decimal and group arguments are optional.
The value produced by str_comma() is returned.
fprint_comma(fd, x, [group, [decimal]])
Print the value produced by str_comma(x, [group, [decimal]]),
without a trailing newline, on file fd.
If the str_comma() does not return a string, nothing is printed.
If fd is not an open file, nothing is printed.
The decimal and group arguments are optional.
The value produced by str_comma() is returned.
deg.cal
deg(deg, min, sec)
@@ -767,7 +825,7 @@ lucas.cal
prove that h*2^n-1 is prime or not prime.
NOTE: Some call this term u(0). The function gen_u0(h, n, v1)
simply calls gen_u2(h, n, v1) for such people. :-)
simply calls gen_u2(h, n, v1) for such people. :-)
gen_v1(h, v)
@@ -879,6 +937,38 @@ natnumset.cal
user-specified bound.
palindrome.cal
digitof(val,place)
copalplace(d,place)
upperhalf(val)
mkpal(val)
mkpalmiddigit(val,digit)
ispal(val)
nextpal(val)
prevpal(val)
nextprimepal(val)
prevprimepal(val)
Functions to form and manipulate palindromes in base 10.
Important functions are:
Find the next / previous palindrome:
nextpal(val)
prevpal(val)
Test if a value is a palindrome:
ispal(val)
Find the next / previous palindrome that is a (highly probable) prime:
nextprimepal(val)
prevprimepal(val)
pell.cal
pellx(D)
@@ -900,7 +990,7 @@ pi.cal
as your free memory space and system up time allows.
The piforever() function (written by Klaus Alexander Seistrup
<klaus@seistrup.dk>) was inspired by an algorithm conceived by
<klaus at seistrup dot dk>) was inspired by an algorithm conceived by
Lambert Meertens. See also the ABC Programmer's Handbook, by Geurts,
Meertens & Pemberton, published by Prentice-Hall (UK) Ltd., 1990.
@@ -1435,7 +1525,7 @@ sumtimes.cal
the list or matrix to use. The doalltimes() function will run
all of the sumtimes tests. For example:
doalltimes(1e6);
doalltimes(1e6);
surd.cal

View File

@@ -474,7 +474,7 @@ define best_mul2()
*/
while (low+1 < high) {
/* try the mid-point */
/* try the mid-point */
mid = int((low+high)/2);
if (config("user_debug") > 0) {
printf("testing multiply alg1/alg2 ratio for len = %d\n", mid);
@@ -497,7 +497,7 @@ define best_mul2()
low = mid;
high = mid;
if (config("user_debug") > 0) {
printf("\twe are close enough to unity ratio at: %d\n", mid);
printf("\twe are close enough to unity ratio at: %d\n", mid);
}
break;
}
@@ -505,7 +505,7 @@ define best_mul2()
/* bump lower range up if we went over */
if (ratio > 1.0) {
if (config("user_debug") > 2) {
printf("\tmove low from %d up to %d\n",
printf("\tmove low from %d up to %d\n",
low, mid);
}
low = mid;
@@ -513,7 +513,7 @@ define best_mul2()
/* drop higher range down if we went under */
} else {
if (config("user_debug") > 2) {
printf("\tmove high from %d down to %d\n",
printf("\tmove high from %d down to %d\n",
high, mid);
}
high = mid;
@@ -522,7 +522,7 @@ define best_mul2()
/* report on test loop progress */
if (config("user_debug") > 1) {
printf("\tsetting low: %d high: %d diff: %d\n",
low, high, high-low);
low, high, high-low);
}
}
@@ -884,7 +884,7 @@ define best_sq2()
high *= expand;
if (config("user_debug") > 1) {
printf(" expand the next test range by a factor of %d\n",
expand);
expand);
}
/*
@@ -956,7 +956,7 @@ define best_sq2()
*/
while (low+1 < high) {
/* try the mid-point */
/* try the mid-point */
mid = int((low+high)/2);
if (config("user_debug") > 0) {
printf("testing square alg1/alg2 ratio for len = %d\n", mid);
@@ -979,7 +979,7 @@ define best_sq2()
low = mid;
high = mid;
if (config("user_debug") > 0) {
printf("\twe are close enough to unity ratio at: %d\n", mid);
printf("\twe are close enough to unity ratio at: %d\n", mid);
}
break;
}
@@ -987,7 +987,7 @@ define best_sq2()
/* bump lower range up if we went over */
if (ratio > 1.0) {
if (config("user_debug") > 2) {
printf("\tmove low from %d up to %d\n",
printf("\tmove low from %d up to %d\n",
low, mid);
}
low = mid;
@@ -995,7 +995,7 @@ define best_sq2()
/* drop higher range down if we went under */
} else {
if (config("user_debug") > 2) {
printf("\tmove high from %d down to %d\n",
printf("\tmove high from %d down to %d\n",
high, mid);
}
high = mid;
@@ -1004,7 +1004,7 @@ define best_sq2()
/* report on test loop progress */
if (config("user_debug") > 1) {
printf("\tsetting low: %d high: %d diff: %d\n",
low, high, high-low);
low, high, high-low);
}
}
@@ -1385,7 +1385,7 @@ define best_pow2()
printf(" pmod alg1/alg2 ratio = %.3f\n", ratio);
if (ratio > 1.0 && ratio <= 1.02) {
printf(" while alg1 is slightly better than alg2, "
"it is not clearly better\n");
"it is not clearly better\n");
}
}
} while (ratio <= 1.02);
@@ -1420,7 +1420,7 @@ define best_pow2()
high *= expand;
if (config("user_debug") > 1) {
printf(" expand the next test range by a factor of %d\n",
expand);
expand);
}
/*
@@ -1455,7 +1455,7 @@ define best_pow2()
*/
while (low+1 < high) {
/* try the mid-point */
/* try the mid-point */
mid = int((low+high)/2);
if (config("user_debug") > 0) {
printf("testing pow2 alg1/alg2 ratio for len = %d\n", mid);
@@ -1478,7 +1478,7 @@ define best_pow2()
low = mid;
high = mid;
if (config("user_debug") > 0) {
printf("\twe are close enough to unity ratio at: %d\n", mid);
printf("\twe are close enough to unity ratio at: %d\n", mid);
}
break;
}
@@ -1486,7 +1486,7 @@ define best_pow2()
/* bump lower range up if we went over */
if (ratio > 1.0) {
if (config("user_debug") > 2) {
printf("\tmove low from %d up to %d\n",
printf("\tmove low from %d up to %d\n",
low, mid);
}
low = mid;
@@ -1494,7 +1494,7 @@ define best_pow2()
/* drop higher range down if we went under */
} else {
if (config("user_debug") > 2) {
printf("\tmove high from %d down to %d\n",
printf("\tmove high from %d down to %d\n",
high, mid);
}
high = mid;
@@ -1503,7 +1503,7 @@ define best_pow2()
/* report on test loop progress */
if (config("user_debug") > 1) {
printf("\tsetting low: %d high: %d diff: %d\n",
low, high, high-low);
low, high, high-low);
}
}

View File

@@ -40,7 +40,7 @@ define Z(x, eps_term)
/* obtain the error term */
if (isnull(eps_term)) {
eps = epsilon();
eps = epsilon();
} else {
eps = eps_term;
}
@@ -81,7 +81,7 @@ define P(x, eps_term)
/* obtain the error term */
if (isnull(eps_term)) {
eps = epsilon();
eps = epsilon();
} else {
eps = eps_term;
}

437
cal/comma.cal Normal file
View File

@@ -0,0 +1,437 @@
/*
* comma - convert numbers into strings with 3-digit group and integer-fraction separators
*
* Convert numbers into strings with 3-digit group and integer-fraction separators.
*
* If the value is an integer, the integer-fraction separator is not used.
*
* str_comma(x, [group, [decimal]])
*
* Convert x into a string.
*
* If group is given and is a string, group will be used as
* the 3-digit group separator, otherwise the default 3-digit
* group separator will be used.
*
* If decimal is given and is a string, group will be used as
* the integer-fraction separator, otherwise the default
* integer-fraction separator will be used.
*
* The decimal and group arguments are optional.
*
* set_default_group_separator(group)
*
* Change the default 3-digit group separator if group is a string,
* otherwise the default 3-digit group separator will not be
* changed. Return the old 3-digit group separator.
*
* set_default_decimal_separator(decimal)
*
* Change the default 3-digit group separator if decimal is a
* string, otherwise the default integer-fraction separator
* will not be changed. Return the old integer-fraction separator.
*
* print_comma(x, [group, [decimal]])
*
* Print the value produced by str_comma(x, [group, [decimal]])
* followed by a newline.
*
* If the str_comma() does not return a string, nothing is printed.
*
* The decimal and group arguments are optional.
*
* The value produced by str_comma() is returned.
*
* fprint_comma(fd, x, [group, [decimal]])
*
* Print the value produced by str_comma(x, [group, [decimal]]),
* without a trailing newline, on file fd.
*
* If the str_comma() does not return a string, nothing is printed.
*
* If fd is not an open file, nothing is printed.
*
* The decimal and group arguments are optional.
*
* The value produced by str_comma() is returned.
*
* Copyright (C) 2022 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
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Under source code control: 2022/06/20 15:51:49
* File existed as early as: 2022
*
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
static default_group_separator = ","; /* default 3-digit group separator */
static default_decimal_separator = "."; /* default integer-fraction separator */
/*
* str_comma - convert number into base 10 string with 3-digit groups and integer-fraction separator
*
*
* This function converts a real number into a base 10 string, where
* groups of 3 digits are separated by a 3-digit group separator and
* a integer-fraction separator is printed between integer and decimal fraction.
*
* For example:
*
* string = str_comma(x);
* string = str_comma(x), " ", ".");
* string = str_comma(x), ".", ",");
*
* Internally the function calls:
*
* strprintf("%f", x);
*
* and thus the number of decimal fraction digits is subject to
* the display() or config("display") value. See:
*
* man display
*
* for details.
*
* given:
*
* x number to convert
*
* optional args:
*
* group use this 3-digit group separator
* decimal use this integer-fraction separator
*
* returns:
*
* string containing the base 10 digits with group and decimal separators, OR
* null() if x is not a number, OR
* null() if group is neither null() (not given) nor a string, OR
* null() if group is null() (not given) AND default_group_separator is not a string, OR
* null() if decimal is neither null() (not given) nor a string, OR
* null() if decimal is null() (not given) AND default_decimal_separator is not a string.
*/
define str_comma(x, group, decimal)
{
local group_separator; /* 3-digit group separator */
local decimal_separator; /* separator between decimal integer and decimal fraction */
local sign_str; /* leading - if x < 0 or empty if x >= 0 */
local integer; /* integer part of absolute value of x */
local int_str; /* integer as a string */
local int_len; /* number of digits in int_str */
local first_group_len; /* length of 1st group before the 1st 3-digit group separator */
local fraction; /* factional part of absolute value of x */
local frac_str; /* fraction as a string */
local frac_len; /* number of digits in frac_str including leading 0. */
local ret; /* string to return */
local config_leadzero; /* config("leadzero") to restore */
local config_tilde; /* config("tilde") to restore */
local i;
/*
* parse args - return null if args are bogus
*
* Return null() if args or conditions are bogus.
*/
if (!isreal(x)) {
return null();
}
group_separator = isnull(group) ? default_group_separator : group;
decimal_separator = isnull(decimal) ? default_decimal_separator : decimal;
if (!isstr(group_separator)) {
return null();
}
if (!isstr(decimal_separator)) {
return null();
}
/*
* split number
*/
if (x < 0) {
sign_str = "-";
integer = int(-x);
fraction = frac(-x);
} else {
sign_str = "";
integer = int(x);
fraction = frac(x);
}
ret = sign_str;
/*
* convert digits
*
* Avoid printing ~ and leading zeros for factional part.
*/
int_str = strprintf("%d", integer);
config_leadzero = config("leadzero", 0);
config_tilde = config("tilde", 0);
frac_str = strprintf("%d", fraction);
config("leadzero", config_leadzero),;
config("tilde", config_tilde),;
/*
* determine number of digits in the integer part
*/
int_len = strlen(int_str);
frac_len = strlen(frac_str);
/*
* form integer part with group separators as needed
*/
/*
* case: integer is 3 or fewer digits
*/
if (integer < 1000) {
ret += int_str;
/*
* case: integer is 4 or more digits
*/
} else {
/*
* form a decimal string using group separators
*/
/*
* form the initial leading digits before 1st group separator
*/
first_group_len = int_len % 3;
if (first_group_len == 0) {
first_group_len = 3;
}
ret += substr(int_str, 1, first_group_len);
/*
* until end of digits, print group separator followed by 3 more digits
*/
for (i = first_group_len+1; i < int_len; i += 3) {
ret += group_separator + substr(int_str, i, 3);
}
}
/*
* form fractional part using decimal separator as needed
*/
/*
* case: x is an integer
*/
if (fraction == 0) {
/* no fraction, nothing more to do */
/*
* case: x is not an integer
*/
} else {
/*
* add integer-fraction separator
*/
ret += decimal_separator;
/*
* add remaining digits
*
* Skip over the leading 0. in frac_str
*/
ret += substr(frac_str, 2, frac_len-1);
}
/*
* All Done!!! -- Jessica Noll, Age 2
*/
return ret;
}
/*
* set_default_group_separator - change the default 3-digit group separator
*
* If group is not a string, then the default 3-digit group separator
* is not changed. Thus, this will only return the default 3-digit group separator:
*
* set_default_group_separator(null());
*
* given:
*
* group 3-digit group separator
*
* returns:
*
* previous 3-digit group separator value
*/
define set_default_group_separator(group)
{
local old_default_group_separator; /* previous default 3-digit group separator to return */
/*
* save current 3-digit group separator
*/
old_default_group_separator = default_group_separator;
/*
* change 3-digit group separator if group is a string
*/
if (isstr(group)) {
default_group_separator = group;
}
return old_default_group_separator;
}
/*
* set_default_decimal_separator - change the default integer-fraction separator
*
* If decimal is not a string, then the default integer-fraction separator
* is not changed. Thus, this will only return the integer-fraction separator:
*
* set_default_decimal_separator(null());
*
* given:
*
* decimal separator between decimal integer and decimal fraction (def: ".")
*
* returns:
*
* previous integer-fraction separator value
*/
define set_default_decimal_separator(decimal)
{
local old_default_decimal_separator; /* previous default integer-fraction separator */
/*
* save current integer-fraction separator
*/
old_default_decimal_separator = default_decimal_separator;
/*
* change 3-digit decimal integer-fraction if decimal is a string
*/
if (isstr(decimal)) {
default_decimal_separator = decimal;
}
return old_default_decimal_separator;
}
/*
* print_comma - print base 10 string with 3-digit group separators & integer-fraction separator + newline
*
* This function prints the result of str_comma(x, group, decimal) followed by a newline.
* For example:
*
* print_comma(x);
* print_comma(x), " ", ".");
* print_comma(x), ".", ",");
*
* If str_comma() does not return a string, this function prints nothing.
*
* NOTE: To print without a newline, use fprint_comma(fd, x, group, decimal).
*
* given:
* x number to convert
*
* optional args:
*
* group use this 3-digit group separator
* decimal use this integer-fraction separator
*
* returns:
*
* string containing the base 10 digits with group and decimal separators, OR
* null() if x is not a number, OR
* null() if group is neither null() (not given) nor a string, OR
* null() if group is null() (not given) AND default_group_separator is not a string, OR
* null() if decimal is neither null() (not given) nor a string, OR
* null() if decimal is null() (not given) AND default_decimal_separator is not a string.
*/
define print_comma(x, group, decimal)
{
local ret; /* base 10 string with 3-digit group and integer-fraction separators */
/*
* convert to string
*/
ret = str_comma(x, group, decimal);
/*
* print converted string
*/
if (isstr(ret)) {
printf("%s\n", ret);
}
return ret;
}
/*
* fprint_comma - print base 10 string with 3-digit group separators & integer-fraction separator w/o newline
*
* This function prints the result of str_comma(x, group, decimal) on an open file, without a trailing newline.
* For example:
*
* fprint_comma(files(1), x);
* fprint_comma(fd, x), " ", ".");
* fprint_comma(files(2), x), ".", ",");
*
* If str_comma() does not return a string, this function prints nothing.
*
* This function flushes output to the open file before returning.
*
* NOTE: To print with a newline, use print_comma(x, group, decimal).
*
* given:
* fd open file
* x number to convert
*
* optional args:
*
* group use this 3-digit group separator
* decimal use this integer-fraction separator
*
* returns:
*
* string containing the base 10 digits with group and integer-fraction separators, OR
* null() if x is not a number, OR
* null() if group is neither null() (not given) nor a string, OR
* null() if group is null() (not given) AND default_group_separator is not a string, OR
* null() if decimal is neither null() (not given) nor a string, OR
* null() if decimal is null() (not given) AND default_decimal_separator is not a string.
*/
define fprint_comma(fd, x, group, decimal)
{
local ret; /* base 10 string with 3-digit group and integer-fraction separators */
/*
* convert to string
*/
ret = str_comma(x, group, decimal);
/*
* print converted string
*/
if (isstr(ret) && isfile(fd)) {
fprintf(fd, "%s", ret);
fflush(fd);
}
return ret;
}

View File

@@ -188,7 +188,7 @@ define dms_abs(a)
/* firewall - just absolute value non dms objects */
if (! istype(a, ans)) {
return abs(a);
return abs(a);
}
/* compute degrees */
@@ -352,24 +352,8 @@ define fixdms(a)
quit "attempt to fix a non dms object";
}
/* force minutes to be integral */
a.min += frac(a.deg) * 60;
a.deg = int(a.deg);
/* force degrees to be integral */
a.sec += frac(a.min) * 60;
a.min = int(a.min);
/* carry excess seconds into minutes */
a.min += a.sec // 60;
a.sec %= 60;
/* carry excess minutes into degrees */
a.deg += a.min // 60;
a.min %= 60;
/* round degrees :-) */
a.deg %= 360;
/* use builtin d2dms function */
d2dms(a.deg + a.min/60 + a.sec/3600, a.deg, a.min, a.sec),;
/* return normalized result */
return a;

View File

@@ -157,7 +157,7 @@ define dotest(dotest_file, dotest_code = 0, dotest_maxcond = -1)
* test the close of the line file
*/
printf("%d-: detected %d error condition(s), many of which may be OK\n",
dotest_code, dotest_old_errcount-dotest_errcnt);
dotest_code, dotest_old_errcount-dotest_errcnt);
printf("%d-: closing line file: %d\n", dotest_code, dotest_file);
fclose(dotest_f_file);

View File

@@ -56,7 +56,7 @@ define __CZ__factor_factorial(n,start){
if(start){
if(!isint(start) && start < 0 && start > n)
return newerror("__CZ__factor_factorial(n,start): value of "
"parameter 'start' out of range");
"parameter 'start' out of range");
if(start == n && isprime(n)){
prime_list = mat[1 , 2];
prime_list[0,0] = n;
@@ -64,7 +64,7 @@ define __CZ__factor_factorial(n,start){
}
else if(!isprime(start) && nextprime(start) >n)
return newerror("__CZ__factor_factorial(n,start): value of parameter "
"'start' out of range");
"'start' out of range");
else{
if(!isprime(start)) prime = nextprime(start);
else prime = start;
@@ -225,11 +225,11 @@ define __CZ__multiply_factored_factorial(matrix,stop){
if(!ismat(matrix))
return newerror("__CZ__multiply_factored_factorial(matrix): "
"argument matrix not a matrix ");
"argument matrix not a matrix ");
if(!matrix[0,0])
return
newerror("__CZ__multiply_factored_factorial(matrix): "
"matrix[0,0] is null/0");
"matrix[0,0] is null/0");
if(!isnull(stop))
pix = stop;
@@ -376,7 +376,7 @@ define bigcatalan(n){
/*
df(-111) = -1/3472059605858239446587523014902616804783337112829102414124928
7753332469144201839599609375
7753332469144201839599609375
df(-3+1i) = 0.12532538977287649201-0.0502372106177184607i
df(2n + 1) = (2*n)!/(n!*2^n)
@@ -427,7 +427,7 @@ define doublefactorial(n){
*/
eps=epsilon(epsilon()*1e-2);
ret = 2^(n/2-1/4 * cos(pi()* n)+1/4) * pi()^(1/4 *
cos(pi()* n)-1/4)* gamma(n/2+1);
cos(pi()* n)-1/4)* gamma(n/2+1);
epsilon(eps);
return ret;
}

View File

@@ -188,7 +188,7 @@ define hms_abs(a)
/* firewall - just absolute value non hms objects */
if (! istype(a, ans)) {
return abs(a);
return abs(a);
}
/* compute hours */
@@ -352,24 +352,8 @@ define fixhms(a)
quit "attempt to fix a non hms object";
}
/* force minutes to be integral */
a.min += frac(a.hour) * 60;
a.hour = int(a.hour);
/* force hours to be integral */
a.sec += frac(a.min) * 60;
a.min = int(a.min);
/* carry excess seconds into minutes */
a.min += a.sec // 60;
a.sec %= 60;
/* carry excess minutes into hours */
a.hour += a.min // 60;
a.min %= 60;
/* round hours by day */
a.hour %= 24;
/* use builtin h2hms function */
h2hms(a.hour + a.min/60 + a.sec/3600, a.hour, a.min, a.sec),;
/* return normalized result */
return a;

View File

@@ -156,7 +156,7 @@ define be2file(v, filename)
*/
octlen = int((highbit(v)+8) / 8);
for (i=octlen-1; i >= 0; --i) {
fputc(fd, char(v >> (i*8)));
fputc(fd, char(v >> (i*8)));
}
/*

View File

@@ -731,7 +731,7 @@ rodseth_xhn(x, h, n)
return 0;
}
/*
/*
* Check for jacobi(x-2, h*2^n-1) == 1 (Ref4, condition 1) part 1
*/
testval = h*2^n-1;
@@ -739,7 +739,7 @@ rodseth_xhn(x, h, n)
return 0;
}
/*
/*
* Check for jacobi(x+2, h*2^n-1) == -1 (Ref4, condition 1) part 2
*/
if (jacobi(x+2, testval) != -1) {

641
cal/palindrome.cal Normal file
View File

@@ -0,0 +1,641 @@
/*
* palindrome - palindrome utilities
*
* Copyright (C) 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
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Under source code control: 2021/11/06 14:35:37
* File existed as early as: 2021
*
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* digitof - return the a digit of a value
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* val value to find a digit of
* place digit place
*
* returns:
* value (>= 0 and < 10) that is the place-th digit of val
* or 0 if place is not a digit of val
*/
define digitof(val, place)
{
local d; /* length of val in digits */
/* determine length */
d = digits(val);
/* firewall - return 0 if digit place doesn't exist */
if (place < 1 || place > d) {
return 0;
}
/* return the place-th digit of val as a single digit */
return (val // (10^(place-1))) % 10;
}
/*
* copalplace - determine the other place in a palindrome
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* d digits of a value
* place digit place
*
* returns:
* given palindrome val, the other digit paired with place
* or 0 if place is not a digit of val
*/
define copalplace(d, place)
{
/* firewall - return 0 if digit place doesn't exist */
if (d < 1 || place < 1 || place > d) {
return 0;
}
/* return digit coplace */
return d+1 - place;
}
/*
* upperhalf - return the upper half of a palindrome
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* NOTE: When the value has an odd number of digits, the upper half
* includes the middle digit.
*
* given:
* val a value
*
* returns:
* the upper half digits of a value
*/
define upperhalf(val)
{
local d; /* length of val in digits */
local halfd; /* length of upper hand of val */
/* determine length */
d = digits(val);
halfd = d // 2;
/* return upper half */
return (val // 10^halfd);
}
/*
* mkpal - make a value into a palindrome
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* val a value
*
* returns:
* val as a palindrome with lower half being reverse digits of val
*/
define mkpal(val)
{
local d; /* length of val in digits */
local i; /* counter */
local ret; /* palindrome being formed */
/* determine length */
d = digits(val);
/* insert digits in reverse order at the bottom */
ret = val;
for (i=0; i < d; ++i) {
ret = ret*10 + digit(val, i);
}
return ret;
}
/*
* mkpalmiddigit - make a value into a palindrome with a middle digit
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* val a value
* digit the digit to put into the middle of the palindrome
*
* returns:
* val as a palindrome with lower half being reverse digits of val
* and digit as a middle digit
*/
define mkpalmiddigit(val, digit)
{
local d; /* length of val in digits */
local i; /* counter */
local ret; /* palindrome being formed */
/* determine length */
d = digits(val);
/* insert digits in reverse order at the bottom */
ret = val*10 + digit;
for (i=0; i < d; ++i) {
ret = ret*10 + digit(val, i);
}
return ret;
}
/*
* ispal - determine if a value is a palindrome
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* val a value
*
* returns:
* 1 ==> val is a palindrome
* 0 ==> val is NOT a palindrome
*/
define ispal(val)
{
local half; /* upper half of digits of val */
local digit; /* middle digit */
/* case: val has an even number of digits */
if (iseven(digits(val))) {
/* test palindrome-ness */
return (val == mkpal(upperhalf(val)));
/* case: val can an odd number of digits */
} else {
/* test palindrome-ness */
half = upperhalf(val);
digit = half % 10;
half //= 10;
return (val == mkpalmiddigit(half, digit));
}
}
/*
* palnextpal - return next palindrome from a known palindrome
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* pal a palindrome
*
* returns:
* next palindrome > pal
*/
define palnextpal(pal)
{
local paldigits; /* digits in pal */
local half; /* upper half of newval */
local newhalf; /* half+1 */
local newpal; /* new palindrome */
/* case: negative palindrome */
if (pal < 0) {
return -(palprevpal(-pal));
}
/*
* start with upper half
*/
half = upperhalf(pal);
/*
* prep to find a larger palindrome
*/
newhalf = half+1;
/*
* form palindrome from new upper half
*
* We need to watch for the corner case where changing the
* half changes the number of digits as this will impact
* or even/odd number of digits processing.
*/
paldigits = digits(pal);
if (digits(newhalf) == digits(half)) {
/* no change in half digits: process as normal */
if (iseven(paldigits)) {
newpal = mkpal(newhalf);
} else {
newpal = mkpalmiddigit(newhalf // 10, newhalf % 10);
}
} else {
/* change in half digits: process as opposite */
if (iseven(paldigits)) {
newpal = mkpalmiddigit(newhalf // 10, newhalf % 10);
} else {
newpal = mkpal(newhalf);
}
}
/*
* return the new palindrome
*/
return newpal;
}
/*
* nextpal - return next palindrome from a value
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* val a value
*
* returns:
* next palindrome > val
*/
define nextpal(val)
{
local newval; /* val+1 */
local newvaldigits; /* digits in newval */
local half; /* upper half of newval */
local pal; /* palindrome test value */
local newpal; /* new palindrome */
/* case: negative value */
if (val < 0) {
return -(prevpal(-val));
}
/*
* start looking from a larger value
*/
newval = val+1;
newvaldigits = digits(newval);
/* case: single digit palindrome */
if (newvaldigits < 2) {
return newval;
}
/*
* start with next upper half
*/
half = upperhalf(newval);
/*
* form palindrome from upper half
*
* We need to deal with even vs. odd digit counts
* when forming a palindrome from a half as the
* half may not or may include the middle digit.
*/
if (iseven(newvaldigits)) {
pal = mkpal(half);
} else {
pal = mkpalmiddigit(half // 10, half % 10);
}
/*
* case: we found a larger palindrome, we are done
*/
if (pal > val) {
return pal;
}
/*
* we need to find an even larger palindrome
*/
newpal = palnextpal(pal);
/*
* return the new palindrome
*/
return newpal;
}
/*
* palprevpal - return previous palindrome from a palindrome
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* pal a palindrome
*
* returns:
* previous palindrome < pal
*/
define palprevpal(pal)
{
local paldigits; /* digits in pal */
local half; /* upper half of newval */
local newhalf; /* half+1 */
local newpal; /* new palindrome */
/* case: negative value */
if (pal < 0) {
return -(palnextpal(-pal));
}
/* case: single digit palindrome */
if (pal < 10) {
newpal = pal-1;
return newpal;
}
/* case: 10 or 11 */
if (pal < 12) {
newpal = 9;
return newpal;
}
/*
* start with upper half
*/
half = upperhalf(pal);
/*
* prep to find a smaller palindrome
*/
newhalf = half-1;
/*
* form palindrome from new upper half
*
* We need to watch for the corner case where changing the
* half changes the number of digits as this will impact
* or even/odd number of digits processing.
*/
paldigits = digits(pal);
if (digits(newhalf) == digits(half)) {
/* no change in half digits: process as normal */
if (iseven(paldigits)) {
newpal = mkpal(newhalf);
} else {
newpal = mkpalmiddigit(newhalf // 10, newhalf % 10);
}
} else {
/* change in half digits: process as opposite */
if (iseven(paldigits)) {
newpal = mkpalmiddigit(newhalf // 10, newhalf % 10);
} else {
newpal = mkpal(newhalf);
}
}
/*
* return the new palindrome
*/
return newpal;
}
/*
* prevpal - return previous palindrome from a value
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* val a value
*
* returns:
* previous palindrome < val
*/
define prevpal(val)
{
local newval; /* val-1 */
local newvaldigits; /* digits in newval */
local half; /* upper half of newval */
local pal; /* palindrome test value */
local newpal; /* new palindrome */
/* case: negative value */
if (val < 0) {
return -(nextpal(-val));
}
/*
* start looking from a smaller value
*/
newval = val-1;
newvaldigits = digits(newval);
/* case: single digit palindrome */
if (newvaldigits < 2) {
return newval;
}
/*
* start with previous upper half
*/
half = upperhalf(newval);
/*
* form palindrome from upper half
*
* We need to deal with even vs. odd digit counts
* when forming a palindrome from a half as the
* half may not or may include the middle digit.
*/
if (iseven(newvaldigits)) {
pal = mkpal(half);
} else {
pal = mkpalmiddigit(half // 10, half % 10);
}
/*
* case: we found a smaller palindrome, we are done
*/
if (pal < val) {
return pal;
}
/*
* we need to find an even smaller palindrome
*/
newpal = palprevpal(pal);
/*
* return the new palindrome
*/
return newpal;
}
/*
* nextprimepal - return next palindrome that is a (highly probable) prime
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* val a value
*
* returns:
* next palindrome (highly probable) prime > val
*/
define nextprimepal(val)
{
local pal; /* palindrome test value */
local dpal; /* digits in pal */
/*
* pre-start under the next palindrome
*/
pal = nextpal(val-1);
/*
* loop until we find a (highly probable) prime or 0
*/
do {
/* case: negative values and tiny values */
if (pal < 2) {
return 2;
}
/*
* compute the next palindrome
*/
pal = palnextpal(pal);
dpal = digits(pal);
/* case: 11 is the only prime palindrome with even digit count */
if (pal == 11) {
return 11;
}
/* case: even number of digits and not 11 */
if (iseven(dpal)) {
/*
* Except for 11 (which is handled above already), there are
* no prime palindrome with even digits. So we need to
* increase the digit count and work with that larger palindrome.
*/
pal = nextpal(10^dpal);
}
/* case: palindrome is even or ends in 5 */
if (iseven(pal % 10) || (pal%10 == 10/2)) {
/*
* we need to increase the bottom and top digits
* so that we have a chance to be prime
*/
pal += (1 + 10^(dpal-1));
}
if (config("resource_debug") & 0x8) {
print "DEBUG: nextprimepal:", pal;
}
} while (ptest(pal) == 0 && pal > 0);
/* return palindrome that his (highly probable) prime or 0 */
return pal;
}
/*
* prevprimepal - return prev palindrome that is a (highly probable) prime
*
* NOTE: We assume base 10 digits and place 1 is the units digit.
*
* given:
* val a value
*
* returns:
* prev palindrome (highly probable) prime < val or 0
*/
define prevprimepal(val)
{
local pal; /* palindrome test value */
local dpal; /* digits in pal */
/*
* pre-start over the previous palindrome
*/
pal = prevpal(val+1);
/*
* loop until we find a (highly probable) prime or 0
*/
do {
/*
* case: single digit values are always palindromes
*/
if (val < 10) {
/*
* The prevcand() call will return 0 if there is no previous prime
* such as the case when val < 2.
*/
return prevcand(pal);
}
/*
* compute the previous palindrome
*/
pal = palprevpal(pal);
dpal = digits(pal);
/* case: 11 is the only prime palindrome with even digit count */
if (pal == 11) {
return 11;
}
/* case: 2 digit palindrome and not 11 */
if (dpal == 2) {
return 7;
}
/* case: even number of digits */
if (iseven(dpal)) {
/*
* Except for 11 (which is handled above already), there are
* no prime palindrome with even digits. So we need to
* decrease the digit count and work with that smaller palindrome.
*/
pal = prevpal(10^(dpal-1));
}
/* case: palindrome is even or ends in 5 */
if (iseven(pal % 10) || (pal%10 == 10/2)) {
/*
* we need to decrease the bottom and top digits
* so that we have a chance to be prime
*/
pal -= (1 + 10^(dpal-1));
}
if (config("resource_debug") & 0x8) {
print "DEBUG: prevprimepal:", pal;
}
} while (ptest(pal) == 0 && pal > 0);
/* return palindrome that his (highly probable) prime or 0 */
return pal;
}

View File

@@ -1,7 +1,7 @@
/*
* pi - various routines to calculate pi
*
* Copyright (C) 1999-2004 David I. Bell
* Copyright (C) 1999-2004,2021 David I. Bell
*
* 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
@@ -74,7 +74,7 @@ define qpi(epsilon)
/*
* Print digits of PI forever, neatly formatted, using calc.
*
* Written by Klaus Alexander Seistrup <klaus@seistrup.dk>
* Written by Klaus Alexander Seistrup <klaus at seistrup dot dk>
* on a dull Friday evening in November 1999.
*
* Inspired by an algorithm conceived by Lambert Meertens.

View File

@@ -1,9 +1,9 @@
/*
* qtime - Display time as English sentence
*
* Copyright (C) 1999 Klaus Alexander Seistrup and Landon Curt Noll
* Copyright (C) 1999,2021 Klaus Alexander Seistrup and Landon Curt Noll
*
* Written by: Klaus Alexander Seistrup <kseis@magnetic-ink.dk>
* Written by: Klaus Alexander Seistrup <kseis at magnetic-ink dot dk>
* With mods by: Landon Curt Noll <http://www.isthe.com/chongo/>
*
* Calc is open software; you can redistribute it and/or modify it under

View File

@@ -305,6 +305,8 @@ print '008: parsed test_variables()';
*/
define test_arithmetic()
{
local x;
print '400: Beginning test_arithmetic';
vrfy(3+4==7, '401: 3 + 4 == 7');
@@ -366,8 +368,18 @@ define test_arithmetic()
vrfy((2^23209-1)^(2-2) == 1, '457: (2^23209-1)^(2-2) == 1');
vrfy((2^23209-1)^((2^23209-1)-(2^23209-1)) == 1,
'458: (2^23209-1)^((2^23209-1)-(2^23209-1)) == 1');
vrfy(0^2 == 0, '459: 0^2 == 0');
vrfy(0^3 == 0, '460: 0^3 == 0');
vrfy(0^12 == 0, '461: 0^12 == 0');
vrfy(0^13 == 0, '462: 0^13 == 0');
x = 0;
vrfy(x == 0, '463: x == 0');
vrfy(0^2 == 0, '464: 0^2 == 0');
vrfy(0^3 == 0, '465: 0^3 == 0');
vrfy(0^12 == 0, '466: 0^12 == 0');
vrfy(x^13 == 0, '467: x^13 == 0');
print '459: Ending test_arithmetic';
print '462: Ending test_arithmetic';
}
print '009: parsed test_arithmetic()';
@@ -775,7 +787,9 @@ print '016: parsed test_bignums()';
/*
* Test many of the built-in functions.
*
* See test_functionss() starting at test 9000 for more built-in function tests.
* See test_functions() (test 700 - 1238) for other built-in function tests.
* See test_functions2() (test 9000 - 9063) for other built-in function tests.
* See test_functions3() (test 9100 - 9214) for other built-in function tests.
*/
define test_functions()
{
@@ -1718,7 +1732,7 @@ define test_rand()
print '1503: state0 = srand(0)';
vrfy(state0 == init, '1504: state0 == init');
/* test the additive 55 shuffle generator */
/* test the subtractive 100 shuffle generator */
tmp = srand(0);
print '1505: tmp = srand(0)';
vrfy(rand() == 0x1fe5b46fba7e069d, \
@@ -3404,74 +3418,6 @@ define test_trig()
tnum = test3400(1, 3401);
vrfy(tnum == 3407, '3407: tnum == 3407');
/* d2r & r2d */
vrfy(d2r(180) == pi(),
'3408: d2r(180) == pi()');
vrfy(d2r(180, 1e-100) == pi(1e-100),
'3409: d2r(180, 1e-100) == pi(1e-100)');
vrfy(r2d(pi()/2) == 90,
'3410: r2d(pi()/2) == 90');
vrfy(r2d(pi(1e-15)/2) == 14137166941154068500000/157079632679489661923,
'3411: r2d(pi(1e-15)/2) == ' +
'14137166941154068500000/157079632679489661923');
vrfy(r2d(d2r(40)) == 40,
'3412: r2d(d2r(40)) == 40');
vrfy(r2d(d2r(40,1e-90),1e-90) == 40,
'3413: r2d(d2r(40,1e-90),1e-90) == 40');
vrfy(d2r(180i) == 1i*pi(),
'3414: d2r(1808) == 1i*pi()');
vrfy(d2r(180i+90) == 1i*pi() + pi()/2,
'3415: d2r(180i+90) == 1i*pi() + pi()/2');
vrfy(r2d(d2r(40+40i)) == 40+40i,
'3416: r2d(d2r(40+40i)) == 40+40i');
vrfy(r2d(d2r(40+40i,1e-60),1e-60) == 40+40i,
'3417: r2d(d2r(40+40i,1e-60),1e-60) == 40+40i');
/* g2r & r2g */
vrfy(g2r(200) == pi(),
'3418: g2r(200) == pi()');
vrfy(g2r(200, 1e-100) == pi(1e-100),
'3419: g2r(180, 1e-100) == pi(1e-100)');
vrfy(r2g(pi()/2) == 100,
'3420: r2g(pi()/2) == 100');
vrfy(r2g(pi(1e-15)/2) == 15707963267948965000000/157079632679489661923,
'3421: r2g(pi(1e-15)/2) == ' +
'15707963267948965000000/157079632679489661923');
vrfy(r2g(g2r(40)) == 40,
'3422: r2g(g2r(40)) == 40');
vrfy(r2g(g2r(40,1e-90),1e-90) == 40,
'3423: r2g(g2r(40,1e-90),1e-90) == 40');
vrfy(g2r(200i) == 1i*pi(),
'3424: g2r(200i) == 1i*pi()');
vrfy(g2r(200i+150) == pi()*0.75 + 1i*pi(),
'3425: g2r(200i+150) == pi()*0.75 + 1i*pi()');
vrfy(r2g(g2r(40+40i)) == 40+40i,
'3426: r2g(g2r(40+40i)) == 40+40i');
vrfy(r2g(g2r(40+40i,1e-60),1e-60) == 40+40i,
'3427: r2g(g2r(40+40i,1e-60),1e-60) == 40+40i');
/* g2d & d2g */
vrfy(g2d(200) == 180,
'3428: g2d(200) == 180');
vrfy(g2d(200, 1e-100) == 180,
'3429: g2d(180, 1e-100) == 180');
vrfy(d2g(81) == 90,
'3430: d2g(81) == 90');
vrfy(d2g(pi(1e-15)/2) == 3141592653589793/1800000000000000,
'3431: d2g(pi(1e-15)/2) == 3141592653589793/1800000000000000');
vrfy(d2g(g2d(40)) == 40,
'3432: d2g(g2d(40)) == 40');
vrfy(d2g(g2d(40,1e-90),1e-90) == 40,
'3433: d2g(g2d(40,1e-90),1e-90) == 40');
vrfy(g2d(200i) == 180i,
'3434: g2d(200i) == 180i');
vrfy(g2d(200i+47) == 42.3 + 180i,
'3435: g2d(200i+47) == 42.3 + 180i');
vrfy(d2g(g2d(40+40i)) == 40+40i,
'3436: d2g(g2d(40+40i)) == 40+40i');
vrfy(d2g(g2d(40+40i,1e-90),1e-90) == 40+40i,
'3437: d2g(g2d(40+40i,1e-90),1e-90) == 40+40i');
print '3438: Ending test_trig';
}
print '051: parsed test_trig()';
@@ -4816,7 +4762,7 @@ define test_random()
print '5303: state0 = srandom(0)';
vrfy(state0 == init, '5304: state0 == init');
/* test the additive 55 shuffle generator */
/* test the subtractive 100 shuffle generator */
tmp = srandom(0);
print '5305: tmp = srandom(0)';
vrfy(random() == 0x7fb838a8a0a95046, \
@@ -7167,9 +7113,10 @@ define test_sha1()
vrfy(sha1("x", "y", "z") == sha1("xyz"),
'7208: sha1("x", "y", "z") == sha1("xyz")');
vrfy(sha1(sha1("this is",7^19-8,"a composit",3i+4.5,"hash")) ==
0xc3e1b562bf45b3bcfc055ac65b5b39cdeb6a6c55,
'7209: sha1(sha1("this is",7^19-8,"a composit",3i+4.5,"hash")) == ...');
vrfy(sha1(sha1("this is",7^19-8,"a composite",3i+4.5,"hash")) ==
0x68aa4fe0a9b6d1662f8d2dbdeee8879239185d09,
'7209: sha1(sha1("this is",7^19-8,"a composite",3i+4.5,"hash")) ' +
'== ...');
z = sha1(list(1,2,3), "curds and whey", 2^21701-1, pi(1e-100));
@@ -8235,6 +8182,8 @@ ecnt = 211;
* Test more of the built-in functions.
*
* See test_functions() (test 700 - 1238) for other built-in function tests.
* See test_functions2() (test 9000 - 9063) for other built-in function tests.
* See test_functions3() (test 9100 - 9214) for other built-in function tests.
*/
define test_functions2()
{
@@ -8348,6 +8297,401 @@ print;
return test_functions2();
/*
* Test even more of the built-in functions.
*
* See test_functions() (test 700 - 1238) for other built-in function tests.
* See test_functions2() (test 9000 - 9063) for other built-in function tests.
* See test_functions3() (test 9100 - 9214) for other built-in function tests.
*/
define test_functions3()
{
local d, m, s, g, h;
print '9101: Beginning test_functions3';
/* d2r & r2d */
vrfy(d2r(180) == pi(),
'9102: d2r(180) == pi()');
vrfy(d2r(180, 1e-100) == pi(1e-100),
'9103: d2r(180, 1e-100) == pi(1e-100)');
vrfy(r2d(pi()/2) == 90,
'9104: r2d(pi()/2) == 90');
vrfy(r2d(pi(1e-15)/2) == 14137166941154068500000/157079632679489661923,
'9105: r2d(pi(1e-15)/2) == ' +
'14137166941154068500000/157079632679489661923');
vrfy(r2d(d2r(40)) == 40,
'9106: r2d(d2r(40)) == 40');
vrfy(r2d(d2r(40,1e-90),1e-90) == 40,
'9107: r2d(d2r(40,1e-90),1e-90) == 40');
vrfy(d2r(180i) == 1i*pi(),
'9108: d2r(1808) == 1i*pi()');
vrfy(d2r(180i+90) == 1i*pi() + pi()/2,
'9109: d2r(180i+90) == 1i*pi() + pi()/2');
vrfy(r2d(d2r(40+40i)) == 40+40i,
'9110: r2d(d2r(40+40i)) == 40+40i');
vrfy(r2d(d2r(40+40i,1e-60),1e-60) == 40+40i,
'9111: r2d(d2r(40+40i,1e-60),1e-60) == 40+40i');
/* g2r & r2g */
vrfy(g2r(200) == pi(),
'9112: g2r(200) == pi()');
vrfy(g2r(200, 1e-100) == pi(1e-100),
'9113: g2r(180, 1e-100) == pi(1e-100)');
vrfy(r2g(pi()/2) == 100,
'9114: r2g(pi()/2) == 100');
vrfy(r2g(pi(1e-15)/2) == 15707963267948965000000/157079632679489661923,
'9115: r2g(pi(1e-15)/2) == ' +
'15707963267948965000000/157079632679489661923');
vrfy(r2g(g2r(40)) == 40,
'9116: r2g(g2r(40)) == 40');
vrfy(r2g(g2r(40,1e-90),1e-90) == 40,
'9117: r2g(g2r(40,1e-90),1e-90) == 40');
vrfy(g2r(200i) == 1i*pi(),
'9118: g2r(200i) == 1i*pi()');
vrfy(g2r(200i+150) == pi()*0.75 + 1i*pi(),
'9119: g2r(200i+150) == pi()*0.75 + 1i*pi()');
vrfy(r2g(g2r(40+40i)) == 40+40i,
'9120: r2g(g2r(40+40i)) == 40+40i');
vrfy(r2g(g2r(40+40i,1e-60),1e-60) == 40+40i,
'9121: r2g(g2r(40+40i,1e-60),1e-60) == 40+40i');
/* g2d & d2g */
vrfy(g2d(200) == 180,
'9122: g2d(200) == 180');
vrfy(g2d(200, 1e-100) == 180,
'9123: g2d(180, 1e-100) == 180');
vrfy(d2g(81) == 90,
'9124: d2g(81) == 90');
vrfy(d2g(pi(1e-15)/2) == 3141592653589793/1800000000000000,
'9125: d2g(pi(1e-15)/2) == 3141592653589793/1800000000000000');
vrfy(d2g(g2d(40)) == 40,
'9126: d2g(g2d(40)) == 40');
vrfy(d2g(g2d(40,1e-90),1e-90) == 40,
'9127: d2g(g2d(40,1e-90),1e-90) == 40');
vrfy(g2d(200i) == 180i,
'9128: g2d(200i) == 180i');
vrfy(g2d(200i+47) == 42.3 + 180i,
'9129: g2d(200i+47) == 42.3 + 180i');
vrfy(d2g(g2d(40+40i)) == 40+40i,
'9130: d2g(g2d(40+40i)) == 40+40i');
vrfy(d2g(g2d(40+40i,1e-90),1e-90) == 40+40i,
'9131: d2g(g2d(40+40i,1e-90),1e-90) == 40+40i');
/* d2dms */
vrfy(d2dms(12.3456,d,m,s) == 12.3456,
'9132: d2dms(12.3456,d,m,s) == 12.3456');
vrfy(d == 12,
'9133: d == 12');
vrfy(m == 20,
'9133: m == 20');
vrfy(s == 44.16,
'9134: s == 44.16');
vrfy(d2dms(1234.5678,d,m,s) == 154.5678,
'9135: d2dms(1234.5678,d,m,s) == 154.5678');
vrfy(d == 154,
'9136: d == 154');
vrfy(m == 34,
'9137: m == 34');
vrfy(s == 4.08,
'9138: s == 4.08');
vrfy(d2dms(-1234.5678,d,m,s) == 205.4322,
'9139: d2dms(-1234.5678,d,m,s) == 205.4322');
vrfy(d == 205,
'9140: d == 205');
vrfy(m == 25,
'9141: m == 25');
vrfy(s == 55.92,
'9142: s == 55.92');
vrfy(d2dms(360.321,d,m,s,1) == -359.679,
'9143: d2dms(360.321,d,m,s,1) == -359.679');
vrfy(d == -359,
'9144: d == -359');
vrfy(m == -40,
'9145: m == -40');
vrfy(s == -44.4,
'9146: s == -44.4');
/* d2dm */
vrfy(d2dm(12.3456,d,m) == 12.3456,
'9147: d2dm(12.3456,d,m) == 12.3456');
vrfy(d == 12,
'9148: d == 12');
vrfy(m == 20.736,
'9149: m == 20.736');
vrfy(d2dm(1234.5678,d,m) == 154.5678,
'9150: d2dm(1234.5678,d,m) == 154.5678');
vrfy(d == 154,
'9151: d == 154');
vrfy(m == 34.068,
'9152: m == 34.068');
vrfy(d2dm(-1234.5678,d,m) == 205.4322,
'9153: d2dm(-1234.5678,d,m) == 205.4322');
vrfy(d == 205,
'9154: d == 205');
vrfy(m == 25.932,
'9155: m == 25.932');
vrfy(d2dm(360.321,d,m,1) == -359.679,
'9156: d2dm(360.321,d,m,1) == -359.679');
vrfy(d == -359,
'9167: d == -359');
vrfy(m == -40.74,
'9158: m == -40.74');
/* g2gms */
vrfy(g2gms(12.3456,g,m,s) == 12.3456,
'9159: g2gms(12.3456,g,m,s) == 12.3456');
vrfy(g == 12,
'9133: g == 12');
vrfy(m == 20,
'9160: m == 20');
vrfy(s == 44.16,
'9161: s == 44.16');
vrfy(g2gms(1234.5678,g,m,s) == 34.5678,
'9162: g2gms(1234.5678,g,m,s) == 34.5678');
vrfy(g == 34,
'9163: g == 34');
vrfy(m == 34,
'9164: m == 34');
vrfy(s == 4.08,
'9165: s == 4.08');
vrfy(g2gms(-1234.5678,g,m,s) == 365.4322,
'9166: g2gms(-1234.5678,g,m,s) == 365.4322');
vrfy(g == 365,
'9167: g == 365');
vrfy(m == 25,
'9168: m == 25');
vrfy(s == 55.92,
'9169: s == 55.92');
vrfy(g2gms(400.321,g,m,s,1) == -399.679,
'9170: g2gms(400.321,g,m,s,1) == -399.679');
vrfy(g == -399,
'9171: g == -399');
vrfy(m == -40,
'9172: m == -40');
vrfy(s == -44.4,
'9173: s == -44.4');
/* g2gm */
vrfy(g2gm(12.3456,g,m) == 12.3456,
'9174: g2gm(12.3456,g,m) == 12.3456');
vrfy(g == 12,
'9175: g == 12');
vrfy(m == 20.736,
'9176: m == 20.736');
vrfy(g2gm(1234.5678,g,m) == 34.5678,
'9177: g2gm(1234.5678,g,m) == 34.5678');
vrfy(g == 34,
'9178: g == 34');
vrfy(m == 34.068,
'9179: m == 34.068');
vrfy(g2gm(-1234.5678,g,m) == 365.4322,
'9180: g2gm(-1234.5678,g,m) == 365.4322');
vrfy(g == 365,
'9181: g == 365');
vrfy(m == 25.932,
'9182: m == 25.932');
vrfy(g2gm(400.321,g,m,1) == -399.679,
'9183: g2gm(400.321,g,m,1) == -399.679');
vrfy(g == -399,
'9184: g == -399');
vrfy(m == -40.74,
'9185: m == -40.74');
/* h2hms */
vrfy(h2hms(12.3456,h,m,s) == 12.3456,
'9186: h2hms(12.3456,h,m,s) == 12.3456');
vrfy(h == 12,
'9187: h == 12');
vrfy(m == 20,
'9188: m == 20');
vrfy(s == 44.16,
'9189: s == 44.16');
vrfy(h2hms(1234.5678,h,m,s) == 10.5678,
'9190: h2hms(1234.5678,h,m,s) == 10.5678');
vrfy(h == 10,
'9191: h == 10');
vrfy(m == 34,
'9192: m == 34');
vrfy(s == 4.08,
'9193: s == 4.08');
vrfy(h2hms(-1234.5678,h,m,s) == 13.4322,
'9194: h2hms(-1234.5678,h,m,s) == 13.4322');
vrfy(h == 13,
'9195: h == 13');
vrfy(m == 25,
'9196: m == 25');
vrfy(s == 55.92,
'9197: s == 55.92');
vrfy(h2hms(24.321,h,m,s,1) == -23.679,
'9198: h2hms(24.321,h,m,s,1) == -23.679');
vrfy(h == -23,
'9199: h == -23');
vrfy(m == -40,
'9200: m == -40');
vrfy(s == -44.4,
'9201: s == -44.4');
/* h2hm */
vrfy(h2hm(12.3456,h,m) == 12.3456,
'9202: h2hm(12.3456,h,m) == 12.3456');
vrfy(h == 12,
'9203: h == 12');
vrfy(m == 20.736,
'9204: m == 20.736');
vrfy(h2hm(1234.5678,h,m) == 10.5678,
'9205: h2hm(1234.5678,h,m) == 10.5678');
vrfy(h == 10,
'9206: h == 10');
vrfy(m == 34.068,
'9207: m == 34.068');
vrfy(h2hm(-1234.5678,h,m) == 13.4322,
'9208: h2hm(-1234.5678,h,m) == 13.4322');
vrfy(h == 13,
'9209: h == 13');
vrfy(m == 25.932,
'9210: m == 25.932');
vrfy(h2hm(24.321,h,m,1) == -23.679,
'9211: h2hm(24.321,h,m,1) == -23.679');
vrfy(h == -23,
'9212: h == -23');
vrfy(m == -40.74,
'9213: m == -40.74');
/* dm2d */
vrfy(dm2d(203, 325.5594) == 208.42599,
'9214: dm2d(203, 325.5594) == 208.42599');
vrfy(dm2d(3601, -25.5594) == 0.57401,
'9215: dm2d(3601, -25.5594) == 0.57401');
vrfy(dm2d(-923, -25.5594) == 156.57401,
'9216: dm2d(-923, -25.5594) == 156.57401');
vrfy(dm2d(203, 325.5594, 1) == -151.57401,
'9217: dm2d(203, 325.5594, 1) == -151.57401');
vrfy(d2dm(dm2d(12, 20.16),d,m) == 12.336,
'9218: d2dm(dm2d(12, 20.16),d,m) == 12.336');
vrfy(d == 12,
'9219: d == 12');
vrfy(m == 20.16,
'9220: m == 20.16');
/* dms2d */
vrfy(dms2d(12, 20, 44.16) == 12.3456,
'9221: dms2d(12, 20, 44.16) == 12.3456');
vrfy(dms2d(123.456, -345.68, 4.08) == 117.6958,
'9222: dms2d(123.456, -345.68, 4.08) == 117.6958');
vrfy(dms2d(-65, -40, -44.4) == 294.321,
'9223: dms2d(-65, -40, -44.4) == 294.321');
vrfy(dms2d(12, 20, 44.16, 1) == -347.6544,
'9224: dms2d(12, 20, 44.16, 1) == -347.6544');
vrfy(d2dms(dms2d(13, 20, 44.16),d,m,s) == 13.3456,
'9225: d2dms(dms2d(13, 20, 44.16),d,m,s) == 13.3456');
vrfy(d == 13,
'9226: d == 13');
vrfy(m == 20,
'9227: m == 20');
vrfy(s == 44.16,
'9228: s == 44.16');
/* gm2g */
vrfy(gm2g(203, 325.5594) == 208.42599,
'9229: gm2g(203, 325.5594) == 208.42599');
vrfy(gm2g(3601, -25.5594) == 0.57401,
'9230: gm2g(3601, -25.5594) == 0.57401');
vrfy(gm2g(-923, -25.5594) == 276.57401,
'9231: gm2g(-923, -25.5594) == 276.57401');
vrfy(gm2g(203, 325.5594, 1) == -191.57401,
'9232: gm2g(203, 325.5594, 1) == -191.57401');
vrfy(g2gm(gm2g(12, 20.16),g,m) == 12.336,
'9233: g2gm(gm2g(12, 20.16),g,m) == 12.336');
vrfy(g == 12,
'9234: g == 12');
vrfy(m == 20.16,
'9235: m == 20.16');
/* gms2g */
vrfy(gms2g(12, 20, 44.16) == 12.3456,
'9236: gms2g(12, 20, 44.16) == 12.3456');
vrfy(gms2g(123.456, -345.68, 4.08) == 117.6958,
'9237: gms2g(123.456, -345.68, 4.08) == 117.6958');
vrfy(gms2g(-65, -40, -44.4) == 334.321,
'9238: gms2g(-65, -40, -44.4) == 334.321');
vrfy(gms2g(12, 20, 44.16, 1) == -387.6544,
'9239: gms2g(12, 20, 44.16, 1) == -387.6544');
vrfy(g2gms(gms2g(14, 20, 44.16),g,m,s) == 14.3456,
'9240: g2gms(gms2g(14, 20, 44.16),g,m,s) == 14.3456');
vrfy(g == 14,
'9241: g == 14');
vrfy(m == 20,
'9242: m == 20');
vrfy(s == 44.16,
'9243: s == 44.16');
/* hm2h */
vrfy(hm2h(203, 325.5594) == 16.42599,
'9244: hm2h(203, 325.5594) == 16.42599');
vrfy(hm2h(241, -25.5594) == 0.57401,
'9245: hm2h(241, -25.5594) == 0.57401');
vrfy(hm2h(-923, -25.5594) == 12.57401,
'9246: hm2h(-923, -25.5594) == 12.57401');
vrfy(hm2h(203, 325.5594, 1) == -7.57401,
'9247: hm2h(203, 325.5594, 1) == -7.57401');
vrfy(h2hm(hm2h(12, 20.16),h,m) == 12.336,
'9248: h2hm(hm2h(12, 20.16),h,m) == 12.336');
vrfy(h == 12,
'9249: h == 12');
vrfy(m == 20.16,
'9250: m == 20.16');
/* hms2h */
vrfy(hms2h(12, 20, 44.16) == 12.3456,
'9251: hms2h(12, 20, 44.16) == 12.3456');
vrfy(hms2h(123.456, -345.68, 4.08) == 21.6958,
'9252: hms2h(123.456, -345.68, 4.08) == 21.6958');
vrfy(hms2h(-65, -40, -44.4) == 6.321,
'9253: hms2h(-65, -40, -44.4) == 6.321');
vrfy(hms2h(12, 20, 44.16, 1) == -11.6544,
'9254: hms2h(12, 20, 44.16, 1) == -11.6544');
vrfy(h2hms(hms2h(15, 20, 44.16),h,m,s) == 15.3456,
'9255: h2hms(hms2h(15, 20, 44.16),h,m,s) == 15.3456');
vrfy(h == 15,
'9256: h == 15');
vrfy(m == 20,
'9257: m == 20');
vrfy(s == 44.16,
'9258: s == 44.16');
print '9259: Ending test_functions3';
}
print;
print '9100: parsed test_functions3()';
print;
return test_functions3();
/*
* read various calc resource files
*

View File

@@ -1,7 +1,7 @@
##
## set8700 - dotest line tests for the 8700 set of regress.cal
##
## Copyright (C) 2006 Ernest Bowen and Landon Curt Noll
## Copyright (C) 2006,2021 Ernest Bowen and 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
@@ -159,7 +159,7 @@ set8700_A = 42, protect(set8700_A,1024), set8700_B = set8700_A, protect(set8700_
set8700_A = 6 * 7, protect(set8700_A) == 1024
set8700_A == set8700_B
## Testing matrix protectioon
## Testing matrix protection
set8700_A = mat [3] = {1, 2, list(3,4)}; 1
protect(set8700_A, 65, 1), protect(set8700_A) == 1089
protect(set8700_A[0]) == 65
@@ -261,7 +261,7 @@ protect(set8700_L[0]) == 0
protect(set8700_L[1]) == 512 ## protect(set8700_A) copied
protect(set8700_L[1][1]) == 1024 ## protect(set8700_A[1]) copied
## Testing list with "intialization"
## Testing list with "initialization"
set8700_L = list(1,2,3), protect(set8700_L) == 0
protect(set8700_L[0]) | protect(set8700_L[1]) | protect(set8700_L[2]) == 0 ## All zero
set8700_L = {1,set8700_A}, set8700_L[1] == set8700_A

View File

@@ -371,7 +371,7 @@ define normalcdf(x,mu,sigma){
define probit(p){
if(p<0 || p > 1) return newerror("probit: p out of domain 0<=p<=1");
return sqrt(2)*ervinv(2*p-1);
return sqrt(2)*erfinv(2*p-1);
}
define normalcdfinv(p,mu,sigma){

View File

@@ -1,7 +1,7 @@
/*
* sumtimes - runtimes evaluating sums & squares of large lists and mats
* sumtimes - runtime evaluating sums & squares of large lists and mats
*
* Copyright (C) 2006 Ernest Bowen
* Copyright (C) 2006,2021 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
@@ -160,7 +160,7 @@ define timehmean(N, M = 10) {
v2 = hmean(sumtimes_A);
sumtimes_t2 = usertime();
print v1, v2;
print "List harmonic meanruntimes";
print "List harmonic mean runtimes";
printf('\tStandard "for" loop:\t\t%.4f\n', sumtimes_t1 - sumtimes_t0);
printf('\tUsing builtin "hmean":\t\t%.4f\n', sumtimes_t2 - sumtimes_t1);
}

View File

@@ -2058,11 +2058,17 @@ define t010()
return 5;
}
/*
* Once, when an expression such as 0^(6-6) returned 0,
* 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.
* 0^(6-6) == 0^0 == 1, then stirling2(10, 5) == 5102999/120
* as in:
*
* if ((stirling2(10, 5) - (5102999/120)) != 0) {
* epsilon(eps);
* return 6;
* }
*/
if ((stirling2(10, 5) - (5102999/120)) != 0) {
if ((stirling2(10, 5) - 42525) != 0) {
epsilon(eps);
return 6;
}
@@ -2867,7 +2873,7 @@ define t035()
epsilon(eps);
return 6;
}
/* Percentiles. Numbers shamlessly stolen from a question at stackoverflow*/
/* Percentiles. Numbers shamelessly stolen from a question at stackoverflow */
if (abs
(invbetainc(0.025, 10008, 151744) -
0.060703546312525377697082321820950758320207425674954679415395) >
@@ -3081,7 +3087,7 @@ define test8900(verbose = 0, tnum, testnum = 8903)
return tnum;
}
/* We will cause erors intentionally. A lot of them. */
/* We will cause errors intentionally. A lot of them. */
old_errmax = errmax(-1);
/*

View File

@@ -336,7 +336,7 @@ define __CZ__produce_long_random_number(n)
ret = 1;
if(!isint(n) || n<1)
return newerror("__CZ__produce_long_random_number(n): "
"n is not an integer >=1");
"n is not an integer >=1");
for(k=0;k<n;k++){
ret += random();
ret = toomcook4square(ret);

View File

@@ -72,7 +72,7 @@ define hurwitzzeta(s,a){
limit=(precision*ln(10)-re((s-.5)*result)+(1.*realpart_a)*ln(2.*pi()))/2;
limit=max(2,ceil(max(limit,abs(s*1.)/2)));
limit_function=ceil(sqrt((limit+realpart_a/2-.25)^2+(imagpart_s*1.)^2/4)/
pi());
pi());
if (config("user_debug") > 0) {
print "limit_function = " limit_function;
print "limit = " limit;

45
calc.c
View File

@@ -1,8 +1,7 @@
/*
* calc - arbitrary precision calculator
*
* Copyright (C) 1999-2013,2021 David I. Bell, Landon Curt Noll
* and Ernest Bowen
* Copyright (C) 1999-2013,2021,2022 David I. Bell, Landon Curt Noll and Ernest Bowen
*
* Primary author: David I. Bell
*
@@ -29,14 +28,14 @@
#include <stdio.h>
#include <signal.h>
#if !defined (_WIN32)
#if !defined(_WIN32) && !defined(_WIN64)
# include <pwd.h>
#endif
#include <sys/types.h>
#include <ctype.h>
#if defined(_WIN32)
#if defined(_WIN32) || defined(_WIN64)
# include <io.h>
# if !defined(NOTCYGWIN)
/*
@@ -49,7 +48,7 @@
# endif
# define strdup _strdup
# define isatty _isatty
#endif /* Windoz */
#endif /* Windows */
#define CALC_C
#include "calc.h"
@@ -85,6 +84,7 @@
#include "have_unused.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -277,14 +277,14 @@ main(int argc, char **argv)
if (nextcp(&cp, &index, argc, argv,
FALSE)) {
fprintf(stderr,
"-D expects argument\n");
"-D expects argument\n");
exit(5);
}
havearg = TRUE;
if (*cp != ':') {
if (*cp < '0' || *cp > '9') {
fprintf(stderr,
"-D expects"
"-D expects"
" integer\n");
exit(6);
}
@@ -296,13 +296,13 @@ main(int argc, char **argv)
if (*cp != '\0' &&
*cp != ' ' && *cp != ':') {
fprintf(stderr,
"Bad syntax im -D"
"Bad syntax im -D"
" arg\n");
exit(7);
}
if (*cp != ':') {
if (nextcp(&cp, &index,
argc, argv,
argc, argv,
FALSE)
|| *cp != ':')
break;
@@ -318,7 +318,7 @@ main(int argc, char **argv)
if (*cp != ':') {
if (*cp < '0' || *cp > '9') {
fprintf(stderr,
"-D : expects"
"-D : expects"
" integer\n");
exit(9);
}
@@ -330,13 +330,13 @@ main(int argc, char **argv)
if (*cp != '\0' &&
*cp != ' ' && *cp != ':') {
fprintf(stderr,
"Bad syntax im -D"
"Bad syntax im -D"
" : arg\n");
exit(10);
}
if (*cp != ':') {
if (nextcp(&cp, &index,
argc, argv,
argc, argv,
FALSE)
|| *cp != ':') {
break;
@@ -346,12 +346,12 @@ main(int argc, char **argv)
if (nextcp(&cp, &index, argc, argv,
FALSE)) {
fprintf(stderr, "-D : : expects"
" argument\n");
" argument\n");
exit(11);
}
if (*cp < '0' || *cp > '9') {
fprintf(stderr, "-D :: expects"
" integer\n");
" integer\n");
exit(12);
}
user_debug = cp;
@@ -398,7 +398,7 @@ main(int argc, char **argv)
if (nextcp(&cp, &index, argc,
argv, haveendstr)) {
fprintf(stderr, "-f -once"
" expects"
" expects"
" filename\n");
exit(16);
}
@@ -548,7 +548,6 @@ main(int argc, char **argv)
setbuf(stdout, NULL);
}
/*
* initialize
*/
@@ -705,18 +704,18 @@ main(int argc, char **argv)
if (!p_flag && i_flag && !stdin_tty) {
closeinput();
if(!freopen("/dev/tty", "r", stdin)) {
#if defined (_WIN32)
#if defined(_WIN32) || defined(_WIN64)
fprintf(stderr,
"/dev/tty does not exist on "
"this operating system. "
"Change operating systems\n"
"or don't use this calc mode "
"in the future, sorry!\n");
#else /* Windoz free systems */
#else /* Windows free systems */
fprintf(stderr,
"Unable to associate stdin"
" with /dev/tty");
#endif /* Windoz free systems */
#endif /* Windows free systems */
set_run_state(RUN_EXIT_WITH_ERROR);
break;
}
@@ -735,18 +734,18 @@ main(int argc, char **argv)
!p_flag && (!havecommands||i_flag)) {
closeinput();
if(!freopen("/dev/tty", "r", stdin)) {
#if defined (_WIN32)
#if defined(_WIN32) || defined(_WIN64)
fprintf(stderr,
"/dev/tty does not exist on "
"this operating system. "
"Change operating systems\n"
"or don't use this calc mode "
"in the future, sorry!\n");
#else /* Windoz free systems */
#else /* Windows free systems */
fprintf(stderr,
"Unable to associate stdin"
" with /dev/tty");
#endif /* Windoz free systems */
#endif /* Windows free systems */
set_run_state(RUN_EXIT_WITH_ERROR);
break;
}
@@ -787,7 +786,7 @@ intint(int UNUSED(arg))
(void) signal(SIGINT, intint);
if (inputwait || (++abortlevel >= ABORT_NOW)) {
calc_interrupt("\nABORT");
/*NOTREACHED*/
not_reached();
}
if (abortlevel >= ABORT_MATH)
_math_abort_ = TRUE;

6
calc.h
View File

@@ -59,7 +59,7 @@
#define HOMECHAR '~' /* char which indicates home directory */
#define DOTCHAR '.' /* char which indicates current directory */
#define PATHCHAR '/' /* char which separates path components */
#if defined(__MSDOS__) || defined(__WIN32)
#if defined(_WIN32) || defined(_WIN64)
#define LISTCHAR ';' /* char which separates paths in a list */
#else
#define LISTCHAR ':' /* char which separates paths in a list */
@@ -123,7 +123,7 @@ E_FUNC int get_inode(FILEID id, ZVALUE *ino);
E_FUNC FILEID reopenid(FILEID id, char *mode, char *name);
E_FUNC int closeall(void);
#if !defined(_WIN32)
#if !defined(_WIN32) && !defined(_WIN64)
E_FUNC int flushall(void);
#endif
@@ -186,7 +186,7 @@ E_FUNC char *calc_strdup(CONST char *);
*/
E_FUNC void initialize(void);
E_FUNC void reinitialize(void);
#if !defined (_WIN32)
#if !defined(_WIN32) && !defined(_WIN64)
E_FUNC int isatty(int tty); /* TRUE if fd is a tty */
#endif
E_FUNC char *version(void); /* return version string */

View File

@@ -252,7 +252,7 @@ For example:
.fi
.in -5n
.sp 1
This allows the script to run independely of
This allows the script to run independently of
startup scripts.
.sp 1
@@ -596,7 +596,7 @@ may have to be replaced by:
.sp 1
.in +5n
.nf
print 27! ^2 or print 27\!^2
print 27! ^2 or print 27\\!^2
.fi
.in -5n
@@ -1445,7 +1445,7 @@ Your code needs to be contributed under either the 2.1 of the
.B GNU Lesser General Public License (LGPL 2.1)
or be in the public domain.
.sp
If you do not want to use calc GitHub, then send EMail to:
If you do not want to use calc GitHub, then send Email to:
.sp
.in +0.5i
.nf

View File

@@ -1,7 +1,7 @@
#
# calc.spec.in - template specfile for calc
#
# Copyright (C) 2003-2014 Petteri Kettunen and Landon Curt Noll
# Copyright (C) 2003-2014,2021 Petteri Kettunen and 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
@@ -49,7 +49,7 @@ BuildRoot: %{_tmppath}/build-root
Calc is arbitrary precision C-like arithmetic system that is a
calculator, an algorithm prototype and mathematical research
tool. Calc comes with a rich set of builtin mathematical and
programmatic functions.
programming functions.
For the latest calc release, see the calc project home page:
@@ -165,11 +165,11 @@ 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
* Sun Mar 24 2019 Landon 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.
by clearing the ARCH_CFLAGS value in order to maximize
the RPM binary portability.
* Mon Sep 01 2014 Landon Curt Noll http://www.isthe.com/chongo
- Release: 12
@@ -178,7 +178,7 @@ echo '-=- calc.spec beginning make clean -=-'
use -j1 while building these RPMs to avoid this make bug.
This only impacts the speed of building the rpms.
- Stopped removing %{_buildroot} at the beginning of install
as this, acording to a number of sources, was asking for trouble.
as this, according to a number of sources, was asking for trouble.
- Clean removes tmp, BUILD, SPEC, and BUILDROOT dirs under topdir.
- Fixed the building of the calc-debuginfo rpm.
- Eliminated rpmbuild "bogus date" warnings due to inconsistent weekday,

View File

@@ -259,7 +259,7 @@ E_COPY6 Non-integer or negative destination index for copy
E_COPY7 Destination index too large for copy
E_COPY8 Freed block source for copy
E_COPY9 Unsuitable source type for copy
E_COPY10 Freed block destinction for copy
E_COPY10 Freed block destination for copy
E_COPY11 Unsuitable destination type for copy
E_COPY12 Incompatible source and destination for copy
E_COPY13 No-copy-from source variable
@@ -506,3 +506,39 @@ E_R2G1 Bad epsilon for converting radians to gradians
E_R2G2 Bad first argument converting radians to gradians
E_D2G1 Bad first argument converting degrees to gradians
E_G2D1 Bad first argument converting gradians to degrees
E_D2DMS1 Non-lvalue arguments 2, 3 or 4 for d2dms
E_D2DMS2 Non-real-number arg 1 for d2dms
E_D2DMS3 No-assign-to argument 2, 3 or 4 for d2dms
E_D2DMS4 Invalid rounding arg 5 for d2dms
E_D2DM1 Non-lvalue arguments 2 or 3 for d2dm
E_D2DM2 Non-real-number arg 1 for d2dm
E_D2DM3 No-assign-to argument 2 or 3 for d2dm
E_D2DM4 Invalid rounding arg 4 for d2dm
E_G2GMS1 Non-lvalue arguments 2, 3 or 4 for g2gms
E_G2GMS2 Non-real-number arg 1 for g2gms
E_G2GMS3 No-assign-to argument 2 or 3 for g2gms
E_G2GMS4 Invalid rounding arg 5 for g2gms
E_G2GM1 Non-lvalue arguments 2 or 3 for g2gm
E_G2GM2 Non-real-number arg 1 for g2gm
E_G2GM3 No-assign-to argument 2, 3 or 4 for g2gm
E_G2GM4 Invalid rounding arg 4 for g2gm
E_H2HMS1 Non-lvalue arguments 2, 3 or 4 for h2hms
E_H2HMS2 Non-real-number arg 1 for h2hms
E_H2HMS3 No-assign-to argument 2, 3 or 4 for h2hms
E_H2HMS4 Invalid rounding arg 5 for h2hms
E_H2HM1 Non-lvalue arguments 2 or 3 for h2hm
E_H2HM2 Non-real-number arg 1 for h2hm
E_H2HM3 No-assign-to argument 2 or 3 for h2hm
E_H2HM4 Invalid rounding arg 4 for h2hm
E_DMS2D1 Non-real-number arguments 1, 2 or 3 for dms2d
E_DMS2D2 Invalid rounding arg 4 for dms2d
E_DM2D1 Non-real-number arguments 1 or 2 for dm2d
E_DM2D2 Invalid rounding arg 4 for dm2d
E_GMS2G1 Non-real-number arguments 1, 2 or 3 for gms2g
E_GMS2G2 Invalid rounding arg 4 for gms2g
E_GM2G1 Non-real-number arguments 1 or 2 for gm2g
E_GM2G2 Invalid rounding arg 4 for gm2g
E_HMS2H1 Non-real-number arguments 1, 2 or 3 for hms2h
E_HMS2H2 Invalid rounding arg 4 for hms2h
E_HM2H1 Non-real-number arguments 1 or 2 for hm2h
E_HM2H2 Invalid rounding arg 4 for hm2h

67
charbit.c Normal file
View File

@@ -0,0 +1,67 @@
/*
* charbit - determine what CHAR_BIT is and define CALC_CHARBIT
*
* Copyright (C) 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
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Under source code control: 2021/12/07 20:57:50
* File existed as early as: 2021
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* usage:
* charbit
*
* This prog outputs several defines:
*
* CALC_CHARBIT
* after including have_limits.h and perhaps <limits.h>,
* output CALC_CHARBIT as CHAR_BIT (from <limits.h>, or as 8.
*/
#include <stdio.h>
#include "have_limits.h"
#if defined(HAVE_LIMITS_H)
#include <limits.h>
#endif
#include "banned.h" /* include after system header <> includes */
int
main(void)
{
printf("#include \"have_limits.h\"\n");
printf("#if defined(HAVE_LIMITS_H)\n");
printf("#include <limits.h>\n");
printf("#endif\n\n");
#if defined(CHAR_BIT)
printf("#define CALC_CHARBIT (CHAR_BIT) /* from <limits.h> */\n");
#else /* CHAR_BIT */
printf("#define CALC_CHARBIT (8) /* no CHAR_BIT, assume 8 */\n");
#endif /* CHAR_BIT */
/* exit(0); */
return 0;
}

View File

@@ -1,7 +1,7 @@
/*
* codegen - module to generate opcodes from the input tokens
*
* Copyright (C) 1999-2007,2017,2021 David I. Bell and Ernest Bowen
* Copyright (C) 1999-2007,2017,2021,2022 David I. Bell and Ernest Bowen
*
* Primary author: David I. Bell
*
@@ -44,11 +44,14 @@
#include "conf.h"
#include "strl.h"
#if defined(_WIN32) && !defined(__CYGWIN__)
#if defined(_WIN32) || defined(_WIN64)
#if !defined(__CYGWIN__)
# include <direct.h>
#endif
#endif
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -451,7 +454,7 @@ getsimplebody(void)
/*
* Get the body of a function, or a subbody of a function.
* Get the body of a function, or a sub-body of a function.
* body = '{' [ declarations ] ... [ statement ] ... '}'
* | [ declarations ] ... [statement ] ... '\n'
*/
@@ -1516,7 +1519,7 @@ getexprlist(void)
/*
* Get an opassignment or possibly just an assignment or expression.
* Get an op-assignment or possibly just an assignment or expression.
* Returns flags describing the type of assignment or expression found.
* assignment = lvalue '=' assignment
* | lvalue '+=' assignment
@@ -2381,16 +2384,16 @@ getfilename(char *name, size_t namelen, BOOL *once)
if (symstr == NULL) {
math_error(
"string value pointer is NULL!!");
/*NOTREACHED*/
not_reached();
}
} else {
math_error(
"a filename variable must be a string");
/*NOTREACHED*/
not_reached();
}
} else {
math_error("no such global variable");
/*NOTREACHED*/
not_reached();
}
}

View File

@@ -1,7 +1,7 @@
/*
* comfunc - extended precision complex arithmetic non-primitive routines
*
* Copyright (C) 1999-2007,2021 David I. Bell and Ernest Bowen
* Copyright (C) 1999-2007,2021,2022 David I. Bell and Ernest Bowen
*
* Primary author: David I. Bell
*
@@ -30,6 +30,7 @@
#include "cmath.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -60,16 +61,16 @@ c_powi(COMPLEX *c, NUMBER *q)
if (qisfrac(q)) {
math_error("Raising number to non-integral power");
/*NOTREACHED*/
not_reached();
}
if (zge31b(q->num)) {
math_error("Raising number to very large power");
/*NOTREACHED*/
not_reached();
}
power = ztolong(q->num);
if (ciszero(c) && (power == 0)) {
math_error("Raising zero to zeroth power");
/*NOTREACHED*/
not_reached();
}
sign = 1;
if (qisneg(q))
@@ -381,7 +382,7 @@ c_root(COMPLEX *c, NUMBER *q, NUMBER *epsilon)
if (qisneg(q) || qiszero(q) || qisfrac(q)) {
math_error("Taking bad root of complex number");
/*NOTREACHED*/
not_reached();
}
if (cisone(c) || qisone(q))
return clink(c);
@@ -446,7 +447,7 @@ c_exp(COMPLEX *c, NUMBER *epsilon)
if (qiszero(epsilon)) {
math_error("Zero epsilon for cexp");
/*NOTREACHED*/
not_reached();
}
if (cisreal(c)) {
tmp1 = qexp(c->real, epsilon);
@@ -502,7 +503,7 @@ c_ln(COMPLEX *c, NUMBER *epsilon)
if (ciszero(c)) {
math_error("logarithm of zero");
/*NOTREACHED*/
not_reached();
}
if (cisone(c))
return clink(&_czero_);
@@ -599,7 +600,7 @@ c_cos(COMPLEX *c, NUMBER *epsilon)
if (qiszero(epsilon)) {
math_error("Zero epsilon for ccos");
/*NOTREACHED*/
not_reached();
}
n = qilog2(epsilon);
ctmp1 = comalloc();
@@ -649,7 +650,7 @@ c_sin(COMPLEX *c, NUMBER *epsilon)
if (qiszero(epsilon)) {
math_error("Zero epsilon for csin");
/*NOTREACHED*/
not_reached();
}
if (ciszero(c))
return clink(&_czero_);
@@ -1072,7 +1073,7 @@ c_polar(NUMBER *q1, NUMBER *q2, NUMBER *epsilon)
if (qiszero(epsilon)) {
math_error("Zero epsilon for cpolar");
/*NOTREACHED*/
not_reached();
}
if (qiszero(q1))
return clink(&_czero_);
@@ -1114,12 +1115,12 @@ c_power(COMPLEX *c1, COMPLEX *c2, NUMBER *epsilon)
if (qiszero(epsilon)) {
math_error("Zero epsilon for cpower");
/*NOTREACHED*/
not_reached();
}
if (ciszero(c1)) {
if (cisreal(c2) && qisneg(c2->real)) {
math_error ("Non-positive real exponent of zero");
/*NOTREACHED*/
not_reached();
}
return clink(&_czero_);
}

View File

@@ -1,7 +1,7 @@
/*
* commath - extended precision complex arithmetic primitive routines
*
* Copyright (C) 1999-2007,2021 David I. Bell
* Copyright (C) 1999-2007,2021,2022 David I. Bell
*
* 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
@@ -27,6 +27,7 @@
#include "cmath.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -189,7 +190,7 @@ c_div(COMPLEX *c1, COMPLEX *c2)
if (ciszero(c2)) {
math_error("Division by zero");
/*NOTREACHED*/
not_reached();
}
if ((c1->real == c2->real) && (c1->imag == c2->imag))
return clink(&_cone_);
@@ -260,7 +261,7 @@ c_inv(COMPLEX *c)
if (ciszero(c)) {
math_error("Inverting zero");
/*NOTREACHED*/
not_reached();
}
r = comalloc();
if (cisreal(c)) {
@@ -522,7 +523,7 @@ c_divq(COMPLEX *c, NUMBER *q)
if (qiszero(q)) {
math_error("Division by zero");
/*NOTREACHED*/
not_reached();
}
if (qisone(q))
return clink(c);
@@ -605,7 +606,7 @@ comalloc(void)
r = (COMPLEX *) malloc(sizeof(COMPLEX));
if (r == NULL) {
math_error("Cannot allocate complex number");
/*NOTREACHED*/
not_reached();
}
r->links = 1;
r->real = qlink(&_qzero_);

196
config.c
View File

@@ -1,7 +1,7 @@
/*
* config - configuration routines
*
* Copyright (C) 1999-2007,2021 David I. Bell and Landon Curt Noll
* Copyright (C) 1999-2007,2021,2022 David I. Bell and Landon Curt Noll
*
* Primary author: David I. Bell
*
@@ -62,6 +62,7 @@
#endif /* HAVE_STRDUP */
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -149,8 +150,8 @@ CONFIG oldstd = { /* backward compatible standard configuration */
SQ_ALG2, /* size of number to use square alg 2 */
POW_ALG2, /* size of modulus to use REDC for powers */
REDC_ALG2, /* size of modulus to use REDC algorithm 2 */
TRUE, /* ok to print a tilde on approximations */
TRUE, /* ok to print tab before numeric values */
TRUE, /* OK to print a tilde on approximations */
TRUE, /* OK to print tab before numeric values */
0, /* quomod() default rounding mode */
2, /* quotient // default rounding mode */
0, /* mod % default rounding mode */
@@ -160,8 +161,8 @@ CONFIG oldstd = { /* backward compatible standard configuration */
8, /* cfsim() default rounding mode */
2, /* output default rounding mode */
24, /* round()/bround() default rounding mode */
FALSE, /* ok to print leading 0 before decimal pt */
0, /* ok to print trailing 0's */
FALSE, /* OK to print leading 0 before decimal pt */
0, /* OK to print trailing 0's */
MAXSCANCOUNT, /* max scan errors before abort */
PROMPT1, /* normal prompt */
PROMPT2, /* prompt when inside multi-line input */
@@ -176,10 +177,10 @@ CONFIG oldstd = { /* backward compatible standard configuration */
CTRL_D_VIRGIN_EOF, /* ^D only exits on virgin lines */
NULL, /* our name */
NULL, /* basename of our name */
#if defined(_WIN32)
#if defined(_WIN32) || defined(_WIN64)
TRUE, /* running under windows */
#else
FALSE, /* congrats, you are not using windows */
FALSE, /* not using windows */
#endif
#if defined(__CYGWIN__)
TRUE, /* compiled under cygwin */
@@ -209,8 +210,8 @@ CONFIG newstd = { /* new non-backward compatible configuration */
SQ_ALG2, /* size of number to use square alg 2 */
POW_ALG2, /* size of modulus to use REDC for powers */
REDC_ALG2, /* size of modulus to use REDC algorithm 2 */
TRUE, /* ok to print a tilde on approximations */
TRUE, /* ok to print tab before numeric values */
TRUE, /* OK to print a tilde on approximations */
TRUE, /* OK to print tab before numeric values */
0, /* quomod() default rounding mode */
2, /* quotient // default rounding mode */
0, /* mod % default rounding mode */
@@ -220,8 +221,8 @@ CONFIG newstd = { /* new non-backward compatible configuration */
8, /* cfsim() default rounding mode */
24, /* output default rounding mode */
24, /* round()/bround() default rounding mode */
TRUE, /* ok to print leading 0 before decimal pt */
0, /* ok to print trailing 0's */
TRUE, /* OK to print leading 0 before decimal pt */
0, /* OK to print trailing 0's */
MAXSCANCOUNT, /* max scan errors before abort */
"; ", /* normal prompt */
";; ", /* prompt when inside multi-line input */
@@ -236,10 +237,10 @@ CONFIG newstd = { /* new non-backward compatible configuration */
CTRL_D_VIRGIN_EOF, /* ^D only exits on virgin lines */
NULL, /* our name */
NULL, /* basename of our name */
#if defined(_WIN32)
#if defined(_WIN32) || defined(_WIN64)
TRUE, /* running under windows */
#else
FALSE, /* congrats, you are not using windows */
FALSE, /* not using windows */
#endif
#if defined(__CYGWIN__)
TRUE, /* compiled under cygwin */
@@ -488,11 +489,11 @@ setconfig(int type, VALUE *vp)
newconf = &newstd;
} else {
math_error("CONFIG alias not oldstd or newstd");
/*NOTREACHED*/
not_reached();
}
} else if (vp->v_type != V_CONFIG) {
math_error("non-CONFIG for all");
/*NOTREACHED*/
not_reached();
} else {
newconf = vp->v_config;
}
@@ -507,14 +508,14 @@ setconfig(int type, VALUE *vp)
case CONFIG_TRACE:
if (vp->v_type != V_NUM) {
math_error("Non-numeric for trace");
/*NOTREACHED*/
not_reached();
}
q = vp->v_num;
temp = qtoi(q);
if (qisfrac(q) || !zistiny(q->num) ||
((unsigned long) temp > TRACE_MAX)) {
math_error("Bad trace value");
/*NOTREACHED*/
not_reached();
}
conf->traceflags = (FLAG)temp;
break;
@@ -522,7 +523,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_DISPLAY:
if (getlen(vp, &len)) {
math_error("Bad value for display");
/*NOTREACHED*/
not_reached();
}
math_setdigits(len);
break;
@@ -530,12 +531,12 @@ setconfig(int type, VALUE *vp)
case CONFIG_MODE:
if (vp->v_type != V_STR) {
math_error("Non-string for mode");
/*NOTREACHED*/
not_reached();
}
temp = lookup_long(modes, vp->v_str->s_str);
if (temp < 0) {
math_error("Unknown mode \"%s\"", vp->v_str->s_str);
/*NOTREACHED*/
not_reached();
}
math_setmode((int) temp);
break;
@@ -543,12 +544,12 @@ setconfig(int type, VALUE *vp)
case CONFIG_MODE2:
if (vp->v_type != V_STR) {
math_error("Non-string for mode");
/*NOTREACHED*/
not_reached();
}
temp = lookup_long(modes, vp->v_str->s_str);
if (temp < 0) {
math_error("Unknown mode \"%s\"", vp->v_str->s_str);
/*NOTREACHED*/
not_reached();
}
math_setmode2((int) temp);
break;
@@ -556,7 +557,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_EPSILON:
if (vp->v_type != V_NUM) {
math_error("Non-numeric for epsilon");
/*NOTREACHED*/
not_reached();
}
setepsilon(vp->v_num);
break;
@@ -564,7 +565,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_MAXPRINT:
if (getlen(vp, &len)) {
math_error("Bad value for maxprint");
/*NOTREACHED*/
not_reached();
}
conf->maxprint = len;
break;
@@ -572,7 +573,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_MUL2:
if (getlen(vp, &len) || len < 0 || len == 1) {
math_error("Bad value for mul2");
/*NOTREACHED*/
not_reached();
}
if (len == 0)
len = MUL_ALG2;
@@ -582,7 +583,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_SQ2:
if (getlen(vp, &len) || len < 0 || len == 1) {
math_error("Bad value for sq2");
/*NOTREACHED*/
not_reached();
}
if (len == 0)
len = SQ_ALG2;
@@ -592,7 +593,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_POW2:
if (getlen(vp, &len) || len < 0 || len == 1) {
math_error("Bad value for pow2");
/*NOTREACHED*/
not_reached();
}
if (len == 0)
len = POW_ALG2;
@@ -602,7 +603,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_REDC2:
if (getlen(vp, &len) || len < 0 || len == 1) {
math_error("Bad value for redc2");
/*NOTREACHED*/
not_reached();
}
if (len == 0)
len = REDC_ALG2;
@@ -617,7 +618,7 @@ setconfig(int type, VALUE *vp)
temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) {
math_error("Illegal truth value for tilde");
/*NOTREACHED*/
not_reached();
}
conf->tilde_ok = (int)temp;
}
@@ -631,7 +632,7 @@ setconfig(int type, VALUE *vp)
temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) {
math_error("Illegal truth value for tab");
/*NOTREACHED*/
not_reached();
}
conf->tab_ok = (int)temp;
}
@@ -640,7 +641,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_QUOMOD:
if (getlen(vp, &len)) {
math_error("Illegal value for quomod");
/*NOTREACHED*/
not_reached();
}
conf->quomod = len;
break;
@@ -648,7 +649,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_QUO:
if (getlen(vp, &len)) {
math_error("Illegal value for quo");
/*NOTREACHED*/
not_reached();
}
conf->quo = len;
break;
@@ -656,7 +657,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_MOD:
if (getlen(vp, &len)) {
math_error("Illegal value for mod");
/*NOTREACHED*/
not_reached();
}
conf->mod = len;
break;
@@ -664,7 +665,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_SQRT:
if (getlen(vp, &len)) {
math_error("Illegal value for sqrt");
/*NOTREACHED*/
not_reached();
}
conf->sqrt = len;
break;
@@ -672,7 +673,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_APPR:
if (getlen(vp, &len)) {
math_error("Illegal value for appr");
/*NOTREACHED*/
not_reached();
}
conf->appr = len;
break;
@@ -680,7 +681,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_CFAPPR:
if (getlen(vp, &len)) {
math_error("Illegal value for cfappr");
/*NOTREACHED*/
not_reached();
}
conf->cfappr = len;
break;
@@ -688,7 +689,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_CFSIM:
if (getlen(vp, &len)) {
math_error("Illegal value for cfsim");
/*NOTREACHED*/
not_reached();
}
conf->cfsim = len;
break;
@@ -696,7 +697,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_OUTROUND:
if (getlen(vp, &len)) {
math_error("Illegal value for outround");
/*NOTREACHED*/
not_reached();
}
conf->outround = len;
break;
@@ -704,7 +705,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_ROUND:
if (getlen(vp, &len)) {
math_error("Illegal value for round");
/*NOTREACHED*/
not_reached();
}
conf->round = len;
break;
@@ -715,10 +716,9 @@ setconfig(int type, VALUE *vp)
conf->leadzero = !qiszero(q);
} else if (vp->v_type == V_STR) {
temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) { {
if (temp < 0) {
math_error("Illegal truth value for leadzero");
/*NOTREACHED*/
}
not_reached();
}
conf->leadzero = (int)temp;
}
@@ -732,7 +732,7 @@ setconfig(int type, VALUE *vp)
temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) { {
math_error("Illegal truth value for fullzero");
/*NOTREACHED*/
not_reached();
}
}
conf->fullzero = (int)temp;
@@ -742,7 +742,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_MAXSCAN:
if (vp->v_type != V_NUM) {
math_error("Non-numeric for maxscancount");
/*NOTREACHED*/
not_reached();
}
q = vp->v_num;
temp = qtoi(q);
@@ -750,7 +750,7 @@ setconfig(int type, VALUE *vp)
temp = -1;
if (temp < 0) {
math_error("Maxscan value is out of range");
/*NOTREACHED*/
not_reached();
}
conf->maxscancount = temp;
break;
@@ -758,12 +758,12 @@ setconfig(int type, VALUE *vp)
case CONFIG_PROMPT:
if (vp->v_type != V_STR) {
math_error("Non-string for prompt");
/*NOTREACHED*/
not_reached();
}
p = (char *)malloc(vp->v_str->s_len + 1);
if (p == NULL) {
math_error("Cannot duplicate new prompt");
/*NOTREACHED*/
not_reached();
}
strlcpy(p, vp->v_str->s_str, vp->v_str->s_len + 1);
free(conf->prompt1);
@@ -773,12 +773,12 @@ setconfig(int type, VALUE *vp)
case CONFIG_MORE:
if (vp->v_type != V_STR) {
math_error("Non-string for more prompt");
/*NOTREACHED*/
not_reached();
}
p = (char *)malloc(vp->v_str->s_len + 1);
if (p == NULL) {
math_error("Cannot duplicate new more prompt");
/*NOTREACHED*/
not_reached();
}
strlcpy(p, vp->v_str->s_str, vp->v_str->s_len + 1);
free(conf->prompt2);
@@ -788,7 +788,7 @@ setconfig(int type, VALUE *vp)
case CONFIG_BLKMAXPRINT:
if (vp->v_type != V_NUM) {
math_error("Non-numeric for blkmaxprint");
/*NOTREACHED*/
not_reached();
}
q = vp->v_num;
temp = qtoi(q);
@@ -796,7 +796,7 @@ setconfig(int type, VALUE *vp)
temp = -1;
if (temp < 0) {
math_error("Blkmaxprint value is out of range");
/*NOTREACHED*/
not_reached();
}
conf->blkmaxprint = temp;
break;
@@ -809,7 +809,7 @@ setconfig(int type, VALUE *vp)
temp = lookup_long(truth, vp->v_str->s_str);
if (temp < 0) {
math_error("Illegal truth value for blkverbose");
/*NOTREACHED*/
not_reached();
}
conf->blkverbose = (int)temp;
}
@@ -818,13 +818,13 @@ setconfig(int type, VALUE *vp)
case CONFIG_BLKBASE:
if (vp->v_type != V_STR) {
math_error("Non-string for blkbase");
/*NOTREACHED*/
not_reached();
}
temp = lookup_long(blk_base, vp->v_str->s_str);
if (temp < 0) {
math_error("Unknown mode \"%s\" for blkbase",
vp->v_str->s_str);
/*NOTREACHED*/
not_reached();
}
conf->blkbase = temp;
break;
@@ -832,13 +832,13 @@ setconfig(int type, VALUE *vp)
case CONFIG_BLKFMT:
if (vp->v_type != V_STR) {
math_error("Non-string for blkfmt");
/*NOTREACHED*/
not_reached();
}
temp = lookup_long(blk_fmt, vp->v_str->s_str);
if (temp < 0) {
math_error("Unknown mode \"%s\" for blkfmt",
vp->v_str->s_str);
/*NOTREACHED*/
not_reached();
}
conf->blkfmt = temp;
break;
@@ -846,13 +846,13 @@ setconfig(int type, VALUE *vp)
case CONFIG_CALC_DEBUG:
if (vp->v_type != V_NUM) {
math_error("Non numeric for calc_debug");
/*NOTREACHED*/
not_reached();
}
q = vp->v_num;
temp = qtoi(q);
if (qisfrac(q) || !zistiny(q->num)) {
math_error("Illegal calc_debug parameter value");
/*NOTREACHED*/
not_reached();
}
conf->calc_debug = temp;
break;
@@ -860,13 +860,13 @@ setconfig(int type, VALUE *vp)
case CONFIG_RESOURCE_DEBUG:
if (vp->v_type != V_NUM) {
math_error("Non numeric for resource_debug");
/*NOTREACHED*/
not_reached();
}
q = vp->v_num;
temp = qtoi(q);
if (qisfrac(q) || !zistiny(q->num)) {
math_error("Illegal resource_debug parameter value");
/*NOTREACHED*/
not_reached();
}
conf->resource_debug = temp;
break;
@@ -874,13 +874,13 @@ setconfig(int type, VALUE *vp)
case CONFIG_USER_DEBUG:
if (vp->v_type != V_NUM) {
math_error("Non numeric for user_debug");
/*NOTREACHED*/
not_reached();
}
q = vp->v_num;
temp = qtoi(q);
if (qisfrac(q) || !zistiny(q->num)) {
math_error("Illegal user_debug parameter value");
/*NOTREACHED*/
not_reached();
}
conf->user_debug = temp;
break;
@@ -894,7 +894,7 @@ setconfig(int type, VALUE *vp)
if (temp < 0) {
math_error("Illegal truth value "
"for verbose_quit");
/*NOTREACHED*/
not_reached();
}
conf->verbose_quit = (int)temp;
}
@@ -903,56 +903,56 @@ setconfig(int type, VALUE *vp)
case CONFIG_CTRL_D:
if (vp->v_type != V_STR) {
math_error("Non-string for ctrl_d");
/*NOTREACHED*/
not_reached();
}
temp = lookup_long(ctrl_d, vp->v_str->s_str);
if (temp < 0) {
math_error("Unknown mode \"%s\" for ctrl_d",
vp->v_str->s_str);
/*NOTREACHED*/
not_reached();
}
conf->ctrl_d = temp;
break;
case CONFIG_PROGRAM:
math_error("The program config parameter is read-only");
/*NOTREACHED*/
abort();
not_reached();
break;
case CONFIG_BASENAME:
math_error("The basename config parameter is read-only");
/*NOTREACHED*/
abort();
not_reached();
break;
case CONFIG_WINDOWS:
math_error("The windows config parameter is read-only");
/*NOTREACHED*/
abort();
not_reached();
break;
case CONFIG_CYGWIN:
math_error("The cygwin config parameter is read-only");
/*NOTREACHED*/
abort();
not_reached();
break;
case CONFIG_COMPILE_CUSTOM:
math_error("The custom config parameter is read-only");
/*NOTREACHED*/
abort();
not_reached();
break;
case CONFIG_ALLOW_CUSTOM:
math_error("The allow_custom config parameter is read-only");
/*NOTREACHED*/
abort();
not_reached();
break;
case CONFIG_VERSION:
math_error("The version config parameter is read-only");
/*NOTREACHED*/
abort();
not_reached();
break;
case CONFIG_BASEB:
math_error("The baseb config parameter is read-only");
/*NOTREACHED*/
abort();
not_reached();
break;
case CONFIG_REDECL_WARN:
if (vp->v_type == V_NUM) {
@@ -963,7 +963,7 @@ setconfig(int type, VALUE *vp)
if (temp < 0) {
math_error("Illegal truth value for "
"redecl_warn");
/*NOTREACHED*/
not_reached();
}
conf->redecl_warn = (int)temp;
}
@@ -978,7 +978,7 @@ setconfig(int type, VALUE *vp)
if (temp < 0) {
math_error("Illegal truth value for "
"dupvar_warn");
/*NOTREACHED*/
not_reached();
}
conf->dupvar_warn = (int)temp;
}
@@ -986,13 +986,13 @@ setconfig(int type, VALUE *vp)
case CONFIG_HZ:
math_error("The clock tick rate config parameter is read-only");
/*NOTREACHED*/
abort();
not_reached();
break;
default:
math_error("Setting illegal config parameter");
/*NOTREACHED*/
abort();
not_reached();
break;
}
}
@@ -1017,7 +1017,7 @@ config_copy(CONFIG *src)
if (src == NULL || src->epsilon == NULL || src->prompt1 == NULL ||
src->prompt2 == NULL) {
math_error("bad CONFIG value");
/*NOTREACHED*/
not_reached();
}
/*
@@ -1026,7 +1026,7 @@ config_copy(CONFIG *src)
dest = (CONFIG *)malloc(sizeof(CONFIG));
if (dest == NULL) {
math_error("malloc of CONFIG failed");
/*NOTREACHED*/
not_reached();
}
/*
@@ -1134,7 +1134,7 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
if (cfg == NULL || cfg->epsilon == NULL || cfg->prompt1 == NULL ||
cfg->prompt2 == NULL) {
math_error("bad CONFIG value");
/*NOTREACHED*/
not_reached();
}
/*
@@ -1161,7 +1161,7 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
p = lookup_name(modes, cfg->outmode);
if (p == NULL) {
math_error("invalid output mode: %d", cfg->outmode);
/*NOTREACHED*/
not_reached();
}
vp->v_str = makenewstring(p);
return;
@@ -1172,7 +1172,7 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
if (p == NULL) {
math_error("invalid secondary output mode: %d",
cfg->outmode2);
/*NOTREACHED*/
not_reached();
}
vp->v_str = makenewstring(p);
return;
@@ -1280,7 +1280,7 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
p = lookup_name(blk_base, cfg->blkbase);
if (p == NULL) {
math_error("invalid block base: %d", cfg->blkbase);
/*NOTREACHED*/
not_reached();
}
vp->v_str = makenewstring(p);
return;
@@ -1290,7 +1290,7 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
p = lookup_name(blk_fmt, cfg->blkfmt);
if (p == NULL) {
math_error("invalid block format: %d", cfg->blkfmt);
/*NOTREACHED*/
not_reached();
}
vp->v_str = makenewstring(p);
return;
@@ -1316,7 +1316,7 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
p = lookup_name(ctrl_d, cfg->ctrl_d);
if (p == NULL) {
math_error("invalid Control-D: %d", cfg->ctrl_d);
/*NOTREACHED*/
not_reached();
}
vp->v_str = makenewstring(p);
return;
@@ -1386,7 +1386,7 @@ config_value(CONFIG *cfg, int type, VALUE *vp)
default:
math_error("Getting illegal CONFIG element");
/*NOTREACHED*/
not_reached();
}
/*
@@ -1416,12 +1416,12 @@ config_cmp(CONFIG *cfg1, CONFIG *cfg2)
if (cfg1 == NULL || cfg1->epsilon == NULL || cfg1->prompt1 == NULL ||
cfg1->prompt2 == NULL) {
math_error("CONFIG #1 value is invalid");
/*NOTREACHED*/
not_reached();
}
if (cfg2 == NULL || cfg2->epsilon == NULL || cfg2->prompt1 == NULL ||
cfg2->prompt2 == NULL) {
math_error("CONFIG #2 value is invalid");
/*NOTREACHED*/
not_reached();
}
/*

View File

@@ -130,8 +130,8 @@ struct config {
LEN sq2; /* size of number to use square algorithm 2 */
LEN pow2; /* size of modulus to use REDC for powers */
LEN redc2; /* size of modulus to use REDC algorithm 2 */
BOOL tilde_ok; /* ok to print a tilde on approximations */
BOOL tab_ok; /* ok to print tab before numeric values */
BOOL tilde_ok; /* OK to print a tilde on approximations */
BOOL tab_ok; /* OK to print tab before numeric values */
LEN quomod; /* quomod() default rounding mode */
LEN quo; /* quotient // default rounding mode */
LEN mod; /* mod % default rounding mode */
@@ -141,8 +141,8 @@ struct config {
LEN cfsim; /* cfsim() default rounding mode */
LEN outround; /* output default rounding mode */
LEN round; /* round()/bround() default rounding mode */
BOOL leadzero; /* ok to print leading 0 before decimal pt */
BOOL fullzero; /* ok to print trailing 0's */
BOOL leadzero; /* OK to print leading 0 before decimal pt */
BOOL fullzero; /* OK to print trailing 0's */
long maxscancount; /* max scan errors before abort */
char *prompt1; /* normal prompt */
char *prompt2; /* prompt when inside multi-line input */

28
const.c
View File

@@ -1,7 +1,7 @@
/*
* const - constant number storage module
*
* Copyright (C) 1999-2007,2021 David I. Bell
* Copyright (C) 1999-2007,2021,2022 David I. Bell
*
* 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
@@ -29,6 +29,7 @@
#include "qmath.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -44,16 +45,16 @@ initconstants(void)
{
int i;
consttable = (NUMBER **) malloc(sizeof(NUMBER *) * CONSTALLOCSIZE);
consttable = (NUMBER **) calloc(sizeof(NUMBER *), CONSTALLOCSIZE);
if (consttable == NULL) {
math_error("Unable to allocate constant table");
/*NOTREACHED*/
not_reached();
}
for (i = 0; i < INITCONSTCOUNT; i++)
for (i = 0; initnumbs[i] != NULL; i++) {
consttable[i] = initnumbs[i];
consttable[INITCONSTCOUNT] = NULL; /* firewall */
constcount = INITCONSTCOUNT;
constavail = CONSTALLOCSIZE - INITCONSTCOUNT;
}
constcount = i-1;
constavail = CONSTALLOCSIZE - constcount;
}
@@ -108,7 +109,7 @@ addqconstant(NUMBER *q)
sizeof(NUMBER *) * (constcount + CONSTALLOCSIZE));
if (tp == NULL) {
math_error("Unable to reallocate const table");
/*NOTREACHED*/
not_reached();
}
consttable = tp;
constavail = CONSTALLOCSIZE;
@@ -123,6 +124,9 @@ addqconstant(NUMBER *q)
tp = consttable;
for (index = 0; index < constcount; index++, tp++) {
t = *tp;
if (t == NULL) { /* paranoia */
break;
}
if (t->links == 0) {
if (!havefirst) {
havefirst = TRUE;
@@ -176,11 +180,11 @@ constvalue(unsigned long index)
{
if (index >= constcount) {
math_error("Bad index value for constvalue");
/*NOTREACHED*/
not_reached();
}
if (consttable[index]->links == 0) {
math_error("Constvalue has been freed!!!");
/*NOTREACHED*/
not_reached();
}
return consttable[index];
}
@@ -193,12 +197,12 @@ freeconstant(unsigned long index)
if (index >= constcount) {
math_error("Bad index value for freeconst");
/*NOTREACHED*/
not_reached();
}
q = consttable[index];
if (q->links == 0) {
math_error("Attempting to free freed const location");
/*NOTREACHED*/
not_reached();
}
qfree(q);
if (index == constcount - 1) {

View File

@@ -1,7 +1,7 @@
#
# cscript - makefile for calc shell script files
#
# Copyright (C) 1999-2006,2014,2017,2021 Landon Curt Noll
# Copyright (C) 1999-2006,2014,2017,2021,2022 Landon Curt Noll
#
# SRC: cscript/Makefile
#
@@ -47,14 +47,18 @@
#
# On some systems such as macOS, the bash shell is very
# far behind to the point where is cannot be depended on.
# On such systems, the zsh may be a much better alternative
# On such systems, the sh may be a much better alternative
# shell for this Makefile to use:
#
# SHELL= /bin/zsh
# SHELL= /bin/sh
#
SHELL= /bin/sh
#SHELL= /bin/bash
#SHELL= /bin/zsh
SHELL= /bin/bash
#SHELL= /bin/sh
#if 0 /* start of skip for non-Gnu makefiles */
ifeq ($(target),Darwin)
SHELL:= /bin/zsh
endif
#endif /* end of skip for non-Gnu makefiles */
####
@@ -101,15 +105,6 @@ PREFIX= /usr/local
#
MAKE_FILE= Makefile
# Controlling file makefile basename (without the path)
#
# This is the basename same of the makefile that may/does/will drive
# this makefile.
#
# If in doubt, set TOP_MAKE_FILE to Makefile
#
TOP_MAKE_FILE= Makefile
# Where the system include (.h) files are kept
#
# For DJGPP, select:
@@ -219,10 +214,10 @@ T=
# H=@: do not report hsrc file formation progress
# H=@ do echo hsrc file formation progress
#
# S= >/dev/null 2>&1 slience ${CC} output during hsrc file formation
# S= >/dev/null 2>&1 silence ${CC} output during hsrc file formation
# S= full ${CC} output during hsrc file formation
#
# E= 2>/dev/null slience command stderr during hsrc file formation
# E= 2>/dev/null silence command stderr during hsrc file formation
# E= full command stderr during hsrc file formation
#
# V=@: do not echo debug statements (quiet mode)
@@ -302,11 +297,17 @@ CALCLIBLIST=
#
CSCRIPT_TARGETS= ${SCRIPT}
TARGETS= ${CSCRIPT_TARGETS} README
#
# rules that are not also names of files
#
PHONY= all clobber distlist install
# The reason for this Makefile
#
all: ${TARGETS} .all
.PHONY: ${PHONY}
README: README.src
@${RM} -f $@
@${SED} -e "s:#!/usr/local/src/bin/calc/calc:#!${BINDIR}/calc:" $?>$@
@@ -497,7 +498,7 @@ uninstall:
continue; \
fi; \
if [ -f "${T}${SCRIPTDIR}/$$i" ]; then \
${RM} -f "${T}${SCRIPTDIR}/$$i"; \
${RM} -f "${T}${SCRIPTDIR}/$$i"; \
if [ -f "${T}${SCRIPTDIR}/$$i" ]; then \
echo "cannot uninstall ${T}${SCRIPTDIR}/$$i"; \
else \

View File

@@ -92,7 +92,7 @@ if (base_lim <= 2^20+1) { /* 2^20 requires ~96 Megs of memory */
}
/*
* remove nestest powers
* remove nearest powers
*/
while (abs(x) >= base_lim) {

View File

@@ -1,6 +1,6 @@
#!/usr/local/src/bin/calc/calc -q -p -f
/*
* sqaure - print the squares of input values
* square - print the squares of input values
*
* Copyright (C) 2000-2007,2014,2019,2021 Ernest Bowen
*

View File

@@ -1,7 +1,7 @@
/*
* custom - interface for custom software and hardware interfaces
*
* Copyright (C) 1999-2006,2018,2021 Landon Curt Noll
* Copyright (C) 1999-2006,2018,2021,2022 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
@@ -48,6 +48,7 @@
#endif /* CUSTOM */
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -77,12 +78,12 @@ custom(char *name, int count, VALUE **vals)
if (count < p->minargs) {
math_error("Too few arguments for custom "
"function \"%s\"", p->name);
/*NOTREACHED*/
not_reached();
}
if (count > p->maxargs) {
math_error("Too many arguments for custom "
"function \"%s\"", p->name);
/*NOTREACHED*/
not_reached();
}
/* call the custom function */
@@ -200,7 +201,7 @@ customhelp(char *name)
customname = (char *)malloc(snprintf_len+1);
if (customname == NULL) {
math_error("bad malloc of customname");
/*NOTREACHED*/
not_reached();
}
snprintf(customname, snprintf_len, "custhelp/%s", name);
customname[snprintf_len] = '\0'; /* paranoia */

View File

@@ -4,7 +4,7 @@ Custom calc resource files
The following custom calc resource files are provided because they serve
as examples of how use the custom interface. The custom interface
allows for machine dependent and/or non-portable code to be added as
builtins to the calc program. A few example custom functions and
built-ins to the calc program. A few example custom functions and
resource files are shipped with calc to provide you with examples.
By default, the custom builtin returns an error. Calc have been
@@ -41,7 +41,7 @@ pzasusb8.cal
Run custom("pzasusb8") on a standard set of data, print Endian
related information and print value size information.
## 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

View File

@@ -374,12 +374,12 @@ Step 5: Write your custom function
One is able to set bit 8 by way of the calc command line:
calc -D 128
calc -D 128
See the calc man page for details. One may also set that bit
while running calc by way of the config() builtin function:
config("calc_debug", 128);
config("calc_debug", 128);
See the help/config file for details on calc_debug.

File diff suppressed because it is too large Load Diff

View File

@@ -1,588 +0,0 @@
#!/bin/make
#
# custom - makefile for calc custom routines
#
# Copyright (C) 1999-2006,2014,2017-2018,2021 Landon Curt Noll
#
# SRC: custom/Makefile.head
#
# The "# SRC: ... - ..." comment line above indicates
# the origin of this file.
#
# IMPORTANT: Please see the section on Makefiles near the
# bottom of the HOWTO.INSTALL file.
#
# 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
# as published by the Free Software Foundation.
#
# Calc is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
# Public License for more details.
#
# A copy of version 2.1 of the GNU Lesser General Public License is
# distributed with calc under the filename COPYING-LGPL. You should have
# received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# Under source code control: 1997/03/09 02:28:54
# File existed as early as: 1997
#
# chongo <was here> /\oo/\ http://www.isthe.com/chongo/
# Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
#
# calculator by David I. Bell with help/mods from others
# Makefile by Landon Curt Noll
####################################################
# NOTE: Start of section from custom/Makefile.head #
####################################################
#.###############################################################.#
#.# #.#
#.# WARNING: This Makefile is generated from a combination of #.#
#.# custom/Makefile.head, Makefile.ship, and #.#
#.# custom/Makefile.tail. We recommend that you NOT #.#
#.# edit this file, but instead edit the proper source #.#
#.# file and then make custom/Makefile: #.#
#.# #.#
#.# make custom/Makefile #.#
#.# #.#
#.# See the '# NOTE .. section from ..' lines for #.#
#.# where the source file for the lines are from. #.#
#.# #.#
#.###############################################################.#
# The shell used by this Makefile
#
# On some systems, /bin/sh is a rather reduced shell with
# deprecated behavior.
#
# If your system has a up to date, bash shell, then
# you may wish to use:
#
# SHELL= /bin/bash
#
# On some systems such as macOS, the bash shell is very
# far behind to the point where is cannot be depended on.
# On such systems, the zsh may be a much better alternative
# shell for this Makefile to use:
#
# SHELL= /bin/zsh
#
SHELL= /bin/sh
#SHELL= /bin/bash
#SHELL= /bin/zsh
# PREFIX - Top level location for calc
#
# The PREFIX is often prepended to paths within calc and calc Makefiles.
#
# Starting with calc v2.13.0.1, nearly all Makefile places that used
# /usr/local now use ${PREFIX}. An exception is the olduninstall rule
# and, of course, this section. :-)
#
# NOTE: The ${PREFIX} is not the same as ${T}. The ${T} specifies
# a top level directory under which calc installs things.
# While usually ${T} is empty, it can be specific path
# as if calc where "chrooted" during an install.
# The ${PREFIX} value, during install, is a path between
# the top level ${T} install directory and the object
# such as an include file.
#
# NOTE: See also, ${T}, below.
#
# There are some paths that do NOT call under ${PREFIX}, such as
# ${CALCPATH}, that include paths not under ${PREFIX}, but those
# too are exceptions to this general rule.
#
# When in doubt, try:
#
# PREFIX= /usr/local
#
PREFIX= /usr/local
#PREFIX= /usr
#PREFIX= /usr/global
# CCBAN is given to ${CC} in order to control if banned.h is in effect.
#
# The banned.h attempts to ban the use of certain dangerous functions
# that, if improperly used, could compromise the computational integrity
# if calculations.
#
# In the case of calc, we are motivated in part by the desire for calc
# to correctly calculate: even during extremely long calculations.
#
# If UNBAN is NOT defined, then calling certain functions
# will result in a call to a non-existent function (link error).
#
# While we do NOT encourage defining UNBAN, there may be
# a system / compiler environment where re-defining a
# function may lead to a fatal compiler complication.
# If that happens, consider compiling as:
#
# make clobber all chk CCBAN=-DUNBAN
#
# as see if this is a work-a-round.
#
# If YOU discover a need for the -DUNBAN work-a-round, PLEASE tell us!
# Please send us a bug report. See the file:
#
# BUGS
#
# or the URL:
#
# http://www.isthe.com/chongo/tech/comp/calc/calc-bugrept.html
#
# for how to send us such a bug report.
#
CCBAN= -UUNBAN
#CCBAN= -DUNBAN
#if 0 /* start of skip for non-Gnu makefiles */
# Unfortunately due to the complex dependency issues between
# Makefile, Makefile.ship and custom/Makefile, parallel GNU make
# is NOT recommended. Sorry.
#
.NOTPARALLEL:
##############################################################################
#-=-=-=-=-=-=-=-=- Identify the target machine, if possible -=-=-=-=-=-=-=-=-#
##############################################################################
# NOTE: You can force a target value by defining target as in:
#
# make ...__optional_arguments_... target=value
# Try uname -s if the target was not already set on the make command line
#
ifeq ($(target),)
target=$(shell uname -s 2>/dev/null)
endif
#endif /* end of skip for non-Gnu makefiles */
##############################################################################
#-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-#
##############################################################################
# The custom calc resource files to install
#
# Put your custom calc resource files here.
#
CUSTOM_CALC_FILES= argv.cal halflen.cal pzasusb8.cal pmodm127.cal register.cal
# The custom help files to install
#
# Put your custom help files here.
#
CUSTOM_HELP= argv devnull help sysinfo pzasusb8 pmodm127 register
# Any .h files that are needed by programs that use
# libcustcalc${LIB_EXT_VERSION}
#
# Put any .h files that you add which might be useful to other
# programs here.
#
CUSTOM_H_SRC=
# Any .c files that are needed to build libcustcalc${LIB_EXT_VERSION}.
#
# Don't put ${REQUIRED_SRC} files in this list.
#
# There MUST be a .c in CUSTOM_SRC for every .o in CUSTOM_OBJ.
#
# Put your custom .c files here.
#
CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c \
c_pmodm127.c c_register.c
# Any .o files that are needed by program that use
# libcustcalc${LIB_EXT_VERSION}.
#
# Don't put ${REQUIRED_OBJ} files in this list.
#
# There MUST be a .c in CUSTOM_SRC for every .o in CUSTOM_OBJ.
#
# Put your custom .o files here.
#
CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o \
c_pmodm127.o c_register.o
##############################################################################
#-=-=-=-=-=-=- Defaults in case you want to build from this dir -=-=-=-=-=-=-#
##############################################################################
# Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory.
# Makefile debug
#
# Q=@ do not echo internal Makefile actions (quiet mode)
# Q= echo internal Makefile actions (debug / verbose mode)
#
# H=@: do not report hsrc file formation progress
# H=@ do echo hsrc file formation progress
#
# S= >/dev/null 2>&1 slience ${CC} output during hsrc file formation
# S= full ${CC} output during hsrc file formation
#
# E= 2>/dev/null slience command stderr during hsrc file formation
# E= full command stderr during hsrc file formation
#
# V=@: do not echo debug statements (quiet mode)
# V=@ do echo debug statements (debug / verbose mode)
#
#Q=
Q=@
#
S= >/dev/null 2>&1
#S=
#
E= 2>/dev/null
#E=
#
#H=@:
H=@
#
V=@:
#V=@
####
# Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory.
####
# Where the system include (.h) files are kept
#
# For DJGPP, select:
#
# INCDIR= /dev/env/DJDIR/include
#
# If in doubt, set:
#
# INCDIR= /usr/include
#
#INCDIR= ${PREFIX}/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# where to install calc related things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
# ${CALC_SHAREDIR} where to install calc help, .cal, startup, config files
#
# NOTE: The install rule prepends installation paths with ${T}, which
# by default is empty. If ${T} is non-empty, then installation
# locations will be relative to the ${T} directory.
#
# For DJGPP, select:
#
# BINDIR= /dev/env/DJDIR/bin
# LIBDIR= /dev/env/DJDIR/lib
# CALC_SHAREDIR= /dev/env/DJDIR/share/calc
#
# If in doubt, set:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= ${PREFIX}/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= ${PREFIX}/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= ${PREFIX}/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
# By default, these values are based CALC_SHAREDIR, INCDIR, BINDIR
# ---------------------------------------------------------------
# ${HELPDIR} where the help directory is installed
# ${CALC_INCDIR} where the calc include files are installed
# ${CUSTOMCALDIR} where custom *.cal files are installed
# ${CUSTOMHELPDIR} where custom help files are installed
# ${CUSTOMINCDIR} where custom .h files are installed
# ${SCRIPTDIR} where calc shell scripts are installed
#
# NOTE: The install rule prepends installation paths with ${T}, which
# by default is empty. If ${T} is non-empty, then installation
# locations will be relative to the ${T} directory.
#
# If in doubt, set:
#
# HELPDIR= ${CALC_SHAREDIR}/help
# CALC_INCDIR= ${INCDIR}/calc
# CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
# CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
# CUSTOMINCDIR= ${CALC_INCDIR}/custom
# SCRIPTDIR= ${BINDIR}/cscript
#
HELPDIR= ${CALC_SHAREDIR}/help
CALC_INCDIR= ${INCDIR}/calc
CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
CUSTOMINCDIR= ${CALC_INCDIR}/custom
SCRIPTDIR= ${BINDIR}/cscript
# T - top level directory under which calc will be installed
#
# The calc install is performed under ${T}, the calc build is
# performed under /. The purpose for ${T} is to allow someone
# to install calc somewhere other than into the system area.
#
# For example, if:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
# and if:
#
# T= /var/tmp/testing
#
# Then the installation locations will be:
#
# calc binary files: /var/tmp/testing/usr/bin
# calc link library: /var/tmp/testing/usr/lib
# calc help, .cal ...: /var/tmp/testing/usr/share/calc
# ... etc ... /var/tmp/testing/...
#
# If ${T} is empty, calc is installed under /, which is the same
# top of tree for which it was built. If ${T} is non-empty, then
# calc is installed under ${T}, as if one had to chroot under
# ${T} for calc to operate.
#
# If in doubt, use T=
#
T=
# Debug/Optimize options for ${CC} and ${LCC}
#
# Select DEBUG= -O2 -gstabs+ -DWINDOZ for DJGPP.
#
#DEBUG=
#
#DEBUG= -O
#DEBUG= -O -g
#DEBUG= -O -g3
#
#DEBUG= -O1
#DEBUG= -O1 -g
#DEBUG= -O1 -g3
#
#DEBUG= -O2
#DEBUG= -O2 -g
#DEBUG= -O2 -g3
#DEBUG= -O2 -ipa
#DEBUG= -O2 -g3 -ipa
#
#DEBUG= -O3
#DEBUG= -O3 -g
DEBUG= -O3 -g3
#DEBUG= -O3 -ipa
#DEBUG= -O3 -g3 -ipa
#
#DEBUG= -g
#DEBUG= -g3
#DEBUG= -gx
#DEBUG= -WM,-g
#
#DEBUG= -O2 -gstabs+ -DWINDOZ
# Some systems require one to use ranlib to add a symbol table to
# a *.a link library. Set RANLIB to the utility that performs this
# action. Set RANLIB to : if your system does not need such a utility.
#
RANLIB=ranlib
#RANLIB=:
# Normally certain files depend on the Makefile. If the Makefile is
# changed, then certain steps should be redone. If MAKE_FILE is
# set to Makefile, then these files will depend on Makefile. If
# MAKE_FILE is empty, then they wont.
#
# If in doubt, set MAKE_FILE to Makefile
#
MAKE_FILE= Makefile
#MAKE_FILE=
# Controlling file makefile basename (without the path)
#
# This is the basename same of the makefile that may/does/will drive
# this makefile.
#
# If in doubt, set TOP_MAKE_FILE to Makefile
#
TOP_MAKE_FILE= Makefile
# If you do not wish to use purify, set PURIFY to an empty string.
#
# If in doubt, use PURIFY=
#
#PURIFY= purify
#PURIFY= purify -m71-engine
#PURIFY= purify -logfile=pure.out
#PURIFY= purify -m71-engine -logfile=pure.out
PURIFY=
# If you want to use a debugging link library such as a malloc debug link
# library, or need to add special ld flags after the calc link libraries
# are included, set ${LD_DEBUG} below.
#
# If in doubt, set LD_DEBUG to empty.
#
#LD_DEBUG= -lmalloc_cv
LD_DEBUG=
# When doing a:
#
# make check
# make chk
# make debug
#
# the ${CALC_ENV} is used to supply the proper environment variables
# to calc. Most people will simply need 'CALCPATH=./cal' to ensure
# that these debug rules will only use calc resource files under the
# local source directory. The longer lines (with MALLOC_VERBOSE=1 ...)
# are useful for SGI IRIX people who have 'WorkShop Performance Tools'
# and who also set 'LD_DEBUG= -lmalloc_cv' above.
#
# If in doubt, use CALC_ENV= CALCPATH=./cal.
#
CALC_ENV= CALCPATH=./cal
#CALC_ENV= CALCPATH=./cal MALLOC_VERBOSE=1 MALLOC_TRACING=1 \
# MALLOC_FASTCHK=1 MALLOC_FULLWARN=1
#CALC_ENV= CALCPATH=./cal MALLOC_VERBOSE=1 MALLOC_TRACING=1 \
# MALLOC_FASTCHK=1 MALLOC_FULLWARN=1 MALLOC_CLEAR_FREE=1 \
# MALLOC_CLEAR_MALLOC=1
# By default, custom builtin functions may only be executed if calc
# is given the -C option. This is because custom builtin functions
# may invoke non-standard or non-portable code. One may completely
# disable custom builtin functions by not compiling any of code
#
# ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given
# ALLOW_CUSTOM= # disable custom even if -C is given
#
# If in doubt, use ALLOW_CUSTOM= -DCUSTOM
#
ALLOW_CUSTOM= -DCUSTOM
#ALLOW_CUSTOM=
# Some out of date operating systems require / want an executable to
# end with a certain file extension. Some compile systems such as
# Cygwin build calc as calc.exe. The EXT variable is used to denote
# the extension required by such.
#
# EXT= # normal Un*x / Linux / GNU/Linux systems
# EXT=.exe # windoz / Cygwin
#
# If in doubt, use EXT=
#
EXT=
#EXT=.exe
# The default calc versions
#
VERSION= 2.14.0.2
# Names of shared libraries with versions
#
LIB_EXT= .so
LIB_EXT_VERSION= ${LIB_EXT}.${VERSION}
# standard tools
#
AR= ar
AWK= awk
CHMOD= chmod
CMP= cmp
CO= co
CP= cp
FMT= fmt
GREP= egrep
LN= ln
MAKE= make
MAKEDEPEND= makedepend
MKDIR= mkdir
MV= mv
RM= rm
RMDIR= rmdir
SED= sed
SORT= sort
TOUCH= touch
TRUE= true
# EXTRA_CFLAGS are flags given to ${CC} when compiling C files
# EXTRA_LDFLAGS are flags given to ${CC} when linking progs
#
# Both CFLAGS and LDFLAGS are left blank in this Makefile by
# default so that users may use them on the make command line
# to always the way that C is compiled and files are linked
# respectively. For example:
#
# make all EXTRA_CFLAGS="-DMAGIC" EXTRA_LDFLAGS="-lmagic"
#
# NOTE: These should be left blank in this Makefile to make it
# easier to add stuff on the command line. If you want to
# to change the way calc is compiled by this Makefile, change
# the appropriate host target section below or a flag above.
#
EXTRA_CFLAGS=
EXTRA_LDFLAGS=
# COMMON_CFLAGS are the common ${CC} flags used for all progs, both
# intermediate and final calc and calc related progs
#
COMMON_CFLAGS= -DCALC_SRC ${ALLOW_CUSTOM} ${CCWARN} ${CCMISC} ${EXTRA_CFLAGS}
# COMMON_LDFLAGS are the common flags used for linking all progs, both
# intermediate and final calc and calc related progs
#
COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
###########################################
# Set the default compile flags for ${CC} #
###########################################
#if 0 /* start of skip for non-Gnu makefiles */
# Required flags to compile C files for calc
#
# ICFLAGS are given to ${CC} for intermediate progs used to help compile calc
# CFLAGS are given to ${CC} for calc progs other than intermediate progs
#
# NOTE: This does not work for: make-XYZ-only and BLD_TYPE != make-XYZ-only
#
ifeq ($(BLD_TYPE),calc-static-only)
ICFLAGS= ${COMMON_CFLAGS} ${CCBAN} ${CC_STATIC}
else
ICFLAGS= ${COMMON_CFLAGS} ${CCBAN} ${CC_SHARE}
endif
CFLAGS= ${ICFLAGS} ${CCOPT}
# Required flags to link files for calc
#
# ILDFLAGS for ${CC} in linking intermediate progs used to help compile calc
# LDFLAGS for ${CC} in linking calc progs other than intermediate progs
#
ILDFLAGS= ${COMMON_LDFLAGS}
LDFLAGS= ${LD_DEBUG} ${ILDFLAGS}
#endif /* end of skip for non-Gnu makefiles */
##################################################
# NOTE: End of section from custom/Makefile.head #
##################################################

View File

@@ -1,22 +1,656 @@
#!/bin/make
#
# custom - makefile for calc custom routines
#
# Copyright (C) 1999-2006,2014,2017-2018,2021 Landon Curt Noll
#
# SRC: custom/Makefile.tail
# SRC: custom/Makefile.simple - non-GNU version
#
# The "# SRC: ... - ..." comment line above indicates
# the origin of this file.
#
# IMPORTANT: Please see the section on Makefiles near the
# bottom of the HOWTO.INSTALL file.
#
# 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
# as published by the Free Software Foundation.
#
# Calc is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
# Public License for more details.
#
# A copy of version 2.1 of the GNU Lesser General Public License is
# distributed with calc under the filename COPYING-LGPL. You should have
# received a copy with calc; if not, write to Free Software Foundation, Inc.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# Under source code control: 1997/03/09 02:28:54
# File existed as early as: 1997
#
# chongo <was here> /\oo/\ http://www.isthe.com/chongo/
# Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
#
# calculator by David I. Bell with help/mods from others
# Makefile by Landon Curt Noll
####################################################
# NOTE: Start of section from custom/Makefile.tail #
####################################################
# The shell used by this Makefile
#
# On some systems, /bin/sh is a rather reduced shell with
# deprecated behavior.
#
# If your system has a up to date, bash shell, then
# you may wish to use:
#
# SHELL= /bin/bash
#
# On some systems such as macOS, the bash shell is very
# far behind to the point where is cannot be depended on.
# On such systems, the zsh may be a much better alternative
# shell for this Makefile to use:
#
# SHELL= /bin/zsh
#
SHELL= /bin/bash
#SHELL= /bin/sh
# PREFIX - Top level location for calc
#
# The PREFIX is often prepended to paths within calc and calc Makefiles.
#
# Starting with calc v2.13.0.1, nearly all Makefile places that used
# /usr/local now use ${PREFIX}. An exception is the olduninstall rule
# and, of course, this section. :-)
#
# NOTE: The ${PREFIX} is not the same as ${T}. The ${T} specifies
# a top level directory under which calc installs things.
# While usually ${T} is empty, it can be specific path
# as if calc where "chrooted" during an install.
# The ${PREFIX} value, during install, is a path between
# the top level ${T} install directory and the object
# such as an include file.
#
# NOTE: See also, ${T}, below.
#
# There are some paths that do NOT call under ${PREFIX}, such as
# ${CALCPATH}, that include paths not under ${PREFIX}, but those
# too are exceptions to this general rule.
#
# When in doubt, try:
#
# PREFIX= /usr/local
#
PREFIX= /usr/local
#PREFIX= /usr
#PREFIX= /usr/global
# CCBAN is given to ${CC} in order to control if banned.h is in effect.
#
# The banned.h attempts to ban the use of certain dangerous functions
# that, if improperly used, could compromise the computational integrity
# if calculations.
#
# In the case of calc, we are motivated in part by the desire for calc
# to correctly calculate: even during extremely long calculations.
#
# If UNBAN is NOT defined, then calling certain functions
# will result in a call to a non-existent function (link error).
#
# While we do NOT encourage defining UNBAN, there may be
# a system / compiler environment where re-defining a
# function may lead to a fatal compiler complication.
# If that happens, consider compiling as:
#
# make clobber all chk CCBAN=-DUNBAN
#
# as see if this is a work-a-round.
#
# If YOU discover a need for the -DUNBAN work-a-round, PLEASE tell us!
# Please send us a bug report. See the file:
#
# BUGS
#
# or the URL:
#
# http://www.isthe.com/chongo/tech/comp/calc/calc-bugrept.html
#
# for how to send us such a bug report.
#
CCBAN= -UUNBAN
#CCBAN= -DUNBAN
# The custom calc resource files to install
#
# Put your custom calc resource files here.
#
CUSTOM_CALC_FILES= argv.cal halflen.cal pzasusb8.cal pmodm127.cal register.cal
# The custom help files to install
#
# Put your custom help files here.
#
CUSTOM_HELP= argv devnull help sysinfo pzasusb8 pmodm127 register
# Any .h files that are needed by programs that use
# libcustcalc${LIB_EXT_VERSION}
#
# Put any .h files that you add which might be useful to other
# programs here.
#
CUSTOM_H_SRC=
# Any .c files that are needed to build libcustcalc${LIB_EXT_VERSION}.
#
# Don't put ${REQUIRED_SRC} files in this list.
#
# There MUST be a .c in CUSTOM_SRC for every .o in CUSTOM_OBJ.
#
# Put your custom .c files here.
#
CUSTOM_SRC= c_argv.c c_devnull.c c_help.c c_sysinfo.c c_pzasusb8.c \
c_pmodm127.c c_register.c
# Any .o files that are needed by program that use
# libcustcalc${LIB_EXT_VERSION}.
#
# Don't put ${REQUIRED_OBJ} files in this list.
#
# There MUST be a .c in CUSTOM_SRC for every .o in CUSTOM_OBJ.
#
# Put your custom .o files here.
#
CUSTOM_OBJ= c_argv.o c_devnull.o c_help.o c_sysinfo.o c_pzasusb8.o \
c_pmodm127.o c_register.o
##############################################################################
#-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#
#-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-#
##############################################################################
##############################################################################
#-=-=-=-=-=-=- Defaults in case you want to build from this dir -=-=-=-=-=-=-#
##############################################################################
# Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory.
# Makefile debug
#
# Q=@ do not echo internal Makefile actions (quiet mode)
# Q= echo internal Makefile actions (debug / verbose mode)
#
# H=@: do not report hsrc file formation progress
# H=@ do echo hsrc file formation progress
#
# S= >/dev/null 2>&1 silence ${CC} output during hsrc file formation
# S= full ${CC} output during hsrc file formation
#
# E= 2>/dev/null silence command stderr during hsrc file formation
# E= full command stderr during hsrc file formation
#
# V=@: do not echo debug statements (quiet mode)
# V=@ do echo debug statements (debug / verbose mode)
#
#Q=
Q=@
#
S= >/dev/null 2>&1
#S=
#
E= 2>/dev/null
#E=
#
#H=@:
H=@
#
V=@:
#V=@
####
# Normally, the upper level makefile will set these values. We provide
# a default here just in case you want to build from this directory.
####
# Where the system include (.h) files are kept
#
# For DJGPP, select:
#
# INCDIR= /dev/env/DJDIR/include
#
# If in doubt, set:
#
# INCDIR= /usr/include
#
#INCDIR= ${PREFIX}/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# where to install calc related things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
# ${CALC_SHAREDIR} where to install calc help, .cal, startup, config files
#
# NOTE: The install rule prepends installation paths with ${T}, which
# by default is empty. If ${T} is non-empty, then installation
# locations will be relative to the ${T} directory.
#
# For DJGPP, select:
#
# BINDIR= /dev/env/DJDIR/bin
# LIBDIR= /dev/env/DJDIR/lib
# CALC_SHAREDIR= /dev/env/DJDIR/share/calc
#
# If in doubt, set:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= ${PREFIX}/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= ${PREFIX}/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= ${PREFIX}/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
# By default, these values are based CALC_SHAREDIR, INCDIR, BINDIR
# ---------------------------------------------------------------
# ${HELPDIR} where the help directory is installed
# ${CALC_INCDIR} where the calc include files are installed
# ${CUSTOMCALDIR} where custom *.cal files are installed
# ${CUSTOMHELPDIR} where custom help files are installed
# ${CUSTOMINCDIR} where custom .h files are installed
# ${SCRIPTDIR} where calc shell scripts are installed
#
# NOTE: The install rule prepends installation paths with ${T}, which
# by default is empty. If ${T} is non-empty, then installation
# locations will be relative to the ${T} directory.
#
# If in doubt, set:
#
# HELPDIR= ${CALC_SHAREDIR}/help
# CALC_INCDIR= ${INCDIR}/calc
# CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
# CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
# CUSTOMINCDIR= ${CALC_INCDIR}/custom
# SCRIPTDIR= ${BINDIR}/cscript
#
HELPDIR= ${CALC_SHAREDIR}/help
CALC_INCDIR= ${INCDIR}/calc
CUSTOMCALDIR= ${CALC_SHAREDIR}/custom
CUSTOMHELPDIR= ${CALC_SHAREDIR}/custhelp
CUSTOMINCDIR= ${CALC_INCDIR}/custom
SCRIPTDIR= ${BINDIR}/cscript
# T - top level directory under which calc will be installed
#
# The calc install is performed under ${T}, the calc build is
# performed under /. The purpose for ${T} is to allow someone
# to install calc somewhere other than into the system area.
#
# For example, if:
#
# BINDIR= /usr/bin
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
# and if:
#
# T= /var/tmp/testing
#
# Then the installation locations will be:
#
# calc binary files: /var/tmp/testing/usr/bin
# calc link library: /var/tmp/testing/usr/lib
# calc help, .cal ...: /var/tmp/testing/usr/share/calc
# ... etc ... /var/tmp/testing/...
#
# If ${T} is empty, calc is installed under /, which is the same
# top of tree for which it was built. If ${T} is non-empty, then
# calc is installed under ${T}, as if one had to chroot under
# ${T} for calc to operate.
#
# If in doubt, use T=
#
T=
# Debug/Optimize options for ${CC} and ${LCC}
#
# Select DEBUG= -O2 -gstabs+ -D_WIN32 for DJGPP.
#
#DEBUG=
#
#DEBUG= -O
#DEBUG= -O -g
#DEBUG= -O -g3
#
#DEBUG= -O1
#DEBUG= -O1 -g
#DEBUG= -O1 -g3
#
#DEBUG= -O2
#DEBUG= -O2 -g
#DEBUG= -O2 -g3
#DEBUG= -O2 -ipa
#DEBUG= -O2 -g3 -ipa
#
#DEBUG= -O3
#DEBUG= -O3 -g
DEBUG= -O3 -g3
#DEBUG= -O3 -ipa
#DEBUG= -O3 -g3 -ipa
#
#DEBUG= -g
#DEBUG= -g3
#DEBUG= -gx
#DEBUG= -WM,-g
#
#DEBUG= -O2 -gstabs+ -D_WIN32
# Some systems require one to use ranlib to add a symbol table to
# a *.a link library. Set RANLIB to the utility that performs this
# action. Set RANLIB to : if your system does not need such a utility.
#
RANLIB=ranlib
#RANLIB=:
# Normally certain files depend on the Makefile. If the Makefile is
# changed, then certain steps should be redone. If MAKE_FILE is
# set to Makefile, then these files will depend on Makefile. If
# MAKE_FILE is empty, then they wont.
#
# If in doubt, set MAKE_FILE to Makefile
#
MAKE_FILE= Makefile
#MAKE_FILE=
# If you do not wish to use purify, set PURIFY to an empty string.
#
# If in doubt, use PURIFY=
#
#PURIFY= purify
#PURIFY= purify -m71-engine
#PURIFY= purify -logfile=pure.out
#PURIFY= purify -m71-engine -logfile=pure.out
PURIFY=
# If you want to use a debugging link library such as a malloc debug link
# library, or need to add special ld flags after the calc link libraries
# are included, set ${LD_DEBUG} below.
#
# If in doubt, set LD_DEBUG to empty.
#
#LD_DEBUG= -lmalloc_cv
LD_DEBUG=
# When doing a:
#
# make check
# make chk
# make debug
#
# the ${CALC_ENV} is used to supply the proper environment variables
# to calc. Most people will simply need 'CALCPATH=./cal' to ensure
# that these debug rules will only use calc resource files under the
# local source directory. The longer lines (with MALLOC_VERBOSE=1 ...)
# are useful for SGI IRIX people who have 'WorkShop Performance Tools'
# and who also set 'LD_DEBUG= -lmalloc_cv' above.
#
# If in doubt, use CALC_ENV= CALCPATH=./cal.
#
CALC_ENV= CALCPATH=./cal
#CALC_ENV= CALCPATH=./cal MALLOC_VERBOSE=1 MALLOC_TRACING=1 \
# MALLOC_FASTCHK=1 MALLOC_FULLWARN=1
#CALC_ENV= CALCPATH=./cal MALLOC_VERBOSE=1 MALLOC_TRACING=1 \
# MALLOC_FASTCHK=1 MALLOC_FULLWARN=1 MALLOC_CLEAR_FREE=1 \
# MALLOC_CLEAR_MALLOC=1
# By default, custom builtin functions may only be executed if calc
# is given the -C option. This is because custom builtin functions
# may invoke non-standard or non-portable code. One may completely
# disable custom builtin functions by not compiling any of code
#
# ALLOW_CUSTOM= -DCUSTOM # allow custom only if -C is given
# ALLOW_CUSTOM= # disable custom even if -C is given
#
# If in doubt, use ALLOW_CUSTOM= -DCUSTOM
#
ALLOW_CUSTOM= -DCUSTOM
#ALLOW_CUSTOM=
# Some out of date operating systems require / want an executable to
# end with a certain file extension. Some compile systems such as
# Cygwin build calc as calc.exe. The EXT variable is used to denote
# the extension required by such.
#
# EXT= # normal Un*x / Linux / GNU/Linux systems
# EXT=.exe # Windows / Cygwin
#
# If in doubt, use EXT=
#
EXT=
#EXT=.exe
# The default calc versions
#
VERSION= 2.14.1.1
# Names of shared libraries with versions
#
LIB_EXT= .so
LIB_EXT_VERSION= ${LIB_EXT}.${VERSION}
# standard tools
#
AR= ar
AWK= awk
CHMOD= chmod
CMP= cmp
CO= co
CP= cp
DIFF= diff
FMT= fmt
GREP= egrep
LN= ln
LS= ls
MAKE= make
MAKEDEPEND= makedepend
MKDIR= mkdir
MV= mv
RM= rm
RMDIR= rmdir
SED= sed
SORT= sort
TAIL= tail
TOUCH= touch
TRUE= true
# EXTRA_CFLAGS are flags given to ${CC} when compiling C files
# EXTRA_LDFLAGS are flags given to ${CC} when linking progs
#
# Both CFLAGS and LDFLAGS are left blank in this Makefile by
# default so that users may use them on the make command line
# to always the way that C is compiled and files are linked
# respectively. For example:
#
# make all EXTRA_CFLAGS="-DMAGIC" EXTRA_LDFLAGS="-lmagic"
#
# NOTE: These should be left blank in this Makefile to make it
# easier to add stuff on the command line. If you want to
# to change the way calc is compiled by this Makefile, change
# the appropriate host target section below or a flag above.
#
EXTRA_CFLAGS=
EXTRA_LDFLAGS=
# COMMON_CFLAGS are the common ${CC} flags used for all progs, both
# intermediate and final calc and calc related progs
#
COMMON_CFLAGS= -DCALC_SRC ${ALLOW_CUSTOM} ${CCWARN} ${CCMISC} ${EXTRA_CFLAGS}
# COMMON_LDFLAGS are the common flags used for linking all progs, both
# intermediate and final calc and calc related progs
#
COMMON_LDFLAGS= ${EXTRA_LDFLAGS}
###########################################
# Set the default compile flags for ${CC} #
###########################################
##########################################################################
#=-=-=-=-=- Be careful if you change something below this line -=-=-=-=-=#
##########################################################################
# include start from top Makefile - keep this line
######################################################
# NOTE: Start of section from the middle of Makefile #
# #
# These lines are shared in common with the lower #
# custom/Makefile. That is, until the comment line #
# that starts with '# NOTE: End of section ..' line, #
# these Makefile lines are used in BOTH Makefiles. #
######################################################
##############################################################################
#-=-=-=-=-=- host target section - targets that override defaults -=-=-=-=-=-#
##############################################################################
# Common values set in targets
#
# BLD_TYPE determines if calc is built with static and/or dynamic libs.
# Set this value to one of:
#
# BLD_TYPE= calc-dynamic-only
# BLD_TYPE= calc-static-only
#
# CC_SHARE are flags given to ${CC} to build .o files suitable for shared libs
# DEFAULT_LIB_INSTALL_PATH is where calc programs look for calc shared libs
# LD_SHARE are common flags given to ${CC} to link with shared libraries
# LIBCALC_SHLIB are flags given to ${CC} to build libcalc shared libraries
# LIBCUSTCALC_SHLIB are flags given to ${CC} to build libcustcalc shared lib
#
# NOTE: The above 5 values are unused if BLD_TYPE= calc-static-only
#
# CC_STATIC are flags given to ${CC} to build .o files suitable for static libs
# LD_STATIC are common flags given to ${CC} to link with static libraries
# LIBCALC_STATIC are flags given to ${CC} to build libcalc static libraries
# LIBCUSTCALC_STATIC are flags given to ${CC} to build libcustcalc static lib
#
# NOTE: The above 4 values are unused if BLD_TYPE= calc-dynamic-only
#
# CCOPT are flags given to ${CC} for optimization
# CCWARN are flags given to ${CC} for warning message control
#
# The following are given to ${CC}:
#
# WNO_IMPLICT
# WNO_ERROR_LONG_LONG
# WNO_LONG_LONG
#
# when compiling special .o files that may need special compile options:
#
# NOTE: These flags simply turn off certain compiler warnings,
# which is useful only when CCWERR is set to -Werror.
#
# NOTE: If your compiler does not have these -Wno files, just
# set these variables to nothing as in:
#
# WNO_IMPLICT=
# WNO_ERROR_LONG_LONG=
# WNO_LONG_LONG=
#
# CCWERR are flags given to ${CC} to make warnings fatal errors
# NOTE: CCWERR is only set in development Makefiles and must only be
# used with ${CC}, not ${LCC}. If you do not want the compiler
# to abort on warnings, then leave CCWERR blank.
# CCMISC are misc flags given to ${CC}
#
# CCBAN is given to ${CC} in order to control if banned.h is in effect.
# NOTE: See where CCBAN is defined above for details.
#
# LCC is how the C compiler is invoked on locally executed intermediate programs
# CC is how the C compiler is invoked (with an optional Purify)
#
# Specific target overrides or modifications to default values
##########################################################################
# NOTE: If your target is not supported below and the default target #
# is not suitable for your needs, please send to the: #
# #
# calc-contrib at asthe dot com #
# #
# Email address an "ifeq ($(target),YOUR_TARGET_NAME)" ... "endif" #
# set of lines so that we can consider them for the next release. #
##########################################################################
#
BLD_TYPE= calc-static-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:/lib:/usr/lib:${LIBDIR}:${PREFIX}/lib
LD_SHARE= "-Wl,-rpath,${DEFAULT_LIB_INSTALL_PATH}" \
"-Wl,-rpath-link,${DEFAULT_LIB_INSTALL_PATH}"
LIBCALC_SHLIB= -shared "-Wl,-soname,libcalc${LIB_EXT_VERSION}"
LIBCUSTCALC_SHLIB= -shared "-Wl,-soname,libcustcalc${LIB_EXT_VERSION}"
#
CC_STATIC=
LD_STATIC=
LIBCALC_STATIC=
LIBCUSTCALC_STATIC=
#
#CCWARN= -Wall
CCWARN= -Wall -Wextra -pedantic
WNO_IMPLICT= -Wno-implicit
WNO_ERROR_LONG_LONG= -Wno-error=long-long
WNO_LONG_LONG= -Wno-long-long
CCWERR=
CCOPT= ${DEBUG}
CCMISC=
#
LCC= cc
CC= ${PURIFY} ${LCC} ${CCWERR}
#
# The simple makefile forces the use of static ${CC} flags
#
# ICFLAGS are given to ${CC} for intermediate programs used to help compile calc
# CFLAGS are given to ${CC} for calc programs other than intermediate programs
# ILDFLAGS for ${CC} in linking intermediate programs used to help compile calc
# LDFLAGS for ${CC} in linking calc programs other than intermediate programs
#
ICFLAGS= ${COMMON_CFLAGS} ${CCBAN} ${CC_STATIC}
CFLAGS= ${ICFLAGS} ${CCOPT}
#
ILDFLAGS= ${COMMON_LDFLAGS} ${LD_STATIC}
LDFLAGS= ${LD_DEBUG} ${ILDFLAGS} ${LIBCALC_STATIC} ${LIBCUSTCALC_STATIC}
#
#######################################################################
#-=-=-=-=-=- end of target section - only make rules below -=-=-=-=-=-#
#######################################################################
######################################################
# NOTE: End of section from the middle of Makefile #
# #
# These lines are shared in common with the lower #
# custom/Makefile. That is, starting with the line #
# that starts with '# NOTE: End of section ..' line, #
# these Makefile lines are used in BOTH Makefiles. #
######################################################
# include end from top Makefile - keep this line
# These .c files are required for the main custom interface and
# for the custom support functions for libcustcalc${LIB_EXT_VERSION}.
#
@@ -57,8 +691,7 @@ H_SRC= ${CUSTOM_H_SRC}
# directory but are installed as help files from the help/Makefile.
#
DISTLIST= ${CUSTCALC_SRC} ${CUSTOM_CALC_FILES} ${CUSTOM_HELP} \
${INSTALL_H_SRC} CUSTOM_CAL HOW_TO_ADD ${MAKE_FILE}.head \
${MAKE_FILE}.tail
${INSTALL_H_SRC} CUSTOM_CAL HOW_TO_ADD Makefile Makefile.simple
# These files are used to make (but not built) a calc .a link library
#
@@ -78,7 +711,7 @@ TARGETS= ${BLD_TYPE} Makefile.simple
###
#
# The reason for this Makefile :-)
# The main reason for this Makefile :-)
#
###
@@ -158,21 +791,6 @@ calcliblist: ${CALCLIBLIST}
fi; \
done
#if 0 /* start of skip for non-Gnu makefiles */
Makefile.simple: ${MAKE_FILE}
${V} echo '=-=-=-=-= custom/${MAKE_FILE} start of $@ rule =-=-=-=-='
${Q} ${RM} -f $@
${Q} ${AWK} '/^#if 0/{skp=1} {if(!skp){print $$0}} /^#endif/{skp=0}' \
${MAKE_FILE} | \
${GREP} -v '#\.#' | \
${SED} -e 's;^# SRC:.*;# SRC: non-GNU Makefile via;' \
-e 's;via$$;via ${MAKE} -f ${MAKE_FILE} custom/$@;' > $@
${Q} echo >> $@
${Q} echo 'Makefile.simple:' >> $@
${Q} echo ' $${Q} if [ ! -f Makefile.simple ]; then '"\\" >> $@
${Q} echo ' $${CP} -f $${MAKE_FILE} $$@; fi' >> $@
${V} echo '=-=-=-=-= custom/${MAKE_FILE} end of $@ rule =-=-=-=-='
#endif /* end of skip for non-Gnu makefiles */
##
#
@@ -212,8 +830,8 @@ depend:
>> "skel/custom/$$i"; \
echo '#endif /* '"$$tag"' */' >> "skel/custom/$$i"; \
done
${Q} (cd ..; ${MAKE} -f ${TOP_MAKE_FILE} hsrc)
${MAKE} -f ../${TOP_MAKE_FILE} h_list 2>/dev/null | \
${Q} (cd ..; ${MAKE} -f ${MAKE_FILE} hsrc)
${MAKE} -f ../${MAKE_FILE} h_list 2>/dev/null | \
while read i; do \
if [ ! -f "../$$i" ]; then continue; fi; \
tag="`echo $$i | ${SED} 's/[\.+,:]/_/g'`"; \
@@ -223,7 +841,7 @@ depend:
>> "skel/$$i"; \
echo '#endif /* '"$$tag"' */' >> "skel/$$i"; \
done
${Q} ${RM} -f skel/custom/makedep.out
${Q} ${RM} -f skel/custom/makedep.out skel/custom/makedep.in
${Q} echo custom/skel formed
${Q} echo forming custom dependency list
${Q} :> skel/custom/makedep.out
@@ -231,7 +849,9 @@ depend:
-I../../.. -w 1 -f makedep.out -- \
${CFLAGS} -- \
${C_SRC} 2>/dev/null
${Q} ${SED} -e 's|: ../../|: |' -E -i '' -l skel/custom/makedep.out
${Q} ${CP} -f skel/custom/makedep.out skel/custom/makedep.in
${Q} ${SED} -e 's|: ../../|: |' -E < skel/custom/makedep.in | \
${GREP} -v /usr/include > skel/custom/makedep.out
-${Q} for i in ${C_SRC} /dev/null; do \
if [ X"$$i" != X"/dev/null" ]; then \
echo "$$i" | ${SED} 's/^\(.*\)\.c/\1.o: \1.c/'; \
@@ -304,9 +924,6 @@ clobber: clean
${RM} -f libcustcalc*
${RM} -rf skel
${V} echo remove files that are obsolete
#if 0 /* start of skip for non-Gnu makefiles */
${RM} -f Makefile.simple
#endif /* end of skip for non-Gnu makefiles */
-${Q} if [ -e .DS_Store ]; then \
echo ${RM} -rf .DS_Store; \
${RM} -rf .DS_Store; \
@@ -498,7 +1115,7 @@ uninstall:
continue; \
fi; \
if [ -f "${T}${CUSTOMHELPDIR}/$$i" ]; then \
${RM} -f "${T}${CUSTOMHELPDIR}/$$i"; \
${RM} -f "${T}${CUSTOMHELPDIR}/$$i"; \
if [ -f "${T}${CUSTOMHELPDIR}/$$i" ]; then \
echo "cannot uninstall ${T}${CUSTOMHELPDIR}/$$i"; \
else \
@@ -511,7 +1128,7 @@ uninstall:
continue; \
fi; \
if [ -f "${T}${CUSTOMCALDIR}/$$i" ]; then \
${RM} -f "${T}${CUSTOMCALDIR}/$$i"; \
${RM} -f "${T}${CUSTOMCALDIR}/$$i"; \
if [ -f "${T}${CUSTOMCALDIR}/$$i" ]; then \
echo "cannot uninstall ${T}${CUSTOMCALDIR}/$$i"; \
else \
@@ -524,7 +1141,7 @@ uninstall:
continue; \
fi; \
if [ -f "${T}${CUSTOMINCDIR}/$$i" ]; then \
${RM} -f "${T}${CUSTOMINCDIR}/$$i"; \
${RM} -f "${T}${CUSTOMINCDIR}/$$i"; \
if [ -f "${T}${CUSTOMINCDIR}/$$i" ]; then \
echo "cannot uninstall ${T}${CUSTOMINCDIR}/$$i"; \
else \
@@ -549,6 +1166,7 @@ uninstall:
# DO NOT DELETE THIS LINE -- make depend depends on it.
c_argv.o: ../alloc.h
c_argv.o: ../attribute.h
c_argv.o: ../banned.h
c_argv.o: ../block.h
c_argv.o: ../byteswap.h
@@ -576,6 +1194,7 @@ c_argv.o: ../value.h
c_argv.o: ../zmath.h
c_argv.o: c_argv.c
c_devnull.o: ../alloc.h
c_devnull.o: ../attribute.h
c_devnull.o: ../banned.h
c_devnull.o: ../block.h
c_devnull.o: ../byteswap.h
@@ -603,6 +1222,7 @@ c_devnull.o: ../value.h
c_devnull.o: ../zmath.h
c_devnull.o: c_devnull.c
c_help.o: ../alloc.h
c_help.o: ../attribute.h
c_help.o: ../banned.h
c_help.o: ../block.h
c_help.o: ../byteswap.h
@@ -630,6 +1250,7 @@ c_help.o: ../value.h
c_help.o: ../zmath.h
c_help.o: c_help.c
c_pmodm127.o: ../alloc.h
c_pmodm127.o: ../attribute.h
c_pmodm127.o: ../banned.h
c_pmodm127.o: ../block.h
c_pmodm127.o: ../byteswap.h
@@ -656,6 +1277,7 @@ c_pmodm127.o: ../value.h
c_pmodm127.o: ../zmath.h
c_pmodm127.o: c_pmodm127.c
c_pzasusb8.o: ../alloc.h
c_pzasusb8.o: ../attribute.h
c_pzasusb8.o: ../banned.h
c_pzasusb8.o: ../block.h
c_pzasusb8.o: ../byteswap.h
@@ -682,6 +1304,7 @@ c_pzasusb8.o: ../value.h
c_pzasusb8.o: ../zmath.h
c_pzasusb8.o: c_pzasusb8.c
c_register.o: ../alloc.h
c_register.o: ../attribute.h
c_register.o: ../banned.h
c_register.o: ../block.h
c_register.o: ../byteswap.h
@@ -709,6 +1332,7 @@ c_register.o: ../value.h
c_register.o: ../zmath.h
c_register.o: c_register.c
c_sysinfo.o: ../alloc.h
c_sysinfo.o: ../attribute.h
c_sysinfo.o: ../banned.h
c_sysinfo.o: ../block.h
c_sysinfo.o: ../byteswap.h
@@ -743,6 +1367,7 @@ c_sysinfo.o: ../zrand.h
c_sysinfo.o: ../zrandom.h
c_sysinfo.o: c_sysinfo.c
custtbl.o: ../alloc.h
custtbl.o: ../attribute.h
custtbl.o: ../banned.h
custtbl.o: ../block.h
custtbl.o: ../byteswap.h
@@ -767,7 +1392,3 @@ custtbl.o: ../str.h
custtbl.o: ../value.h
custtbl.o: ../zmath.h
custtbl.o: custtbl.c
##################################################
# NOTE: End of section from custom/Makefile.tail #
##################################################

View File

@@ -57,7 +57,7 @@ c_argv(char *UNUSED(name), int count, VALUE **vals)
{
VALUE result; /* what we will return */
ZVALUE zfilelen; /* length of a file as a ZVALUE */
NUMBER *filelen; /* pointer to length of a file as a NUMER */
NUMBER *filelen; /* pointer to length of a file as a NUMBER */
char *type; /* the name of the arg type */
int i;
@@ -103,12 +103,12 @@ c_argv(char *UNUSED(name), int count, VALUE **vals)
type = "assoc";
break;
case V_OBJ: /* address of object structure */
type = "ocject";
type = "object";
break;
case V_FILE: /* opened file id */
type = "file";
break;
case V_RAND: /* address of additive 55 random state */
case V_RAND: /* subtractive 100 random state */
type = "rand_state";
break;
case V_RANDOM: /* address of Blum random state */

View File

@@ -1,7 +1,7 @@
/*
* c_help - custom help function
*
* Copyright (C) 1999-2004,2021 Landon Curt Noll
* Copyright (C) 1999-2004,2021,2022 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,6 +39,7 @@
#include "have_unused.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -70,7 +71,7 @@ c_help(char *UNUSED(name), int UNUSED(count), VALUE **vals)
*/
if (vals[0]->v_type != V_STR) {
math_error("custom help arg 1 must be a string");
/*NOTREACHED*/
not_reached();
}
/*

View File

@@ -1,7 +1,7 @@
/*
* c_pmodm127 - calculate q mod 2^(2^127-1)
*
* Copyright (C) 2004-2007,2021 Landon Curt Noll
* Copyright (C) 2004-2007,2021,2022 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
@@ -36,6 +36,7 @@
#include "have_unused.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -88,15 +89,15 @@ c_pmodm127(char *UNUSED(name), int UNUSED(count), VALUE **vals)
result.v_type = V_NULL;
if (vals[0]->v_type != V_NUM) {
math_error("Non-numeric argument for pmodm127");
/*NOTREACHED*/
not_reached();
}
if (qisfrac(vals[0]->v_num)) {
math_error("Non-integer argument for pmodm127");
/*NOTREACHED*/
not_reached();
}
if (qisneg(vals[0]->v_num) || qiszero(vals[0]->v_num)) {
math_error("argument for pmodm127 <= 0");
/*NOTREACHED*/
not_reached();
}
/*
@@ -250,7 +251,7 @@ zmod5_or_zmod(ZVALUE *zp)
subcount++;
if (subcount > 2) {
math_error("Too many subtractions in zmod5_or_zmod");
/*NOTREACHED*/
not_reached();
}
j = modlen;
a = zp->v;

View File

@@ -1,7 +1,7 @@
/*
* c_pzasusb8 - print numerator as a string of USB8s
*
* Copyright (C) 1999-2004,2021 Ernest Bowen
* Copyright (C) 1999-2004,2021,2022 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
@@ -36,6 +36,7 @@
#include "have_unused.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -67,7 +68,7 @@ c_pzasusb8(char *UNUSED(name), int UNUSED(count), VALUE **vals)
result.v_type = V_NULL;
if (vals[0]->v_type != V_NUM) {
math_error("Non-real argument for pzasusb8");
/*NOTREACHED*/
not_reached();
}
/*

View File

@@ -1,7 +1,7 @@
/*
* c_register - set or print a custom register value
*
* Copyright (C) 2007,2021 Landon Curt Noll
* Copyright (C) 2007,2021,2022 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,6 +39,7 @@
#include "have_unused.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -90,24 +91,24 @@ c_register(char *UNUSED(name), int count, VALUE **vals)
result.v_type = V_NULL;
if (vals[0]->v_type != V_NUM) {
math_error("Non-numeric register number");
/*NOTREACHED*/
not_reached();
}
if (qisfrac(vals[0]->v_num)) {
math_error("Non-integer register number");
/*NOTREACHED*/
not_reached();
}
if (qisneg(vals[0]->v_num)) {
math_error("register number < 0");
/*NOTREACHED*/
not_reached();
}
if (! qistiny(vals[0]->v_num)) {
math_error("register is huge");
/*NOTREACHED*/
not_reached();
}
reg = qtoi(vals[0]->v_num);
if (reg > CUSTOM_REG_MAX) {
math_error("register is larger than CUSTOM_REG_MAX");
/*NOTREACHED*/
not_reached();
}
/*

View File

@@ -1,7 +1,7 @@
/*
* c_sysinfo - names and values of selected #defines
*
* Copyright (C) 1999-2007,2021 Landon Curt Noll
* Copyright (C) 1999-2007,2021,2022 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
@@ -57,6 +57,7 @@
#include "have_unused.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -208,7 +209,7 @@ STATIC struct infoname sys_info[] = {
(FULL)SBITS},
{"SBYTES", "size of additive or shuffle entry in bytes", NULL,
(FULL)SBYTES},
{"SCNT", "length of additive 55 table in FULLs", NULL,
{"SCNT", "length of subtractive 100 table in FULLs", NULL,
(FULL)SCNT},
{"SEEDXORBITS", "low bits of a55 seed devoted to xor", NULL,
(FULL)SEEDXORBITS},
@@ -301,7 +302,7 @@ c_sysinfo(char *UNUSED(name), int count, VALUE **vals)
qisfrac(vals[0]->v_num) ||
zge31b(vals[0]->v_num->num)) {
math_error("sysinfo: arg must be string, 0, 1 or 2");
/*NOTREACHED*/
not_reached();
}
/*
@@ -319,7 +320,7 @@ c_sysinfo(char *UNUSED(name), int count, VALUE **vals)
break;
default:
math_error("sysinfo: arg must be string, 0, 1 or 2");
/*NOTREACHED*/
not_reached();
}
/*
@@ -368,7 +369,7 @@ c_sysinfo(char *UNUSED(name), int count, VALUE **vals)
*/
} else {
math_error("sysinfo: arg must be string, 0, 1 or 2");
/*NOTREACHED*/
not_reached();
}
/*

View File

@@ -13,7 +13,7 @@ DESCRIPTION
This custom function will return the value:
q mod 2^(2^127-1)
q mod 2^(2^127-1)
This custom function serves as a demonstration of how to write
a custom function. It performs the equivalent of:

11
decl.h
View File

@@ -52,9 +52,9 @@
/*
* MS windoz macros
* MS Windows macros
*/
#elif defined(_WIN32) || defined(WINDOZ)
#elif defined(_WIN32) || defined(_WIN64)
/* determine which type of DLL we must generate */
@@ -94,12 +94,5 @@
#endif
/* Perform printf-style argument type checking for known compilers */
#ifdef __GNUC__
# define PRINTF_FORMAT(fmt_idx, arg_idx) __attribute__ \
((format (printf, fmt_idx, arg_idx)))
#else
# define PRINTF_FORMAT(fmt_idx, arg_idx)
#endif
#endif /* !INCLUDE_DECL_H */

53
file.c
View File

@@ -1,7 +1,7 @@
/*
* file - file I/O routines callable by users
*
* Copyright (C) 1999-2007,2018,2021 David I. Bell and Landon Curt Noll
* Copyright (C) 1999-2007,2018,2021,2022 David I. Bell and Landon Curt Noll
*
* Primary author: David I. Bell
*
@@ -46,11 +46,12 @@
#include "calcerr.h"
#include "strl.h"
#if defined(_WIN32)
#if defined(_WIN32) || defined(_WIN64)
# include <io.h>
#endif
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -179,7 +180,7 @@ file_init(void)
tname = (char *)malloc(snprintf_len+1);
if (tname == NULL) {
math_error("Out of memory for init_file");
/*NOTREACHED*/
not_reached();
}
snprintf(tname, snprintf_len, "descriptor[%d]", i);
tname[snprintf_len] = '\0'; /* paranoia */
@@ -231,7 +232,7 @@ init_fileio(FILEIO *fiop, char *name, char *mode,
fiop->name = (char *)malloc(namelen + 1);
if (fiop->name == NULL) {
math_error("No memory for filename");
/*NOTREACHED*/
not_reached();
}
}
@@ -338,7 +339,7 @@ init_fileio(FILEIO *fiop, char *name, char *mode,
* NOTE: This function will not return 0, 1 or 2 since they are
* reserved for stdin, stdout, stderr. In fact, it must not
* return 0, 1, or 2 because it will confuse those who call
* the opensearchfiile() function
* the opensearchfile() function
*/
FILEID
openid(char *name, char *mode)
@@ -367,7 +368,7 @@ openid(char *name, char *mode)
}
if (fstat(fileno(fp), &sbuf) < 0) {
math_error("bad fstat");
/*NOTREACHED*/
not_reached();
}
/* get a new FILEID */
@@ -383,7 +384,7 @@ openid(char *name, char *mode)
/*
* openpathid - open the specified abse filename, or
* openpathid - open the specified base filename, or
* relative filename along a search path
*
* given:
@@ -398,7 +399,7 @@ openid(char *name, char *mode)
* NOTE: This function will not return 0, 1 or 2 since they are
* reserved for stdin, stdout, stderr. In fact, it must not
* return 0, 1, or 2 because it will confuse those who call
* the opensearchfiile() function
* the opensearchfile() function
*/
FILEID
openpathid(char *name, char *mode, char *pathlist)
@@ -436,12 +437,12 @@ openpathid(char *name, char *mode, char *pathlist)
free(openpath);
}
math_error("bad fstat");
/*NOTREACHED*/
not_reached();
}
if (openpath == NULL) {
fclose(fp);
math_error("bad openpath");
/*NOTREACHED*/
not_reached();
}
/* get a new FILEID */
@@ -482,7 +483,7 @@ reopenid(FILEID id, char *mode, char *name)
if ((id == FILEID_STDIN) || (id == FILEID_STDOUT) ||
(id == FILEID_STDERR)) {
math_error("Cannot freopen stdin, stdout, or stderr");
/*NOTREACHED*/
not_reached();
}
/* reopen the file */
@@ -507,7 +508,7 @@ reopenid(FILEID id, char *mode, char *name)
}
if (i >= MAXFILES) {
math_error("This should not happen in reopenid");
/*NOTREACHED*/
not_reached();
}
fp = f_open(name, mode);
if (fp == NULL) {
@@ -532,7 +533,7 @@ reopenid(FILEID id, char *mode, char *name)
}
if (fstat(fileno(fp), &sbuf) < 0) {
math_error("bad fstat");
/*NOTREACHED*/
not_reached();
}
/* initialize FILEIO structure */
@@ -632,7 +633,7 @@ closeid(FILEID id)
if ((id == FILEID_STDIN) || (id == FILEID_STDOUT) ||
(id == FILEID_STDERR)) {
math_error("Cannot close stdin, stdout, or stderr");
/*NOTREACHED*/
not_reached();
}
/* get file structure */
@@ -728,7 +729,7 @@ flushid(FILEID id)
}
#if !defined(_WIN32)
#if !defined(_WIN32) && !defined(_WIN64)
int
flushall(void)
{
@@ -744,7 +745,7 @@ flushall(void)
}
return err;
}
#endif /* Windoz free systems */
#endif /* Windows free systems */
/*
@@ -832,7 +833,7 @@ readid(FILEID id, int flags, STRING **retstr)
str = (char *)malloc(n + 1);
if (str == NULL) {
math_error("Out of memory for readid");
/*NOTREACHED*/
not_reached();
}
if (n > 0)
memcpy(&str[totlen], buf, n);
@@ -926,7 +927,7 @@ printid(FILEID id, int flags)
if (get_open_pos(fp, &pos) < 0) {
if (fileno(fp) > 2)
math_str("Error while determining file position!");
math_str("Error while determining file position!");
math_chr(')');
return 0;
}
@@ -1536,7 +1537,7 @@ getloc(FILEID id, ZVALUE *res)
fp = fiop->fp;
if (fp == NULL) {
math_error("Bogus internal file pointer!");
/*NOTREACHED*/
not_reached();
}
/*
@@ -1695,7 +1696,7 @@ setloc(FILEID id, ZVALUE zpos)
if ((id == FILEID_STDIN) || (id == FILEID_STDOUT) ||
(id == FILEID_STDERR)) {
math_error("Cannot fseek stdin, stdout, or stderr");
/*NOTREACHED*/
not_reached();
}
/*
@@ -1709,7 +1710,7 @@ setloc(FILEID id, ZVALUE zpos)
fp = fiop->fp;
if (fp == NULL) {
math_error("Bogus internal file pointer!");
/*NOTREACHED*/
not_reached();
}
fiop->action = 0;
@@ -1960,7 +1961,7 @@ filesize(FILEIO *fiop)
/* return length */
if (fstat(fileno(fiop->fp), &sbuf) < 0) {
math_error("bad fstat");
/*NOTREACHED*/
not_reached();
}
return sbuf.st_size;
}
@@ -2099,7 +2100,7 @@ getscanfield(FILE *fp, BOOL skip, unsigned int width, int scannum,
str = (char *) malloc(len + 1);
if (str == NULL) {
math_error("Out of memory for scanning");
/*NOTREACHED*/
not_reached();
}
if (len)
memcpy(&str[totlen], buf, len);
@@ -2177,7 +2178,7 @@ getscanwhite(FILE *fp, BOOL skip, unsigned int width, int scannum,
str = (char *) malloc(len + 1);
if (str == NULL) {
math_error("Out of memory for scanning");
/*NOTREACHED*/
not_reached();
}
if (len)
memcpy(&str[totlen], buf, len);
@@ -2328,7 +2329,7 @@ fscanfile(FILE *fp, char *fmt, int count, VALUE **vals)
var = *vals++;
count--;
if (var->v_type != V_ADDR)
math_error("Assigning to nonvariable");
math_error("Assigning to non-variable");
var = var->v_addr;
subtype = var->v_subtype;
freevalue(var);
@@ -2721,7 +2722,7 @@ fsearch(FILEID id, char *str, ZVALUE start, ZVALUE end, ZVALUE *res)
while (k < tmp.len && tmp.v[k] == 0);
if (k == tmp.len) {
math_error("This should not happen");
/*NOTREACHED*/
not_reached();
}
tmp.v[k]--;
if (tmp.v[tmp.len - 1] == 0)

View File

@@ -59,12 +59,19 @@
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "have_string.h"
#ifdef HAVE_STRING_H
# include <string.h>
#endif
#include "decl.h"
#include "have_fpos.h"
#include "endian_calc.h"
#include "have_offscl.h"
#include "have_posscl.h"
#include "have_fpos_pos.h"
#include "alloc.h"
#include "have_unused.h"
#include "have_memmv.h"
#include "banned.h" /* include after system header <> includes */
@@ -73,7 +80,7 @@
char *program; /* our name */
int
main(int argc, char **argv)
main(int UNUSED(argc), char **argv)
{
int stsizelen; /* bit length of st_size in buf */
int fileposlen; /* bit length of FILEPOS */

1355
func.c

File diff suppressed because it is too large Load Diff

11
hash.c
View File

@@ -1,7 +1,7 @@
/*
* hash - one-way hash routines
*
* Copyright (C) 1999-2007,2021 Landon Curt Noll
* Copyright (C) 1999-2007,2021,2022 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 "hash.h"
#include "attribute.h"
#include "banned.h" /* include after system header <> includes */
@@ -94,7 +95,7 @@ hash_init(int type, HASH *state)
state = (HASH *)malloc(sizeof(HASH));
if (state == NULL) {
math_error("hash_init: cannot malloc HASH");
/*NOTREACHED*/
not_reached();
}
}
@@ -119,7 +120,7 @@ hash_init(int type, HASH *state)
if (state->chunksize > MAX_CHUNKSIZE) {
math_error(
"internal error: MAX_CHUNKSIZE is too small");
/*NOTREACHED*/
not_reached();
}
return state;
}
@@ -174,7 +175,7 @@ hash_copy(HASH *state)
hnew = (HASH *)malloc(sizeof(HASH));
if (hnew == NULL) {
math_error("hash_init: cannot malloc HASH");
/*NOTREACHED*/
not_reached();
}
/*
@@ -1048,7 +1049,7 @@ hash_value(int type, void *v, HASH *state)
default:
math_error("hashing an unknown value");
/*NOTREACHED*/
not_reached();
}
return state;
}

73
have_arc4random.c Normal file
View File

@@ -0,0 +1,73 @@
/*
* have_arc4random - Determine if we have the arc4random_buf() RNG
*
* Copyright (C) 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
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Under source code control: 2021/12/06 23:58:51
* File existed as early as: 2021
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* usage:
* have_arc4random
*
* Not all enviroments have the arc4random_buf() function,
* so this may not compile on your system.
*
* This prog outputs:
*
* HAVE_ARC4RANDOM
* defined ==> have arc4random_buf() call
* undefined ==> do not have arc4random_buf() call
*/
#include "have_stdlib.h"
#if defined(HAVE_STDLIB_H)
#include <stdlib.h>
#endif
#include <stdio.h>
#include "banned.h" /* include after system header <> includes */
#define BUFLEN (32) /* length of the buffer to fill */
int
main(void)
{
#if defined(HAVE_NO_ARC4RANDOM)
printf("#undef HAVE_ARC4RANDOM /* no */\n");
#else /* HAVE_NO_ARC4RANDOM */
/* buffer for arc4random_buf() to fill */
static char buf[BUFLEN];
arc4random_buf(buf, BUFLEN);
printf("#define HAVE_ARC4RANDOM /* yes */\n");
#endif /* HAVE_NO_ARC4RANDOM */
/* exit(0); */
return 0;
}

View File

@@ -33,7 +33,7 @@
* This prog outputs several defines:
*
* HAVE_CONST
* defined ==> ok to use const
* defined ==> OK to use const
* undefined ==> do not use const
*
* CONST

71
have_environ.c Normal file
View File

@@ -0,0 +1,71 @@
/*
* have_environ - Determine if we have the environ user environment synbol
*
* Copyright (C) 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
* as published by the Free Software Foundation.
*
* Calc is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* A copy of version 2.1 of the GNU Lesser General Public License is
* distributed with calc under the filename COPYING-LGPL. You should have
* received a copy with calc; if not, write to Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Under source code control: 2021/12/06 19:34:32
* File existed as early as: 2021
*
* chongo <was here> /\oo/\ http://www.isthe.com/chongo/
* Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
*/
/*
* usage:
* have_environ
*
* Not all enviroments have the user environment external:
*
* extern char **environ;
*
* so this may not compile on your system.
*
* This prog outputs:
*
* HAVE_ENVIRON
* defined ==> environ is an non-NULL extern symbol
* undefined ==> environ is NOT an extern symbol or is NULL
*/
#include <stdio.h>
#include "banned.h" /* include after system header <> includes */
int
main(void)
{
#if defined(HAVE_NO_ENVIRON)
printf("#undef HAVE_ENVIRON /* no */\n");
#else /* HAVE_NO_ENVIRON */
extern char **environ;
if (environ == NULL) {
printf("#define HAVE_ENVIRON /* no */\n");
} else {
printf("#define HAVE_ENVIRON /* yes */\n");
}
#endif /* HAVE_NO_ENVIRON */
/* exit(0); */
return 0;
}

View File

@@ -56,8 +56,8 @@ main(void)
printf("#define FPOS_POS_BITS %d\n", FPOS_POS_BITS);
printf("#define FPOS_POS_LEN %d\n", int(FPOS_POS_BITS/8));
# else
printf("#define FPOS_POS_BITS %d\n", sizeof(pos.__pos)*8);
printf("#define FPOS_POS_LEN %d\n", sizeof(pos.__pos));
printf("#define FPOS_POS_BITS %lu\n", sizeof(pos.__pos)*8);
printf("#define FPOS_POS_LEN %lu\n", sizeof(pos.__pos));
# endif
#else

View File

@@ -34,10 +34,9 @@
* 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
* defined ==> use clock_gettime() from CLOCK_REALTIME
* undefined ==> clock_gettime() is not available from
* CLOCK_REALTIME
*/
#include <stdio.h>
@@ -50,19 +49,13 @@
int
main(void)
{
#if defined(HAVE_NO_GETTIME)
#if defined(HAVE_NO_GETTIME) || defined(_WIN32) || defined(_WIN64)
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)
# if defined(CLOCK_REALTIME)
struct timespec realtime; /* POSIX realtime clock */
(void) clock_gettime(CLOCK_REALTIME, &realtime);
@@ -70,7 +63,7 @@ main(void)
# else
printf("#undef HAVE_GETTIME /* no - no SGI_CYCLE and no REALTIME */\n");
printf("#undef HAVE_GETTIME /* no - no CLOCK_REALTIME */\n");
# endif /* CLOCK_REALTIME */

View File

@@ -38,7 +38,7 @@
* This prog outputs several defines:
*
* HAVE_OFF_T_SCALAR
* defined ==> ok to perform arithmetic ops, = and comparisons
* defined ==> OK to perform arithmetic ops, = and comparisons
* undefined ==> convert to ZVALUE first
*/
@@ -69,7 +69,7 @@ main(void)
if (value > (off_t)1) {
--value;
}
#if !defined(_WIN32)
#if !defined(_WIN32) && !defined(_WIN64)
if (value <= (off_t)getppid()) {
--value;
}

View File

@@ -37,7 +37,7 @@
* This prog outputs several defines:
*
* HAVE_FILEPOS_SCALAR
* defined ==> ok to perform arithmetic ops, = and comparisons
* defined ==> OK to perform arithmetic ops, = and comparisons
* undefined ==> convert to ZVALUE first
*/
@@ -69,7 +69,7 @@ main(void)
if (value > (FILEPOS)1) {
--value;
}
#if !defined(_WIN32)
#if !defined(_WIN32) && !defined(_WIN64)
if (value <= (FILEPOS)getppid()) {
--value;
}

View File

@@ -152,7 +152,7 @@ main(void)
puts(" *");
puts(" * Systems that do not have vsnprintf() need something. In some");
puts(" * cases the snprintf function will deal correctly with the");
puts(" * va_alist 4th arg. Same gors for a lack of an vsnprintf()");
puts(" * va_alist 4th arg. Same goes for a lack of an vsnprintf()");
puts(" * function. In either case we use the #defines below and");
puts(" * hope for the best!");
puts(" */");

View File

@@ -33,7 +33,7 @@
* This prog outputs several defines:
*
* HAVE_UID_T
* defined ==> ok to use uid_t
* defined ==> OK to use uid_t
* undefined ==> do not use uid_t
*/
@@ -65,6 +65,8 @@ main(void)
extern uid_t geteuid();
curds = geteuid();
/* force curds to be used, but do not print much info about our UID */
printf("/* geteuid() mod 2 == %ld */\n", ((long)curds) & 0x1);
printf("#define HAVE_UID_T /* yes */\n");

View File

@@ -34,7 +34,7 @@
* This prog outputs several defines:
*
* HAVE_UNUSED
* defined ==> ok to use unused
* defined ==> OK to use unused
* undefined ==> do not use unused
*
* UNUSED

View File

@@ -141,7 +141,7 @@ main(void)
puts(" *");
puts(" * Systems that do not have vsnprintf() need something. In some");
puts(" * cases the snprintf() function will deal correctly with the");
puts(" * va_alist 4th arg. Same gors for a lack of an vsnprintf()");
puts(" * va_alist 4th arg. Same goes for a lack of an vsnprintf()");
puts(" * function. In either case we use the #defines below and");
puts(" * hope for the best!");
puts(" */");

62
help.c
View File

@@ -29,6 +29,7 @@
#include <ctype.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/errno.h>
#include "calc.h"
#include "conf.h"
@@ -39,7 +40,7 @@
#include <unistd.h>
#endif
#if defined(_WIN32)
#if defined(_WIN32) || defined(_WIN64)
# define popen _popen
# define pclose _pclose
#endif
@@ -83,6 +84,10 @@ STATIC struct help_alias {
{"show", "command"},
{"stdlib", "resource"},
{"question", "questions"},
{"dm2d", "dms2d"},
{"gm2g", "gms2g"},
{"hm2d", "hms2d"},
{"release", "releases"},
{NULL, NULL}
};
@@ -259,6 +264,7 @@ givehelp(char *type)
}
snprintf(helppath, snprintf_len, "%s/%s", calc_helpdir, type);
helppath[snprintf_len] = '\0'; /* paranoia */
errno = 0;
stream = fopen(helppath, "r");
if (stream != NULL) {
@@ -273,30 +279,42 @@ givehelp(char *type)
* open the helpfile (looking in CUSTOMHELPDIR last)
*/
} else {
char *cust_helppath; /* path to the custom help file */
size_t cust_snprintf_len; /* malloced custom snprintf buf len */
char *cust_helppath; /* path to the custom help file */
size_t cust_snprintf_len; /* malloced custom snprintf buf len */
cust_snprintf_len = strlen(calc_customhelpdir)+1+strlen(type) + 1;
cust_helppath = (char *)malloc(cust_snprintf_len+1);
if (cust_helppath == NULL) {
fprintf(stderr, "malloc failure for givehelp #1\n");
return;
}
snprintf(cust_helppath, cust_snprintf_len,
"%s/%s", calc_customhelpdir, type);
cust_helppath[cust_snprintf_len] = '\0'; /* paranoia */
stream = fopen(cust_helppath, "r");
if (stream != NULL) {
cust_snprintf_len =
strlen(calc_customhelpdir)+1+strlen(type) + 1;
cust_helppath = (char *)malloc(cust_snprintf_len+1);
if (cust_helppath == NULL) {
fprintf(stderr, "malloc failure for givehelp #1\n");
return;
}
snprintf(cust_helppath, cust_snprintf_len,
"%s/%s", calc_customhelpdir, type);
cust_helppath[cust_snprintf_len] = '\0'; /* paranoia */
errno = 0;
stream = fopen(cust_helppath, "r");
if (stream != NULL) {
/*
* we have the help file open, now display it
*/
page_file(stream);
(void) fclose(stream);
}
free(cust_helppath);
cust_helppath = NULL;
/*
* we have the help file open, now display it
*/
page_file(stream);
(void) fclose(stream);
/* unable to open help file */
} else {
fprintf(stderr, "unable to open help file: %s - %s\n",
type, strerror(errno));
}
free(cust_helppath);
cust_helppath = NULL;
#else /* CUSTOM */
/* unable to open help file */
} else {
fprintf(stderr, "unable to open help file: %s - %s\n",
type, strerror(errno));
#endif /* CUSTOM */
}

View File

@@ -2,7 +2,7 @@
#
# help - makefile for calc help files
#
# Copyright (C) 1999-2006,2017,2021 Landon Curt Noll
# Copyright (C) 1999-2006,2017,2021,2022 Landon Curt Noll
#
# SRC: help/Makefile
#
@@ -48,14 +48,18 @@
#
# On some systems such as macOS, the bash shell is very
# far behind to the point where is cannot be depended on.
# On such systems, the zsh may be a much better alternative
# On such systems, the sh may be a much better alternative
# shell for this Makefile to use:
#
# SHELL= /bin/zsh
# SHELL= /bin/sh
#
SHELL= /bin/sh
#SHELL= /bin/bash
#SHELL= /bin/zsh
SHELL= /bin/bash
#SHELL= /bin/sh
#if 0 /* start of skip for non-Gnu makefiles */
ifeq ($(target),Darwin)
SHELL:= /bin/zsh
endif
#endif /* end of skip for non-Gnu makefiles */
####
@@ -102,15 +106,6 @@ PREFIX= /usr/local
#
MAKE_FILE= Makefile
# Controlling file makefile basename (without the path)
#
# This is the basename same of the makefile that may/does/will drive
# this makefile.
#
# If in doubt, set TOP_MAKE_FILE to Makefile
#
TOP_MAKE_FILE= Makefile
# Where the system include (.h) files are kept
#
# For DJGPP, select:
@@ -220,10 +215,10 @@ T=
# H=@: do not report hsrc file formation progress
# H=@ do echo hsrc file formation progress
#
# S= >/dev/null 2>&1 slience ${CC} output during hsrc file formation
# S= >/dev/null 2>&1 silence ${CC} output during hsrc file formation
# S= full ${CC} output during hsrc file formation
#
# E= 2>/dev/null slience command stderr during hsrc file formation
# E= 2>/dev/null silence command stderr during hsrc file formation
# E= full command stderr during hsrc file formation
#
# V=@: do not echo debug statements (quiet mode)
@@ -270,7 +265,7 @@ TRUE= true
# the extension required by such.
#
# EXT= # normal Un*x / Linux / GNU/Linux systems
# EXT=.exe # windoz / Cygwin
# EXT=.exe # Windows / Cygwin
#
# If in doubt, use EXT=
#
@@ -314,7 +309,7 @@ BLT_HELP_FILES_13= bugs changes
STD_HELP_FILES_14= credit
BLT_HELP_FILES_14= contrib COPYING COPYING-LGPL questions
BLT_HELP_FILES_14= contrib COPYING COPYING-LGPL questions releases
STD_HELP_FILES_15= wishlist todo
@@ -364,32 +359,33 @@ DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd \
append appr arg argv arrow asec asech asin asinh assign atan atan2 \
atanh avg base base2 bernoulli bit blk blkcpy blkfree blocks bround \
btrunc calc_tty calclevel calcpath catalan ceil cfappr cfsim char \
cmdbuf cmp comb conj cos cosh cot coth count cp csc csch ctime d2g d2r \
delete den dereference det digit digits display dp epsilon errcount \
errmax errno error estr euler eval exp fact factor fclose fcnt feof \
ferror fflush fgetc fgetfield fgetfile fgetline fgets fgetstr fib \
files floor fopen forall fpathopen fprintf fputc fputs fputstr frac \
free freebernoulli freeeuler freeglobals freeredc freestatics frem \
freopen fscan fscanf fseek fsize ftell g2d g2r gcd gcdrem gd \
getenv hash head highbit hmean hnrmod hypot ilog ilog10 ilog2 im \
indices inputlevel insert int inverse iroot isalnum isalpha isassoc \
isatty isblk iscntrl isconfig isdefined isdigit iserror iseven isfile \
isgraph ishash isident isint islist islower ismat ismult isnull isnum \
isobj isobjtype isodd isprime isprint isptr ispunct isqrt isrand \
israndom isreal isrel issimple isspace issq isstr istype isupper \
isxdigit jacobi join lcm lcmfact lfactor ln log lowbit ltol makelist \
matdim matfill matmax matmin matsum mattrace mattrans max memsize meq \
min minv mmin mne mod modify name near newerror nextcand nextprime \
norm null num oldvalue ord param perm pfact pi pix places pmod polar \
poly pop popcnt pound power prevcand prevprime printf prompt protect \
ptest push putenv quo quomod r2d r2g rand randbit random randombit \
randperm rcin rcmul rcout rcpow rcsq re remove reverse rewind rm root \
round rsearch runtime saveval scale scan scanf search sec sech seed \
segment select sgn sha1 sin sinh size sizeof sleep sort sqrt srand \
srandom ssq stoponerror str strcasecmp strcat strcmp strcpy strerror \
strlen strncasecmp strncmp strncpy strpos strprintf strscan strscanf \
strtolower strtoupper substr sum swap system systime tail tan tanh \
test time trunc usertime version xor
cmdbuf cmp comb conj cos cosh cot coth count cp csc csch ctime d2dm \
d2dms d2g d2r delete den dereference det digit digits display dms2d dp \
epsilon errcount errmax errno error estr euler eval exp fact factor \
fclose fcnt feof ferror fflush fgetc fgetfield fgetfile fgetline fgets \
fgetstr fib files floor fopen forall fpathopen fprintf fputc fputs \
fputstr frac free freebernoulli freeeuler freeglobals freeredc \
freestatics frem freopen fscan fscanf fseek fsize ftell g2d g2gm g2gms \
g2r gcd gcdrem gd getenv gms2g h2hm h2hms hash head highbit hmean \
hms2h hnrmod hypot ilog ilog10 ilog2 im indices inputlevel insert int \
inverse iroot isalnum isalpha isassoc isatty isblk iscntrl isconfig \
isdefined isdigit iserror iseven isfile isgraph ishash isident isint \
islist islower ismat ismult isnull isnum isobj isobjtype isodd isprime \
isprint isptr ispunct isqrt isrand israndom isreal isrel issimple \
isspace issq isstr istype isupper isxdigit jacobi join lcm lcmfact \
lfactor ln log lowbit ltol makelist matdim matfill matmax matmin \
matsum mattrace mattrans max memsize meq min minv mmin mne mod modify \
name near newerror nextcand nextprime norm null num oldvalue ord param \
perm pfact pi pix places pmod polar poly pop popcnt pound power \
prevcand prevprime printf prompt protect ptest push putenv quo quomod \
r2d r2g rand randbit random randombit randperm rcin rcmul rcout rcpow \
rcsq re remove reverse rewind rm root round rsearch runtime saveval \
scale scan scanf search sec sech seed segment select sgn sha1 sin sinh \
size sizeof sleep sort sqrt srand srandom ssq stoponerror str \
strcasecmp strcat strcmp strcpy strerror strlen strncasecmp strncmp \
strncpy strpos strprintf strscan strscanf strtolower strtoupper substr \
sum swap system systime tail tan tanh test time trunc usertime version \
xor
# This list is of files that are clones of DETAIL_HELP files. They are
# built from DETAIL_HELP files.
@@ -412,6 +408,10 @@ DISTLIST= ${STD_HELP_FILES} ${DETAIL_HELP} ${MAKE_FILE} \
# These files are used to make (but not built) a calc .a link library
#
CALCLIBLIST=
#
# rules that are not also names of files
#
PHONY= all clobber distlist install
all: ${FULL_HELP_FILES} full ${DETAIL_HELP} ${DETAIL_CLONE} \
${SINGULAR_FILES} .all
@@ -425,6 +425,8 @@ all: ${FULL_HELP_FILES} full ${DETAIL_HELP} ${DETAIL_CLONE} \
${RM} -f .all
${TOUCH} .all
.PHONY: ${PHONY}
bindings: ../cal/bindings
${RM} -f $@
${CP} ../cal/bindings $@
@@ -524,7 +526,7 @@ usage: ../calc.usage
fi
../calc.usage:
(cd ..; ${MAKE} -f ${TOP_MAKE_FILE} calc.usage)
(cd ..; ${MAKE} -f ${MAKE_FILE} calc.usage)
custom_cal: ../custom/CUSTOM_CAL
${RM} -f $@
@@ -627,6 +629,18 @@ cscript: ../cscript/README
${Q} ${RM} -f $@
(cd ../cscript; ${MAKE} -f Makefile README)
releases: ../README.RELEASE
${RM} -f $@
${CP} ../README.RELEASE $@
${CHMOD} 0444 $@
-@if [ -z "${Q}" ]; then \
echo ''; \
echo '=-=-= skipping the ${CAT} of help/$@ =-=-='; \
echo ''; \
else \
${TRUE}; \
fi
full: ${FULL_HELP_FILES} ${MAKE_FILE}
${Q} echo "forming full"
${Q} ${RM} -f $@
@@ -684,7 +698,7 @@ ${SINGULAR_FILES}: ${PLURAL_FILES}
# into a stand-alone program that generates a suitable function list
# that is sandwiched between the top and bottom builtin help text.
#
# We form funclist.c by sedding out unwanted stuff from builtins table,
# We form funclist.c by sed-ing out unwanted stuff from builtins table,
# converting NUMBER* and VALUE into harmless types and converting
# the showbuiltins() function into main(). Combined with the -DFUNCLIST
# we will avoid all of the complex calc types, macros and defines and
@@ -742,14 +756,6 @@ calcliblist:
fi; \
done
# The BSDI cdrom makefile expects all help files to be pre-built. This rule
# creates these files so that the release can be shipped off to BSDI. You can
# ignore this rule.
#
bsdi: all
${RM} -f obj
${CP} obj.file obj
# These next rule help form the ${DETAIL_HELP} makefile variables above.
#
# NOTE: The ${DETAIL_HELP} list does not include special help files.
@@ -893,7 +899,7 @@ uninstall:
continue; \
fi; \
if [ -f "${T}${HELPDIR}/$$i" ]; then \
${RM} -f "${T}${HELPDIR}/$$i"; \
${RM} -f "${T}${HELPDIR}/$$i"; \
if [ -f "${T}${HELPDIR}/$$i" ]; then \
echo "cannot uninstall ${T}${HELPDIR}/$$i"; \
else \

View File

@@ -6,8 +6,8 @@ SYNOPSIS
TYPES
If x is an object of type xx, the function xx_abs has to have
been defined; this will determine the types for x, eps and
the returned value.
been defined; this will determine the types for x, eps and
the returned value.
For non-object x and eps:
@@ -44,7 +44,7 @@ LINK LIBRARY
SEE ALSO
cmp, epsilon, hypot, norm, near, obj
## 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

View File

@@ -20,8 +20,8 @@ DESCRIPTION
'w' or bit 1 for writing, 'x' or bit 0 for execution.
EXAMPLE
The system error-numbers and messages may differ for different
implementations
; ## The system error-numbers and messages may differ
; ## for different implementations
; !rm -f junk
; access("junk")
@@ -48,7 +48,7 @@ LINK LIBRARY
SEE ALSO
fopen, fclose, isfile, files
## 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

View File

@@ -18,7 +18,7 @@ DESCRIPTION
EXAMPLE
; print acot(2, 1e-5), acot(2, 1e-10), acot(2, 1e-15), acot(2, 1e-20)
.46365 .463647609 .463647609000806 .46364760900080611621
0.46365 0.463647609 0.463647609000806 0.46364760900080611621
LIMITS
none
@@ -29,7 +29,7 @@ LINK LIBRARY
SEE ALSO
asin, acos, atan, asec, acsc, epsilon
## 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

View File

@@ -20,7 +20,7 @@ DESCRIPTION
EXAMPLE
; print acoth(2, 1e-5), acoth(2, 1e-10), acoth(2, 1e-15), acoth(2, 1e-20)
.54931 .5493061443 .549306144334055 .5493061443340548457
0.54931 0.5493061443 0.549306144334055 0.5493061443340548457
LIMITS
none
@@ -31,7 +31,7 @@ LINK LIBRARY
SEE ALSO
asinh, acosh, atanh, asech, acsch, epsilon
## 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

View File

@@ -18,7 +18,7 @@ DESCRIPTION
EXAMPLE
; print acsc(2, 1e-5), acsc(2, 1e-10), acsc(2, 1e-15), acsc(2, 1e-20)
.5236 .5235987756 .523598775598299 .52359877559829887308
0.5236 0.5235987756 0.523598775598299 0.52359877559829887308
LIMITS
none
@@ -29,7 +29,7 @@ LINK LIBRARY
SEE ALSO
asin, acos, atan, asec, acot, epsilon
## 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

View File

@@ -18,10 +18,9 @@ DESCRIPTION
acsch(x) = ln((1 + sqrt(1 + x^2))/x)
EXAMPLE
; print acsch(2, 1e-5), acsch(2, 1e-10), acsch(2, 1e-15), acsch(2, 1e-20)
.48121 .4812118251 .481211825059603 .4812118250596034475
0.48121 0.4812118251 0.481211825059603 0.4812118250596034475
LIMITS
none
@@ -32,7 +31,7 @@ LINK LIBRARY
SEE ALSO
asinh, acosh, atanh, asech, acoth, epsilon
## 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

View File

@@ -33,7 +33,6 @@ DESCRIPTION
agd(z) = atanh(sin(x)/cosh(y)) + i * atan(sinh(y)/cos(x)>
EXAMPLE
; print agd(1, 1e-5), agd(1, 1e-10), agd(1, 1e-15)
1.22619 1.2261911709 1.226191170883517
@@ -45,7 +44,7 @@ EXAMPLE
-1.93237 -1.9323667197 -1.932366719745925
; print agd(1+2i, 1e-5), agd(1+2i, 1e-10)
.22751+1.42291i .2275106584+1.4229114625i
0.22751+1.42291i 0.2275106584+1.4229114625i
LIMITS
none

Some files were not shown because too many files have changed in this diff Show More