Compare commits

...

46 Commits

Author SHA1 Message Date
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
Landon Curt Noll
abf39b34b6 Release v2.14.0.2
The clean and clobber makefile rules no longer list custom/Makefile
as a dependency.

Unfortunately due to the complex dependency issues between
Makefile, Makefile.ship and custom/Makefile, parallel GNU make
is NOT recommended.  Sorry (tm Canada) :)

Fixed a few typos in CHANGES.

As a side note: We stayed v2.13.x was kept for only a short time.
The move to 2.14.x was motivated by non-compatible changes due to
the default order of CALCRC, plus some new builtin functions.

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
try it.  We just want things to become stable and well field tested
before we reach the "recommended stable" release state.
2021-09-08 14:38:20 -07:00
Landon Curt Noll
552252371f Disable parallel GNU make for now
Unfortunately due to the complex dependency issues between
Makefile, Makefile.ship and custom/Makefile, parallel GNU make
is NOT recommended.  Sorry (tm Canada) :)
2021-09-07 16:35:45 -07:00
Landon Curt Noll
7570010a04 Removed custom/Makefile dependency on clean & clobber rules 2021-09-07 15:51:30 -07:00
Landon Curt Noll
a9ee753dc6 Fixed help detail_help_list rule and DETAIL_HELP
A .bak file was accicently put into the DETAIL_HELP list.
That bogus help file was removed.

Modified the help/Makefile detail_help_list rule to remove .bak files
when forming DETAIL_HELP.
2021-09-07 13:40:19 -07:00
Landon Curt Noll
ca5a81122a Completed degree, radian, gradian builtin conversions
Updated CHANGES.

Updated help/unexpected.

Added help files for d2g(), d2r(), g2d(), g2r(), r2d(), r2g().

Added regression test code for the same functions.

Fixed a few minor typos.
2021-09-07 13:28:03 -07:00
Landon Curt Noll
554cd97145 Initial code for g2d() & d2g() builtins
We still need to add:

    help files for g2d & d2g
    regression tests for g2d & d2g
    notes in related trig help files
    note in unexpected help file
    note in CHANGES
2021-09-07 07:59:51 -07:00
Landon Curt Noll
806606f284 Initial code for g2r() & r2g() builtins
We still need to add:

    help files for g2r & r2g
    regression tests for g2r & r2g
    notes in related trig help files
    note in unexpected help file
    note in CHANGES
2021-09-07 06:58:54 -07:00
Landon Curt Noll
7c0ebc5887 Improve pi cache
Explicitly initialize static pi cache.
Use enums to identify pi cache elements.
Verify pi cache elements used have useful values.
2021-09-07 06:30:21 -07:00
Landon Curt Noll
45665f94a7 Added initial code for d2r() & r2d() builtins
We still need to add:

    help files for d2r & r2d
    regression tests for d2r & r2d
    notes in related trig help files
    note in unexpected help file
    note in CHANGES
2021-09-07 04:49:54 -07:00
Landon Curt Noll
cd736fdbd4 Release v2.14.0.0
The :-separated default CALCRC value has been reversed.
The default CALCRC was:

    ${CALC_SHAREDIR}/startup:~/.calcrc:./.calcinit

The default CALCRC is now:

    ./.calcinit:~/.calcrc:${CALC_SHAREDIR}/startup

See "help environment" for details.

Added engineering mode as per a GitHub pull request from
<GitHub user heitzmann>.  Thank you!  For example:

    ; config("mode","eng"),
    ; 10^41
	    100e39

or for example:

    ; base(1000),
    ; 2^23209-1
	    ~402.87411577898877818187e6984

For more information see:

    help base

Added regression test code for engineering mode.  Improved and
expanded regression test code related to the base() and base2()
builtin functions.

Fixed a critical bug in the above mentioned pull request where
a call to base2(1000) would make calc unstable and likely to
dump core.
2021-09-06 23:30:06 -07:00
Landon Curt Noll
f753884008 Expanded regression test code for base() and base2()
Added regression test code for engineering mode.  Improved and
expanded regression test code related to the base() and base2()
builtin functions.
2021-09-06 19:22:57 -07:00
Landon Curt Noll
1d9a4941ce Fixed critical bug in base2(1000)
Pull request #31 introduced a critical bug that caused
calc to become unstable when base2(1000) was called.

This patch fixes that bug.
2021-09-06 19:08:05 -07:00
Landon Curt Noll
5bde797ba4 Merge pull request #31 from heitzmann/engineering_mode
Add engineering output mode
2021-09-06 16:54:47 -07:00
Landon Curt Noll
ecba35fc26 Reverse default CALCRC :-order
The :-separated default CALCRC value has been reversed.
The default CALCRC was:

    ${CALC_SHAREDIR}/startup:~/.calcrc:./.calcinit

The default CALCRC is now:

    ./.calcinit:~/.calcrc:${CALC_SHAREDIR}/startup

See "help environment" for details.
2021-09-06 16:52:03 -07:00
Lucas Heitzmann Gabrielli
a4f8f367c3 Skip printing exponent when 0. 2021-06-09 13:09:33 -03:00
Lucas Heitzmann Gabrielli
41b11ab785 Add engineering output mode
Similar to scientific mode, engineering mode also displays numbers in
base 10 exponential notation, with the difference that exponents are
always multiples of 3, to facilitate the interpretation in terms of
SI prefixes.

The mode is activated in config thru "engineering" or "eng. For base
and base2, it uses the special value 1000.
2021-06-07 14:11:07 -03:00
Landon Curt Noll
3d33c6c6f4 Fix typos on CHANGES 2021-04-16 23:49:00 -07:00
Landon Curt Noll
dbd8926022 Release v2.13.0.1
Replaced /usr/local with the use of ${PREFIX} in calc Makefiles.

The ${PREFIX} is not the same as ${T}.  The ${T} specifies
a top level directory under which calc installs things.
While usally ${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.

Corrected a few more typos in Makefile comments.

Added Makefile.local, a file with a single comment.  The main
Makefile includes Makefile.local just before the first all rule.
One may overtide any Makefile setting by modifying Makefile.local.
For example, Makefile.local could force BLD_TYPE:

    HAVE_STRING_H:= YES
    HAVE_TIMES_H:= YES
    SED:= /usr/local/bin/nsed

Added ${LOC_MKF} to specify the make of the file that is
included just before the all file.  So one could place
the above override lines into a different file and call
make changing the ${LOC_MKF} value.  For example:

    make LOC_MKF=Makefile.private clobber all chk

Updated HOWTO.INSTALL to mention Makefile.local.
2021-04-16 23:26:12 -07:00
Landon Curt Noll
f7f110b686 Added make include of Makefile.local
Added Makefile.local, a file with a single comment.  The main
    Makefile includes Makefile.local just before the first all rule.
    One may overtide any Makefile setting by modifying Makefile.local.
    For example, Makefile.local could force BLD_TYPE:

        HAVE_STRING_H:= YES
        HAVE_TIMES_H:= YES
        SED:= /usr/local/bin/nsed

    Added ${LOC_MKF} to specify the make of the file that is
    included just before the all file.  So one could place
    the above override lines into a different file and call
    make changing the ${LOC_MKF} value.  For example:

        make LOC_MKF=Makefile.private clobber all chk
2021-04-11 03:43:37 -07:00
Landon Curt Noll
ebf065dcb8 Prepare for calc version 2.13.0.1
Replaced /usr/local with the use of ${PREFIX} in calc Makefiles.

    The ${PREFIX} is not the same as ${T}.  The ${T} specifies
    a top level directory under which calc installs things.
    While usally ${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.

    Corrected a few more typos in Makefile comments.
2021-04-09 12:40:51 -07:00
Landon Curt Noll
6bc0747a71 Removed bug report that was fixed in 2.13.0.0 2021-03-27 06:05:55 -07:00
Landon Curt Noll
04861939fc Release v2.13.0.0
The following are the changes in this release:

    Fixed typo (missing quotes) in the env rule.

    Fixed intendation problem in CHANGES.

    Combined 2.12.9.1 changes into the 2.12.8.2 to 2.12.9.0
    range, and thus renamed the range to 2.12.8.2 to 2.12.9.1.

    Fixed issues related to building Makefile.simple.

    Fixed how the Makefile variable MANPATH is set for macOS.

    Added a bunch of information to the near bottom of HOWTO.INSTALL
    on calc Makefiles.  This information discusses the various
    Makefiles found in the calc source.

    Added comments in various calc Makefiles about their origin.
    In particular, for Makefiles that are constructed such as
    Makefile.simple, custom/Makefile and custom/Makefile.simple
    there are comments about how they were made.

    For all calc Makefiles, including those in sub-directories,
    near the top there is now a line of the form:

	# SRC: ... some message about the origin ...

    Fixed how the calc(1) man page is installed under macOS.

    Fixed how calc man page in ${CATDIR} is formed.

    Fixed how Makefile.simple is formed.

    Fixed the #! calc script argument processing.  The initial #!
    line must end in a -f.  For example, if calc is in /usr/local/bin/calc,
    then the following would be the first line of a calc script:

	#!/usr/local/bin/calc -f
	...

    It is common that -q be usde with a calc script, so assuming the
    same /usr/local/bin/calc path:

	#!/usr/local/bin/calc -q -f
	...

    Use of -s in the #! first line of a calc script is not needed
    since -f implies -f.

    The argv() will now return values more typical of C's main().
    Before it returned one less than the number of arguments.  Now,
    for example, when calc is given 2 args, argv() will return 3.

    The value of argv(0) will be the path to calc, or in the
    case of a #! calc cscript, it will return the name of the script.

    Updated the calc man page and help/argv to reflect the
    above changes.

    Improved the formatting of the calc man page.

    Fixed the formation of the win32 sub-directory via the win32_hsrc
    Makefile rule.

    Due to incompatible changes to the argv() function, and #! calc
    scripts, we are setting the version to the next minor number:

	2.13.0
2021-03-27 05:55:50 -07:00
Landon Curt Noll
ca0aaa0c3a Fixed how Makefile.simple is formed 2021-03-26 23:27:46 -07:00
Landon Curt Noll
f5d5319a51 Fix typos 2021-03-26 22:47:55 -07:00
Landon Curt Noll
263b8a78ef Fix how calc(1) cat page, if needed, is formed 2021-03-26 22:30:19 -07:00
Landon Curt Noll
3c866367c6 Fix calc(1) man page install uncer macOS 2021-03-26 21:43:41 -07:00
Landon Curt Noll
09d7080547 Added comments in calc Makefiles
Added a bunch of information to the near bottom of HOWTO.INSTALL
    on calc Makefiles.  This information discusses the various
    Makefiles found in the calc source.

    Added comments in various calc Makefiles about their origin.
    In particular, for Makefiles that are constructed such as
    Makefile.simple, custom/Makefile and custom/Makefile.simple
    there are comments about how they were made.

    For all calc Makefiles, including those in sub-directories,
    near the top there is now a line of the form:

	# SRC: ... some message about the origin ...
2021-03-26 16:52:32 -07:00
Landon Curt Noll
f480c8c5df Cleanup CHANGES
Fixed intendation problem in CHANGES.

    Combined 2.12.9.1 changes into the 2.12.8.2 to 2.12.9.0
    range, and thus renamed the range to 2.12.8.2 to 2.12.9.1.
2021-03-26 12:04:25 -07:00
Landon Curt Noll
a230431a3b Fix missing quotes in env rule 2021-03-26 11:59:15 -07:00
72 changed files with 5317 additions and 706 deletions

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

50
BUGS
View File

@@ -116,59 +116,9 @@ of a context diff patch).
Known bugs in calc:
Under macOS, the installation of the calc man page fails.
The output of the alg_config.cal resource file is bogus.
We would welcome a replacement for this code.
Calc shell scripts do not read from stdin properly,
we all as a number of the cscript examples.
The argv() function is behaving differently
when run in calc shell script mode:
When calc is run as:
calc -s a bb ccc
and given this input on the command prompt:
print "config(\"program\")=", config("program");
print "argv()=", argv();
argc = argv();
for (i=0; i < argc; ++i) {
print "argv(":i:")=", argv(i);
}
calc prints:
config("program")= calc
argv()= 3
argv(0)= a
argv(1)= bb
argv(2)= ccc
but when it is run as a script called ./simple:
#!/usr/local/bin/calc -q -s -f
print "config(\"program\")=", config("program");
print "argv()=", argv();
argc = argv();
for (i=0; i < argc; ++i) {
print "argv(":i:")=", argv(i);
}
under Linux prints:
config("program")= /usr/bin/calc
argv()= 4
argv(0)= ./simple
argv(1)= a
argv(2)= bb
argv(3)= ccc
and under macOS simply enters into interactive mode.
We are sure some more bugs exist. When you find them, please let
us know! See the above for details on how to report and were to
Email your bug reports and hopefully patches to fix them.

403
CHANGES
View File

@@ -1,14 +1,322 @@
The following are the changes from calc version 2.12.9.1 to date:
The following are the changes from calc version 2.14.0.0 to date:
Fixed a typo typo in help/Makefile that caused the build of
2.12.9.0 to fail in a number of cases. Thanks to a report by
<GitHub user balducci>.
The :-separated default CALCRC value has been reversed.
The default CALCRC was:
Pass form Makefile variables ${Q}, ${S}, ${E}, ${H} and ${V} down
to all sub-directory Makefiles from the top level Makefile.
${CALC_SHAREDIR}/startup:~/.calcrc:./.calcinit
The default CALCRC is now:
./.calcinit:~/.calcrc:${CALC_SHAREDIR}/startup
See "help environment" for details.
Added engineering mode as per a GitHub pull request from
<GitHub user heitzmann>. Thank you! For example:
; config("mode","eng"),
; 10^41
100e39
or for example:
; base(1000),
; 2^23209-1
~402.87411577898877818187e6984
For more information see:
help base
Added regression test code for engineering mode. Improved and
expanded regression test code related to the base() and base2()
builtin functions.
Fixed a critical bug in the above mentioned pull request where
a call to base2(1000) would make calc unstable and likely to
dump core.
Added builtin functions to convert between degrees, radians
and gradians:
d2r(deg) - given degrees returns radians
g2r(grad) - given gradians returns radians
r2d(rad) - given radians returns degrees
g2d(grad) - given gradians returns degrees
r2g(rad) - given radians returns gradians
d2g(deg) - given degrees returns gradians
Add 6 functions take a 2nd optional epsilon argument.
For d2r(deg, ep), r2d(rad, ep), the optional 2nd epsilon argument controls
the precision of the internal constant pi/180.
For g2r(grad, ep), r2g(rad, ep), the optional 2nd epsilon argument controls
the precision of the internal constant pi/200.
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.
Unfortunately due to the complex dependency issues between
Makefile, Makefile.ship and custom/Makefile, parallel GNU make
is NOT recommended. Sorry (tm Canada) :)
The clean and clobber makefile rules no longer list custom/Makefile
as a dependency.
Unfortunately due to the complex dependency issues between
Makefile, Makefile.ship and custom/Makefile, parallel GNU make
is NOT recommended. Sorry (tm Canada) :)
Fixed a few typos in CHANGES.
As a side note: We stayed v2.13.x was kept for only a short time.
The move to 2.14.x was motivated by non-compatible changes due to
the default order of CALCRC, plus some new builtin functions.
More changes are likely, so we might see another v2.14.0.x release
before things are declared "recommended stable".
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 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
The following are the changes from calc version 2.12.8.2 to 2.12.9.0:
The following are the changes from calc version 2.13.0.1 to 2.13.0.1:
Replaced /usr/local with the use of ${PREFIX} in calc Makefiles.
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.
Corrected a few more typos in Makefile comments.
Added Makefile.local, a file with a single comment. The main
Makefile includes Makefile.local just before the first all rule.
One may override any Makefile setting by modifying Makefile.local.
For example, Makefile.local could force BLD_TYPE:
HAVE_STRING_H:= YES
HAVE_TIMES_H:= YES
SED:= /usr/local/bin/nsed
Added ${LOC_MKF} to specify the make of the file that is
included just before the all file. So one could place
the above override lines into a different file and call
make changing the ${LOC_MKF} value. For example:
make LOC_MKF=Makefile.private clobber all chk
Updated HOWTO.INSTALL to mention Makefile.local.
The following are the changes from calc version 2.13.0.0 to 2.13.0.0:
Fixed typo (missing quotes) in the env rule.
Fixed indentation problem in CHANGES.
Combined 2.12.9.1 changes into the 2.12.8.2 to 2.12.9.0
range, and thus renamed the range to 2.12.8.2 to 2.12.9.1.
Fixed issues related to building Makefile.simple.
Fixed how the Makefile variable MANPATH is set for macOS.
Added a bunch of information to the near bottom of HOWTO.INSTALL
on calc Makefiles. This information discusses the various
Makefiles found in the calc source.
Added comments in various calc Makefiles about their origin.
In particular, for Makefiles that are constructed such as
Makefile.simple, custom/Makefile and custom/Makefile.simple
there are comments about how they were made.
For all calc Makefiles, including those in sub-directories,
near the top there is now a line of the form:
# SRC: ... some message about the origin ...
Fixed how the calc(1) man page is installed under macOS.
Fixed how calc man page in ${CATDIR} is formed.
Fixed how Makefile.simple is formed.
Fixed the #! calc script argument processing. The initial #!
line must end in a -f. For example, if calc is in /usr/local/bin/calc,
then the following would be the first line of a calc script:
#!/usr/local/bin/calc -f
...
It is common that -q be used with a calc script, so assuming the
same /usr/local/bin/calc path:
#!/usr/local/bin/calc -q -f
...
Use of -s in the #! first line of a calc script is not needed
since -f implies -f.
The argv() will now return values more typical of C's main().
Before it returned one less than the number of arguments. Now,
for example, when calc is given 2 args, argv() will return 3.
The value of argv(0) will be the path to calc, or in the
case of a #! calc cscript, it will return the name of the script.
Updated the calc man page and help/argv to reflect the
above changes.
Improved the formatting of the calc man page.
Fixed the formation of the win32 sub-directory via the win32_hsrc
Makefile rule.
Due to incompatible changes to the argv() function, and #! calc
scripts, we are setting the version to the next minor number:
2.13.0.x
Updated BUGS file as per v2.13.0 fixes.
The following are the changes from calc version 2.12.8.2 to 2.12.9.1:
Added notes to help/unexpected about:
@@ -42,59 +350,59 @@ The following are the changes from calc version 2.12.8.2 to 2.12.9.0:
Removed the need for HAVE_UNUSED in building the have_unused.h file.
CCBAN is given to ${CC} in order to control if banned.h is in effect.
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.
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.
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).
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:
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.
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:
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:
or the URL:
http://www.isthe.com/chongo/tech/comp/calc/calc-bugrept.html
for how to send us such a bug report.
for how to send us such a bug report.
Added the building of have_ban_pragma.h, which will determine
if "#pragma GCC poison func_name" is supported. If it is not,
or of HAVE_PRAGMA_GCC_POSION=-DHAVE_NO_PRAGMA_GCC_POSION, then
banned.h will have no effect.
Added the building of have_ban_pragma.h, which will determine
if "#pragma GCC poison func_name" is supported. If it is not,
or of HAVE_PRAGMA_GCC_POSION=-DHAVE_NO_PRAGMA_GCC_POSION, then
banned.h will have no effect.
Fixed building of the have_getpgid.h file.
Fixed building of the have_getprid.h file.
Fixed building of the have_getsid.h file.
Fixed building of the have_gettime.h file.
Fixed building of the have_strdup.h file.
Fixed building of the have_ustat.h file.
Fixed building of the have_rusage.h file.
Fixed building of the have_getpgid.h file.
Fixed building of the have_getprid.h file.
Fixed building of the have_getsid.h file.
Fixed building of the have_gettime.h file.
Fixed building of the have_strdup.h file.
Fixed building of the have_ustat.h file.
Fixed building of the have_rusage.h file.
Added HAVE_NO_STRLCPY to control if we want to test if
the system has a strlcpy() function. This in turn produces
the have_strlcpy.h file wherein the symbol HAVE_STRLCPY will
be defined, or not depending if the system comes with a
strlcpy() function.
Added HAVE_NO_STRLCPY to control if we want to test if
the system has a strlcpy() function. This in turn produces
the have_strlcpy.h file wherein the symbol HAVE_STRLCPY will
be defined, or not depending if the system comes with a
strlcpy() function.
If the system does not have a strlcpy() function, we
compile our own strlcpy() function. See strl.c for details.
If the system does not have a strlcpy() function, we
compile our own strlcpy() function. See strl.c for details.
Added HAVE_NO_STRLCAT to control if we want to test if
the system has a strlcat() function. This in turn produces
@@ -123,6 +431,13 @@ The following are the changes from calc version 2.12.8.2 to 2.12.9.0:
Compile custom code, if needed, after main code is compiled.
Fixed a typo typo in help/Makefile that caused the build of
2.12.9.0 to fail in a number of cases. Thanks to a report by
<GitHub user balducci>.
Pass form Makefile variables ${Q}, ${S}, ${E}, ${H} and ${V} down
to all sub-directory Makefiles from the top level Makefile.
The following are the changes from calc version 2.12.8.1 to 2.12.8.2:
@@ -1219,12 +1534,12 @@ The following are the changes from calc version 2.12.1.10 to 2.12.2:
The custom/Makefile is now constructed from 3 parts: custom/Makefile.head,
the host target section in Makefile, and the custom/Makefile.tail.
The top level Makefile and the custom/Makefile require a GNU Make
The top level Makefile and the custom/Makefile require a GNU make
(such as gmake) or an equivalently advanced make. On many targets,
the default make is sufficient. On FreeBSD for example, one must
use gmake instead of make.
If your target system does not have GNU Make (or equivalent), then
If your target system does not have GNU make (or equivalent), then
you should try using the Makefile.simple and custom/Makefile.simple
files:

View File

@@ -1,6 +1,18 @@
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!!! #
###################################################################
# Unfortunately due to the complex dependency issues between #
# Makefile, Makefile.ship and custom/Makefile, parallel GNU make #
# is NOT recommended. Sorry (tm Canada) :) #
###################################################################
Installing calc from the bzip2-ed tarball in 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/
@@ -25,25 +37,25 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
cd /var/tmp
bunzip2 -c /usr/src/redhat/SOURCES/calc-*.tar.bz2 | tar -xvf -
1) Look at the makefile, and adjust it to suit your needs.
(1) Look at the makefile, and adjust it to suit your needs.
The top level Makefile and the custom/Makefile require a GNU
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,
one must use gmake instead of make.
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:
to be Darwin. So for macOS, one might have to do:
# for macOS users only, force the target to be darwin
# 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
If your target system does not have GNU Make (or equivalent), then
you should try using the Makefile.simple and custom/Makefile.simple
If your target system does not have a moderm Makefile (such as gmake),
then you should try using the Makefile.simple and custom/Makefile.simple
files:
mv Makefile Makefile.gmake
@@ -56,6 +68,14 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
values should work. If in doubt, follow the 'When in doubt'
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
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. !
@@ -148,7 +168,7 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
Adjust other Makefile variables as needed.
2) build calc:
(2) build calc:
The top level Makefile and the custom/Makefile require a GNU
Make (such as gmake) or an equivalently advanced make. On many
@@ -180,7 +200,7 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
make clobber
make calc-dynamic-only BLD_TYPE=calc-dynamic-only
3) test calc:
(3) test calc:
make check
@@ -191,13 +211,222 @@ Installing calc from the bzip2-ed tarball in 4 easy steps:
make chk
4) install calc:
(4) install calc:
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.
=-=
On calc Makefiles:
How to tell the origin of of a Makefile:
The "# SRC: ... - ..." comment line near the top
of the file indicates the origin of this file.
In each segment below, we indicate what the SRC
comment like will read.
SHELL= ...
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 edit the Makefile 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
Makefile
# SRC: Makefile - Our calc build environment
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.
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:
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
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
# SRC: Makefile.ship - top level Makefile
This is the main top level Makefile.
In calc packages such as RPMs, and the tar.bz2 source tarball,
Makefile.ship has been moved into 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
The Makefile.simple rule of Makefile.ship, when forming the
Makefile.simple file, removes lines from Makefile.ship between
pairs of '#if 0' AND '#endif':
#if 0
lines removed when forming Makefile.simple
...
lines removed when forming Makefile.simple
#endif
The '#if 0' AND '#endif' MUST be at the start of the line.
Any text after the '#if 0' OR '#endif' is ignored.
While they may look like a CPP directives, they are not. The
inline awk script of the Makefile.simple rule does NOT allow
them to nest:
#if 0 /* DO NOT DO THIS */
lines removed when forming Makefile.simple
...
#if 0 /* DO NOT DO THIS */
...
#endif /* DO NOT DO THIS */
...
#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
This is a non-GNU or simple Makefile designed for environments
that do not have a modern make command.
If you have a Makefile.simple file, use these commands to
form a Makefile:
if [ -f Makefile ]; then mv -f Makefile Makefile.orig; fi
cp Makefile.simple Makefile
The Makefile.simple rule from Makefile.ship is used to construct
this file from the contents of Makefile.ship.
In calc packages such as RPMs, and the tar.bz2 source the
Makefile.simple exists. In the calc GitHub repo:
https://github.com/lcn2/calc
this file does NOT exist and must be made via the Makefile.simple
make rule. Therefore, non-GNU and simple make commands are NOT
supported by the calc GitHub repo master branch. Instead, you
need to extract Makefile.simple from one of the calc tar.bz2
source tarball source from a calc source mirror:
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
This is a non-GNU or simple Makefile for the custom directory
that is designed for environments that do not have a modern make
command.
In calc packages such as RPMs, and the tar.bz2 source the
Makefile.simple exists. In the calc GitHub repo:
https://github.com/lcn2/calc
this file does NOT exist and must be made via the
custom/Makefile.simple make rule. Therefore, non-GNU and simple
make commands are NOT supported by the calc GitHub repo master
branch. Instead, you need to extract custom/Makefile.simple
from one of the calc tar.bz2 source tarball source from a calc
source mirror:
http://www.isthe.com/chongo/tech/comp/calc/calc-mirror.html
cal/Makefile
# SRC: cal/Makefile
The Makefile for the cal sub-directory.
cscript/Makefile
# SRC: cscript/Makefile
The Makefile for the cscript sub-directory.
help/Makefile
# SRC: help/Makefile
The Makefile for the help sub-directory.
## Copyright (C) 1999-2007,2021 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under

102
Makefile
View File

@@ -2,33 +2,15 @@
#
# calc - arbitrary precision calculator
#
# (Linux calc rpm building makefile)
#
# NOTE: 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 the following ways:
#
# CCWERR= -Werror
# USE_READLINE= -DUSE_READLINE
# READLINE_LIB= -lreadline -lhistory -lncurses
#
# Copyright (C) 1999-2018,2021 Landon Curt Noll
#
# The Makefile.ship makefile becomes the Makefile found in the
# calc-*.tar.bz2 bzip2 source tarball.
# SRC: Makefile - Our calc build environment
#
# This Makefile drives the makefile: Makefile.ship.
# The "# SRC: ... - ..." comment line above indicates
# the origin of this file.
#
# This makefile mostly contains critical variables (such as SHELL, MAKE, etc.)
# as well as those which we choose to override defaults found in
# Makefile.ship. Make variables unique to this Makefile start with X.
#
# This makefile contains only those critical rules (such as all, clean, etc.)
# and the common rules needed in development (such as chk, check, etc.).
# This makefile has a few special rules that are used to set the version
# string in the shipped makefiles (such as Makefile.ship).
# Copyright (C) 1999-2008,2014 Landon Curt Noll
# 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
@@ -53,11 +35,22 @@
# calculator by David I. Bell with help/mods from others
# Makefile by Landon Curt Noll
# Unfortunately due to the complex dependency issues between
# Makefile, Makefile.ship and custom/Makefile, parallel GNU make
# is NOT recommended. Sorry.
#
.NOTPARALLEL:
# 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
# The shell used by this Makefile
#
# On some systems, /bin/sh is a rather reduced shell with
# deprecated behavor.
# deprecated behavior.
#
# If your system has a up to date, bash shell, then
# you may wish to use:
@@ -71,10 +64,31 @@
#
# SHELL= /bin/zsh
#
#SHELL= /bin/sh
ifeq ($(target),Darwin)
SHELL= /bin/zsh
else
SHELL= /bin/bash
#SHELL= /bin/zsh
endif
##############################################################################
#-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-#
##############################################################################
# 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. :-)
#
# 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.
#
@@ -111,17 +125,6 @@ SHELL= /bin/bash
CCBAN= -UUNBAN
#CCBAN= -DUNBAN
# 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
##############################################################################
#-=-=-=-=-=-=-=-=- You may want to change some values below -=-=-=-=-=-=-=-=-#
##############################################################################
# Determine of the GNU-readline facility will be used instead of the
# built-in calc binding method.
#
@@ -130,28 +133,22 @@ USE_READLINE= -DUSE_READLINE
#
#READLINE_LIB=
#READLINE_LIB= -L/usr/gnu/lib -lreadline -lhistory -lncurses
#READLINE_LIB= -L/usr/local/lib -lreadline -lhistory -lncurses
#READLINE_LIB= -L${PREFIX}/lib -lreadline -lhistory -lncurses
ifeq ($(target),Darwin)
# homebrew installs readline & history libs in /usr/local/opt/readline/lib
READLINE_LIB= -L/usr/local/opt/readline/lib -lreadline -lhistory -lncurses
# homebrew installs readline & history libs in ${PREFIX}/opt/readline/lib
READLINE_LIB= -L${PREFIX}/opt/readline/lib -lreadline -lhistory -lncurses
else
READLINE_LIB= -lreadline -lhistory -lncurses
endif
#
ifeq ($(target),Darwin)
# homebrew installs readline & history *.h under /usr/local/opt/readline/include
READLINE_INCLUDE= -I/usr/local/opt/readline/include
# homebrew installs readline & history *.h under ${PREFIX}/opt/readline/include
READLINE_INCLUDE= -I${PREFIX}/opt/readline/include
else
READLINE_INCLUDE=
endif
#READLINE_INCLUDE= -I/usr/gnu/include
#READLINE_INCLUDE= -I/usr/local/include
# Where man pages are installed
#
# Under macOS, we cannot modify /usr/share/man.
#
MANDIR= /usr/local/man/man1
#READLINE_INCLUDE= -I${PREFIX}/include
# Normally certain files depend on the Makefile. If the Makefile is
# changed, then certain steps should be redone. If MAKE_FILE is
@@ -265,9 +262,9 @@ XVAR= \
EXT='${EXT}' \
H='${H}' \
MAKE_FILE='${MAKE_FILE}' \
MANDIR='${MANDIR}' \
NROFF='${NROFF}' \
Q='${Q}' \
PREFIX='${PREFIX}' \
READLINE_INCLUDE='${READLINE_INCLUDE}' \
READLINE_LIB='${READLINE_LIB}' \
RPM_TOP='${RPM_TOP}' \
@@ -757,6 +754,11 @@ Makefile.simple:
${Q} ${MAKE} ${XARG} -f ${MAKE_FILE} $@ ${XVAR}
${V} echo '=-=-=-=-= private Makefile $@ rule end =-=-=-=-='
custom/Makefile.simple:
${V} echo '=-=-=-=-= private Makefile $@ rule start =-=-=-=-='
${Q} ${MAKE} ${XARG} -f ${MAKE_FILE} $@ ${XVAR}
${V} echo '=-=-=-=-= private Makefile $@ rule end =-=-=-=-='
##
#

1
Makefile.local Normal file
View File

@@ -0,0 +1 @@
# Add below to override Makefile values (using :=) as in: HAVE_STRING_H:= YES

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
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.
@@ -126,7 +126,7 @@ recommends the following settings:
CATDIR= /dev/env/DJDIR/man/cat1
NROFF= groff
CALCPATH= .;./cal;~/.cal;${CALC_SHAREDIR};${CUSTOMCALDIR}
CALCRC= ${CALC_SHAREDIR}/startup;~/.calcrc;./.calcinit
CALCRC= ./.calcinit;~/.calcrc;${CALC_SHAREDIR}/startup
CALCPAGER= less.exe -ci
DEBUG= -O2 -gstabs+ -DWINDOZ

21
SECURITY.md Normal file
View File

@@ -0,0 +1,21 @@
# Security Policy
## Supported Versions
Use this section to tell people about which versions of your project are
currently being supported with security updates.
| Version | Supported |
| ------- | ------------------ |
| 5.1.x | :white_check_mark: |
| 5.0.x | :x: |
| 4.0.x | :white_check_mark: |
| < 4.0 | :x: |
## Reporting a Vulnerability
Use this section to tell people how to report a vulnerability.
Tell them where to go, how often they can expect to get an update on a
reported vulnerability, what to expect if the vulnerability is accepted or
declined, etc.

View File

@@ -4,6 +4,14 @@
#
# Copyright (C) 1999-2006,2017,2021 Landon Curt Noll
#
# SRC: cal/Makefile
#
# 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.
@@ -31,7 +39,7 @@
# The shell used by this Makefile
#
# On some systems, /bin/sh is a rather reduced shell with
# deprecated behavor.
# deprecated behavior.
#
# If your system has a up to date, bash shell, then
# you may wish to use:
@@ -39,7 +47,7 @@
# SHELL= /bin/bash
#
# On some systems such as macOS, the bash shell is very
# far behind to the point wehre is cannot be depended on.
# 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:
#
@@ -55,6 +63,36 @@ SHELL= /bin/sh
# a default here just in case you want to build from this directory.
####
# 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
# 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
@@ -84,11 +122,11 @@ TOP_MAKE_FILE= Makefile
# INCDIR= /usr/include
#
#INCDIR= /usr/local/include
#INCDIR= ${PREFIX}/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# where to install calc realted things
# where to install calc related things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
@@ -110,15 +148,15 @@ INCDIR= /usr/include
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= /usr/local/bin
#BINDIR= ${PREFIX}/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= /usr/local/lib
#LIBDIR= ${PREFIX}/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= /usr/local/lib/calc
#CALC_SHAREDIR= ${PREFIX}/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc

View File

@@ -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

@@ -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

@@ -775,7 +775,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()
{
@@ -1881,96 +1883,298 @@ define test_mode()
vrfy(tmp == "octal", '1620: tmp == "octal"');
vrfy(base() == 2, '1621: base() == 2');
tmp = config("mode", "real");
print '1622: tmp = config("mode", "real")';
tmp = config("mode", "eng");
print '1622: tmp = config("mode", "eng")';
vrfy(tmp == "binary", '1623: tmp == "binary"');
vrfy(base() == 1000, '1624: base() == 1000');
tmp = config("mode", "real");
print '1625: tmp = config("mode", "real")';
vrfy(tmp == "engineering", '1626: tmp == "engineering"');
tmp = base(1/3);
print '1624: tmp = base(1/3)';
print '1627: tmp = base(1/3)';
vrfy(config("mode") == "fraction",
'1625: config("mode") == "fraction"');
'1628: config("mode") == "fraction"');
tmp = base(-10);
print '1626: tmp = base(-10)';
print '1629: tmp = base(-10)';
vrfy(config("mode") == "integer",
'1627: config("mode") == "integer"');
'1630: config("mode") == "integer"');
tmp = base(10);
print '1628: tmp = base(10)';
vrfy(config("mode") == "real", '1629: config("mode") == "real"');
print '1631: tmp = base(10)';
vrfy(config("mode") == "real", '1632: config("mode") == "real"');
tmp = base(1e20);
print '1630: tmp = base(1e20)';
print '1633: tmp = base(1e20)';
vrfy(config("mode") == "scientific",
'1631: config("mode") == "scientific"');
'1634: config("mode") == "scientific"');
tmp = base(16);
print '1632: tmp = base(16)';
print '1635: tmp = base(16)';
vrfy(config("mode") == "hexadecimal", \
'1633: config("mode") == "hexadecimal"');
'1636: config("mode") == "hexadecimal"');
tmp = base(8);
print '1634: tmp = base(8)';
vrfy(config("mode") == "octal", '1635: config("mode") == "octal"');
print '1637: tmp = base(8)';
vrfy(config("mode") == "octal", '1638: config("mode") == "octal"');
tmp = base(2);
print '1636: tmp = base(2)';
vrfy(config("mode") == "binary",'1637: config("mode") == "binary"');
print '1639: tmp = base(2)';
vrfy(config("mode") == "binary",'1640: config("mode") == "binary"');
tmp = base(1000);
print '1641: tmp = base(1000)';
vrfy(config("mode") == "engineering",
'1642: config("mode") == "engineering"');
tmp = base(1/3);
print '1643: tmp = base(1/3)';
vrfy(str(0x80000000) == "2147483648", \
'1644: str(0x8000000) == \"2147483648\"');
vrfy(str(0xffffffff) == "4294967295", \
'1645: str(0xffffffff) == \"4294967295\"');
vrfy(str(3e9) == "3000000000", \
'1646: str(3e9) == \"3000000000\"');
vrfy(str(1/3) == "1/3", \
'1647: str(1/3) == \"1/3\"');
vrfy(str(2e8) == "200000000", \
'1648: str(2e8) == \"200000000"');
vrfy(str(200e6) == "200000000", \
'1649: str(200e6) == \"200000000"');
vrfy(str(0b100111) == "39", \
'1650: str(0b100111) == \"39"');
vrfy(str(07543) == "3939", \
'1651: str(07543) == \"3939"');
vrfy(str(7543) == "7543", \
'1652: str(7543) == \"7543"');
tmp = base(8);
print '1638: tmp = base(8)';
print '1653: tmp = base(8)';
vrfy(str(0x80000000) == "020000000000", \
'1639: str(0x8000000) == \"020000000000\"');
'1654: str(0x8000000) == \"020000000000\"');
vrfy(str(0xffffffff) == "037777777777", \
'1640: str(0xffffffff) == \"037777777777\"');
'1655: str(0xffffffff) == \"037777777777\"');
vrfy(str(3e9) == "026264057000", \
'1641: str(3e9) == \"026264057000\"');
'1656: str(3e9) == \"026264057000\"');
vrfy(str(1/3) == "1/3", \
'1657: str(1/3) == \"1/3\"');
vrfy(str(2e8) == "01372741000", \
'1658: str(2e8) == \"01372741000"');
vrfy(str(200e6) == "01372741000", \
'1659: str(200e6) == \"01372741000"');
vrfy(str(0b100111) == "047", \
'1660: str(0b100111) == \"047"');
vrfy(str(07543) == "07543", \
'1661: str(07543) == \"07543"');
vrfy(str(7543) == "016567", \
'1662: str(7543) == \"016567"');
tmp = base(16);
print '1642: tmp = base(16)';
print '1663: tmp = base(16)';
vrfy(str(0x80000000) == "0x80000000", \
'1643: str(0x8000000) == \"0x80000000\"');
'1664: str(0x8000000) == \"0x80000000\"');
vrfy(str(0xffffffff) == "0xffffffff", \
'1644: str(0xffffffff) == \"0xffffffff\"');
'1665: str(0xffffffff) == \"0xffffffff\"');
vrfy(str(3e9) == "0xb2d05e00", \
'1645: str(3e9) == \"0xb2d05e00\"');
'1666: str(3e9) == \"0xb2d05e00\"');
vrfy(str(1/3) == "1/3", \
'1667: str(1/3) == \"1/3\"');
vrfy(str(2e8) == "0xbebc200", \
'1668: str(2e8) == \"0xbebc200"');
vrfy(str(200e6) == "0xbebc200", \
'1669: str(200e6) == \"0xbebc200"');
vrfy(str(0b100111) == "0x27", \
'1670: str(0b100111) == \"0x27"');
vrfy(str(07543) == "0xf63", \
'1671: str(07543) == \"0xf63"');
vrfy(str(7543) == "0x1d77", \
'1672: str(7543) == \"0x1d77"');
tmp = base(2);
print '1673: tmp = base(2)';
vrfy(str(0x80000000) == "0b10000000000000000000000000000000", \
'1674: str(0x8000000) == \"0b10000000000000000000000000000000\"');
vrfy(str(0xffffffff) == "0b11111111111111111111111111111111", \
'1675: str(0xffffffff) == \"0b11111111111111111111111111111111\"');
vrfy(str(3e9) == "0b10110010110100000101111000000000", \
'1676: str(3e9) == \"0b10110010110100000101111000000000\"');
vrfy(str(1/3) == "1/0b11", \
'1677: str(1/3) == \"1/0b11\"');
vrfy(str(2e8) == "0b1011111010111100001000000000", \
'1678: str(2e8) == \"0b1011111010111100001000000000"');
vrfy(str(200e6) == "0b1011111010111100001000000000", \
'1679: str(200e6) == \"0b1011111010111100001000000000"');
vrfy(str(0b100111) == "0b100111", \
'1680: str(0b100111) == \"0b100111"');
vrfy(str(07543) == "0b111101100011", \
'1681: str(07543) == \"0b111101100011"');
vrfy(str(7543) == "0b1110101110111", \
'1682: str(7543) == \"0b1110101110111"');
tmp = base(1e20);
print '1683: tmp = base(1e20)';
vrfy(str(0x80000000) == "2.147483648e9", \
'1684: str(0x8000000) == \"2.147483648e9\"');
vrfy(str(0xffffffff) == "4.294967295e9", \
'1685: str(0xffffffff) == \"4.294967295e9\"');
vrfy(str(3e9) == "3e9", \
'1686: str(3e9) == \"3e9\"');
vrfy(str(1/3) == "~3.33333333333333333333e-1", \
'1687: str(1/3) == \"~3.33333333333333333333e-1\"');
vrfy(str(2e8) == "2e8", \
'1688: str(2e8) == \"2e8"');
vrfy(str(200e6) == "2e8", \
'1689: str(200e6) == \"2e8"');
vrfy(str(0b100111) == "3.9e1", \
'1690: str(0b100111) == \"3.9e1"');
vrfy(str(07543) == "3.939e3", \
'1691: str(07543) == \"3.939e3"');
vrfy(str(7543) == "7.543e3", \
'1692: str(7543) == \"7.543e3"');
tmp = base(1000);
print '1693: tmp = base(1000)';
vrfy(str(0x80000000) == "2.147483648e9", \
'1694: str(0x8000000) == \"2.147483648e9"');
vrfy(str(0xffffffff) == "4.294967295e9", \
'1695: str(0xffffffff) == \"4.294967295e9\"');
vrfy(str(3e9) == "3e9", \
'1696: str(3e9) == \"3e9\"');
vrfy(str(1/3) == "~333.33333333333333333333e-3", \
'1697: str(1/3) == \"~333.33333333333333333333e-3\"');
vrfy(str(2e8) == "200e6", \
'1698: str(2e8) == \"200e6"');
vrfy(str(200e6) == "200e6", \
'1699: str(200e6) == \"200e6"');
vrfy(str(0b100111) == "39", \
'1700: str(0b100111) == \"39"');
vrfy(str(07543) == "3.939e3", \
'1701: str(07543) == \"3.939e3"');
vrfy(str(7543) == "7.543e3", \
'1702: str(7543) == \"7.543e3"');
tmp = base(-10);
print '1703: tmp = base(-10)';
vrfy(str(0x80000000) == "2147483648", \
'1704: str(0x8000000) == \"2147483648\"');
vrfy(str(0xffffffff) == "4294967295", \
'1705: str(0xffffffff) == \"4294967295\"');
vrfy(str(3e9) == "3000000000", \
'1706: str(3e9) == \"3000000000\"');
vrfy(str(1/3) == "~0", \
'1707: str(1/3) == \"~0\"');
vrfy(str(2e8) == "200000000", \
'1708: str(2e8) == \"200000000"');
vrfy(str(200e6) == "200000000", \
'1709: str(200e6) == \"200000000"');
vrfy(str(0b100111) == "39", \
'1710: str(0b100111) == \"39"');
vrfy(str(07543) == "3939", \
'1711: str(07543) == \"3939"');
vrfy(str(7543) == "7543", \
'1712: str(7543) == \"7543"');
tmp = base(10);
print '1646: tmp = base(10)';
vrfy(config("mode") == "real", \
'1647: config("mode") == "real"');
print '1713: tmp = base(10)';
vrfy(str(0x80000000) == "2147483648", \
'1648: str(0x80000000) == \"2147483648\"');
'1714: str(0x8000000) == \"2147483648\"');
vrfy(str(0xffffffff) == "4294967295", \
'1649: str(0xffffffff) == \"4294967295\"');
'1715: str(0xffffffff) == \"4294967295\"');
vrfy(str(3e9) == "3000000000", \
'1650: str(3e9) == \"3000000000\"');
'1716: str(3e9) == \"3000000000\"');
vrfy(str(1/3) == "~0.33333333333333333333", \
'1717: str(1/3) == \"~0.33333333333333333333"');
vrfy(str(2e8) == "200000000", \
'1718: str(2e8) == \"200000000"');
vrfy(str(200e6) == "200000000", \
'1719: str(200e6) == \"200000000"');
vrfy(str(0b100111) == "39", \
'1720: str(0b100111) == \"39"');
vrfy(str(07543) == "3939", \
'1721: str(07543) == \"3939"');
vrfy(str(7543) == "7543", \
'1722: str(7543) == \"7543"');
/* test base2() functionality */
vrfy(base2() == 0, '1651: base2() == 0');
vrfy(base2(0) == 0, '1652: base2(0) == 0');
vrfy(base2() == 0, '1653: base2() == 0');
vrfy(base2(16) == 0, '1654: base2(16) == 0');
vrfy(base2() == 16, '1655: base2() == 16');
vrfy(str(3e9) == "3000000000 /* 0xb2d05e00 */",
'1656: str(3e9) == "3000000000 /* 0xb2d05e00 */"');
vrfy(base2(1/3) == 16, '1657: base2(16) == 16');
vrfy(str(23209) == "23209 /* 23209 */",
'1658: str(23209) == "23209 /* 23209 */"');
vrfy(str(3/2) == "1.5 /* 3/2 */",
'1659: str(3/2) == "1.5 /* 3/2 */"');
vrfy(base() == 10, '1660: base() == 10');
vrfy(base2(0) == 1/3, '1661: base2(0) == 1/3');
vrfy(base2() == 0, '1723: base2() == 0');
vrfy(base2(0) == 0, '1724: base2(0) == 0');
vrfy(base2() == 0, '1725: base2() == 0');
print '1662: Ending mode/base test';
vrfy(base2(16) == 0, '1726: base2(16) == 0');
vrfy(base2() == 16, '1727: base2() == 16');
vrfy(str(3e9) == "3000000000 /* 0xb2d05e00 */",
'1728: str(3e9) == "3000000000 /* 0xb2d05e00 */"');
vrfy(base2(1/3) == 16, '1728: base2(16) == 16');
vrfy(base2() == 1/3, '1729: base2() == 1/3');
vrfy(str(23209) == "23209 /* 23209 */",
'1730: str(23209) == "23209 /* 23209 */"');
vrfy(str(3/2) == "1.5 /* 3/2 */",
'1731: str(3/2) == "1.5 /* 3/2 */"');
vrfy(base2(8) == 1/3, '1732: base2(8) == 1/3');
vrfy(base2() == 8, '1733: base2() == 8');
vrfy(str(23209) == "23209 /* 055251 */",
'1734: str(23209) == "23209 /* 055251 */"');
vrfy(str(3/2) == "1.5 /* 3/2 */",
'1735: str(3/2) == "1.5 /* 3/2 */"');
vrfy(base2(2) == 8, '1736: base2(2) == 8');
vrfy(base2() == 2, '1737: base2() == 2');
vrfy(str(23209) == "23209 /* 0b101101010101001 */",
'1738: str(23209) == "23209 /* 0b101101010101001 */"');
vrfy(str(3/2) == "1.5 /* 0b11/0b10 */",
'1739: str(3/2) == "1.5 /* 0b11/0b10 */"');
vrfy(base2(1e20) == 2, '1740: base2(1e20) == 2');
vrfy(base2() == 1e20, '1741: base2() == 1e20');
vrfy(str(23209) == "23209 /* 2.3209e4 */",
'1742: str(23209) == "23209 /* 2.3209e4 */"');
vrfy(str(3/2) == "1.5 /* 1.5 */",
'1743: str(3/2) == "1.5 /* 1.5 */"');
vrfy(base2(-10) == 1e20, '1744: base2(-10) == 1e20');
vrfy(base2() == -10, '1745: base2() == -10');
vrfy(str(23209) == "23209 /* 23209 */",
'1746: str(23209) == "23209 /* 23209 */"');
vrfy(str(3/2) == "1.5 /* ~2 */",
'1747: str(3/2) == "1.5 /* ~2 */"');
vrfy(base2(1000) == -10, '1748: base2(1000) == -1000');
vrfy(base2() == 1000, '1749: base2() == 1000');
vrfy(str(23209) == "23209 /* 23.209e3 */",
'1750: str(23209) == "23209 /* 23.209e3 */"');
vrfy(str(3/2) == "1.5 /* 1.5 */",
'1751: str(3/2) == "1.5 /* 1.5 */"');
vrfy(base2(10) == 1000, '1752: base2(10) == 1000');
vrfy(base2() == 10, '1753: base2() == 10');
vrfy(str(23209) == "23209 /* 23209 */",
'1754: str(23209) == "23209 /* 23209 */"');
vrfy(str(3/2) == "1.5 /* 1.5 */",
'1755: str(3/2) == "1.5 /* 1.5 */"');
vrfy(base2(0) == 10, '1756: base2(0) == 10');
vrfy(base2() == 0, '1757: base2() == 0');
vrfy(str(23209) == "23209",
'1758: str(23209) == "23209"');
vrfy(str(3/2) == "1.5",
'1759: str(3/2) == "1.5"');
vrfy(base() == 10, '1760: base() == 10');
vrfy(base2() == 0, '1761: base2() == 0');
print '1762: Ending mode/base test';
}
print '026: parsed test_mode()';
/*
* The 1700's contain tests for reading resource files. These tests are
* done inline near the bottom.
* The 1780's and 1790's contain tests for reading resource files.
*
* These tests are done inline near the bottom.
*/
@@ -3198,9 +3402,11 @@ define test_trig()
print '3400: Beginning test_trig';
/* test 3401-3407 */
tnum = test3400(1, 3401);
vrfy(tnum == 3407, '3407: tnum == 3407');
print tnum: ': Ending test_trig';
print '3438: Ending test_trig';
}
print '051: parsed test_trig()';
@@ -7635,31 +7841,31 @@ print;
return test_mode();
print;
print '1700: Beginning read test';
print '1780: Beginning read test';
value = 0;
vrfy(value == 0, '1701: value == 0');
vrfy(value == 0, '1781: value == 0');
read "test1700";
print '1702: read "test1700";';
vrfy(value == 1, '1703: value == 1');
print '1782: read "test1700";';
vrfy(value == 1, '1783: value == 1');
read -once "test1700";
print '1704: read -once "test1700";';
vrfy(value == 1, '1705: value == 1');
print '1784: read -once "test1700";';
vrfy(value == 1, '1785: value == 1');
read "test1700.cal";
print '1706: read "test1700.cal";';
vrfy(value == 2, '1707: value == 2');
read -once "test1700.cal";
print '1708: read -once "test1700.cal";';
vrfy(value == 2, '1709: value == 2');
print '1786: read "test1700.cal";';
vrfy(value == 2, '1787: value == 2');
read -once "test1700.cal"
print '1788: read -once "test1700.cal";';
vrfy(value == 2, '1789: value == 2');
read "test1700.cal";
print '1710: read "test1700.cal";';
vrfy(value == 3, '1711: value == 3');
print '1790: read "test1700.cal";';
vrfy(value == 3, '1791: value == 3');
{++value;} read "test1700.cal";
print '1712: {++value;} read "test1700.cal";';
vrfy(value == 5, '1713: value == 5');
print '1792: {++value;} read "test1700.cal";';
vrfy(value == 5, '1793: value == 5');
{++value;} read -once "test1700.cal";
print '1714: {++value;} read -once "test1700.cal";';
vrfy(value == 6, '1715: value == 6');
print '1716: Ending read test';
print '1794: {++value;} read -once "test1700.cal";';
vrfy(value == 6, '1795: value == 6');
print '1796: Ending read test';
print;
return test_obj();
@@ -7963,6 +8169,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()
{
@@ -8076,6 +8284,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

@@ -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){

50
calc.c
View File

@@ -123,6 +123,11 @@ main(int argc, char **argv)
* parse args
*/
program = argv[0];
script_name = strdup(argv[0]);
if (script_name == NULL) {
fprintf(stderr, "%s: failed to strdup(argv[0])\n", program);
exit(1);
}
cmdbuf[0] = '\0';
cmdlen = 0;
@@ -399,19 +404,35 @@ main(int argc, char **argv)
}
}
bp = cmdbuf + cmdlen;
/*
* duplicate -f filename arg
* as a new script_name value
*/
if (script_name != NULL) {
free(script_name);
}
script_name = NULL;
script_name = strdup(cp);
if (script_name == NULL) {
fprintf(stderr,
"strdup(-f argument)"
"failed\n");
exit(17);
}
/* process -f filename arg */
if (haveendstr) {
len = strlen(cp);
if (len == 0) {
fprintf(stderr,
"Null"
" filename!");
exit(17);
" filename!\n");
exit(18);
}
if (cmdlen + len + 2 > MAXCMD) {
fprintf(stderr,
"Commands too"
" long");
exit(18);
" long\n");
exit(19);
}
/* XXX - what if *cp = '\''? */
*bp++ = '\'';
@@ -423,10 +444,10 @@ main(int argc, char **argv)
} else {
do {
if (cmdlen > MAXCMD) {
fprintf(stderr,
"Commands"
" too long");
exit(19);
fprintf(stderr,
"Commands"
" too long\n");
exit(20);
}
*bp++ = *cp++;
cmdlen++;
@@ -439,7 +460,10 @@ main(int argc, char **argv)
*bp++ = ';';
*bp = '\0';
cmdlen++;
s_flag = TRUE; /* -f implies -s */
/* -f implies -s */
s_flag = TRUE;
maxindex = index + 1;
break;
case 's':
@@ -462,7 +486,7 @@ main(int argc, char **argv)
"usage: %s ... -f filename\n"
"1st cscript line: #/path/to/calc ... -s -f\n",
program, program);
exit(20);
exit(21);
}
if (havearg)
break;
@@ -488,7 +512,7 @@ main(int argc, char **argv)
fprintf(stderr,
"%s: commands too long\n",
program);
exit(21);
exit(22);
}
strlcpy(cmdbuf + cmdlen, cp, cplen+1);
cmdbuf[newcmdlen] = '\0';
@@ -511,7 +535,7 @@ main(int argc, char **argv)
}
}
argc_value = argc - maxindex;
argc_value = argc - maxindex + 1;
argv_value = argv + maxindex;
/*
@@ -799,7 +823,7 @@ calc_interrupt(char *fmt, ...)
* don't call libcalc_call_me_last() -- we might loop
* and besides ... this is an unusual internal error case
*/
exit(22);
exit(24);
}
}

1
calc.h
View File

@@ -216,6 +216,7 @@ EXTERN int havecommands; /* TRUE if have cmd args) */
EXTERN char *program; /* our name */
EXTERN char *base_name; /* basename of our name */
EXTERN char cmdbuf[]; /* command line expression */
EXTERN char *script_name; /* program name or -f filename arg or NULL */
EXTERN int abortlevel; /* current level of aborts */
EXTERN BOOL inputwait; /* TRUE if in a terminal input wait */

226
calc.man
View File

@@ -37,6 +37,7 @@ calc \- arbitrary precision calculator
.RB [ -D\ \&calc_debug[:resource_debug[:user_debug]] ]
.br
.RB [ \-e ]
.RB [ \-f\ \&filename ]
.RB [ \-h ]
.RB [ \-i ]
.RB [ \-m\ \&mode ]
@@ -50,11 +51,12 @@ calc \- arbitrary precision calculator
.RB [ [\-\-]\ calc_cmd\ \&.\|.\|. ]
.in -5n
.sp
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-s\fP \fB\-f\fP
\fI#!${BINDIR}/calc\fP\ [optional_other_flags\ \&...] \fB\-f\fP
.PP
.SH DESCRIPTION
\&
.br
CALC OPTIONS
.PP
.TP
@@ -218,48 +220,55 @@ Ignore any environment variables on startup.
The getenv() builtin will still return values, however.
.TP
.B \-f
.BR \-f " filename"
This flag is normally only with calc shell scripts.
.sp 1
This flag is required when using calc in
.BR "shell script mode" .
It must be at the end of the initial
.B #!
line of the script
and must be immediately preceded by the
.B \-s
flag.
.sp 1
If the first line of an executable file begins
.B #!
followed by the absolute pathname of the
.B calc
program and if the first line ends with the two flags
.B \-s
.B \-f
as in:
line of the script, as in:
.sp 1
.in +5n
.nf
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-s\fP \fB\-f\fP
\fI#!${BINDIR}/calc\fP\ [optional_other_flags\ \&...] \fB\-f\fP
.fi
.in -5n
.sp 1
the rest of the file will be processed in
.BR "shell script mode" .
.sp 1
A common flag to use, prior to the
.B \-f
on the #! line is the
.B \-q
flag.
For example:
.sp 1
.in +5n
.nf
\fI#!${BINDIR}/calc\fP \fB\-q\fP \fB\-f\fP
.fi
.in -5n
.sp 1
This allows the script to run independely of
startup scripts.
.sp 1
See
.B "SHELL SCRIPT MODE"
section of this man page
below for details.
.sp 1
The actual form of this flag is:
While the actual form of this flag is:
.sp 1
.in +5n
.B \-f
.BR \-f
filename
.in -5n
.sp 1
On systems that treat an executable that begins with
for systems that treat an executable that begins with
.B #!
as a script, the path of the executable is appended by the kernel
as the final argument to the exec() system call.
@@ -270,12 +279,13 @@ flag at the very end of the
line.
.sp 1
It is possible use
.B \-f\ filename
.B \-f
filename
on the command line:
.sp 1
.in +5n
.nf
\fIcalc\fP\ [other_flags\ \&...] \fB\-s\fP \fB\-f\fP filename
\fIcalc\fP\ [optional_other_flags\ \&...] \fB\-f\fP filename
.fi
.in -5n
.sp 1
@@ -283,28 +293,14 @@ This will cause calc to process lines in
.B filename
in
.BR "shell script mode" .
.sp 1
Use of
.B \-f
implies
.BR \-s .
However in a calc shell script,
one must include
.B \-f
before
.B \-s
on the initial
.B #!
line.
.sp 1
In addition,
.B \-d
and
.B \-p
are implied if
.B \-i
is not given.
The use of
.B \-f
filename
implies the
.B \-s
flag.
.TP
.B \-h
@@ -491,16 +487,16 @@ This is useful when entering negative values on the command line as in:
.in +5n
.nf
calc \-p \-\- \-1 - -7
.sp 1
.fi
.in -5n
.sp 1
.PP
\&
.br
CALC COMMAND LINE
.SH CALC COMMAND LINE
.PP
With no
.I calc_cmd
arguments,
@@ -638,10 +634,10 @@ to parse interactive commands, flushes data on standard input.
.PP
\&
.br
CALC STARTUP FILES
.SH CALC STARTUP FILES
.PP
Normally on startup,
if the environment variable
.B $CALCRC
@@ -678,10 +674,12 @@ files is also disabled as if
.B \-q
was given.
\&
.br
CALC FILE SEARCH PATH
.PP
.SH CALC FILE SEARCH PATH
.PP
If the environment variable
.B $CALCPATH
is undefined, or if it
@@ -758,24 +756,24 @@ help config
.fi
.in -5n
.sp 1
.PP
\&
.br
SHELL SCRIPT MODE
.SH SHELL SCRIPT MODE
.PP
If the first line of an executable file begins
.B #!
followed by the absolute pathname of the
.B calc
program and the first line ends with the two flags
.B \-s
program and the first line ends with the flag
.B \-f
as in:
.sp 1
.in +5n
.nf
\fI#!${BINDIR}/calc\fP\ [other_flags\ \&...] \fB\-s\fP \fB\-f\fP
\fI#!${BINDIR}/calc\fP\ [optional_other_flags\ \&...] \fB\-f\fP
.fi
.in -5n
.sp 1
@@ -786,11 +784,11 @@ Note that
.B \-f
must at the end of the initial ``#!'' line.
Any other optional
.B "other_flags"
.B "optional_other_flags"
must come before
the
.B \-s
.BR \-f .
.B \-f
flag.
.sp 1
In
.B "shell script mode"
@@ -799,7 +797,7 @@ executed as if they were in a file being processed by a read
command, except that a "command" beginning with '#' followed by
whitespace and ending at the next newline is treated as a comment.
Any optional
.B "other_flags"
.B "optional_other_flags"
will be parsed first followed by
the later lines within the script itself.
.sp 1
@@ -821,7 +819,7 @@ the file
.sp 1
.in +5n
.nf
\fI#!${BINDIR}/calc\fP\ \&\fB\-q\fP \&\fB\-s\fP \fB\-f\fP
\fI#!${BINDIR}/calc\fP\ \&\fB\-q\fP \fB\-f\fP
/* setup */
argc = argv();
@@ -894,12 +892,13 @@ whereas
.in -5n
.sp 1
will not.
.PP
\&
.br
DATA TYPES
.SH DATA TYPES
.PP
Fundamental builtin data types include integers, real numbers,
rational numbers, complex numbers and strings.
.PP
@@ -922,12 +921,13 @@ help obj
.br
show objfuncs
.in -1.0i
.PP
\&
.br
VARIABLES
.SH VARIABLES
.PP
Variables in \fIcalc\fP are typeless.
In other words, the fundamental type of a variable is determined by its content.
Before a variable is assigned a value it has the value of zero.
@@ -950,12 +950,13 @@ help list
.br
show globals
.in -1.0i
.PP
\&
.br
INPUT/OUTPUT
.SH INPUT/OUTPUT
.PP
A leading ``0x'' implies a hexadecimal value,
a leading ``0b'' implies a binary value,
and a ``0'' followed by a digit implies an octal value.
@@ -985,12 +986,13 @@ command:
.in 1.0i
help file
.in -1.0i
.PP
\&
.br
CALC LANGUAGE
.SH CALC LANGUAGE
.PP
The \fIcalc\fP language is a C-like language.
The language includes commands such as variable declarations,
expressions, tests, labels, loops, file operations, function calls.
@@ -1017,10 +1019,13 @@ help operator
.br
help config
.in -1.0i
.PP
.SH FILES
\&
.br
.PP
.PD 0
.TP 5
${BINDIR}/calc
@@ -1062,9 +1067,13 @@ custom resource files
${CUSTOMHELPDIR}/*
custom help files
.sp 1
.PP
.SH ENVIRONMENT
\&
.br
.PP
.PD 0
.TP 5
CALCPATH
@@ -1123,9 +1132,13 @@ Location of the calc custom help directory.
.sp
Default value: ${CUSTOMHELPDIR}
.sp
.PP
.SH CREDIT
\&
.br
.PP
The main chunk of
.B calc
was written by David I. Bell.
@@ -1154,10 +1167,13 @@ public domain arbitrarily precision routines which was posted
to the net around 1984.
By now, there is almost no recognizable
code left from that original source.
.sp
.PP
.SH "COPYING / CALC GNU LESSER GENERAL PUBLIC LICENSE"
\&
.sp
.PP
Calc is open software, and is
covered under version 2.1 of the GNU Lesser General Public License.
You are
@@ -1217,10 +1233,13 @@ Copyright (C) 1999-2021 Landon Curt Noll
.sp
and is covered under version 2.1 GNU Lesser General
Public License.
.sp
.PP
.SH "CALC QUESTIONS"
\&
.br
.PP
If you have a simple general question about calc, send Email to:
.sp
.in +0.5i
@@ -1276,11 +1295,13 @@ nor can we do your homework, nor can
we do much more than answer short general questions about calc.
.sp
Please be patient as we cannot always respond to Email messages quickly.
.sp
.PP
.SH "BUG REPORTS / BUG FIXES"
\&
.br
.sp
.PP
Send bug reports and bug fixes to:
.sp
.in +0.5i
@@ -1346,11 +1367,13 @@ help bugs
for more information about bug reporting.
.sp
Please be patient as we cannot always respond to Email messages quickly.
.sp
.PP
.SH "CONTRIBUTING CODE TO CALC"
\&
.br
.sp
.PP
.I Calc
is open source.
Contributions of code are welcome.
@@ -1473,10 +1496,13 @@ you have that
somewhere in the subject line!
.sp
Please be patient as we cannot always respond to Email messages quickly.
.sp
.PP
.SH "CALC WEB SITE"
\&
.br
.PP
Landon Noll maintains the
.B calc
web site is located at:

View File

@@ -1,7 +1,7 @@
#
# calcerr - error codes and messages
#
# Copyright (C) 1999-2006 Ernest Bowen
# Copyright (C) 1999-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
@@ -496,3 +496,49 @@ E_ATANH3 Invalid value for calculating atan
E_ACOTH3 Invalid value for calculating acot
E_ASECH3 Invalid value for calculating asec
E_ACSCH3 Invalid value for calculating acsc
E_D2R1 Bad epsilon for converting degrees to radians
E_D2R2 Bad first argument converting degrees to radians
E_R2D1 Bad epsilon for converting radians to degrees
E_R2D2 Bad first argument converting radians to degrees
E_G2R1 Bad epsilon for converting gradians to radians
E_G2R2 Bad first argument converting gradians to radians
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 aarguments 1, 2 or 3 for dms2d
E_DMS2D2 Invalid rounding arg 4 for dms2d
E_DM2D1 Non-real-number aarguments 1 or 2 for dm2d
E_DM2D2 Invalid rounding arg 4 for dm2d
E_GMS2G1 Non-real-number aarguments 1, 2 or 3 for gms2g
E_GMS2G2 Invalid rounding arg 4 for gms2g
E_GM2G1 Non-real-number aarguments 1 or 2 for gm2g
E_GM2G2 Invalid rounding arg 4 for gm2g
E_HMS2H1 Non-real-number aarguments 1, 2 or 3 for hms2h
E_HMS2H2 Invalid rounding arg 4 for hms2h
E_HM2H1 Non-real-number aarguments 1 or 2 for hm2h
E_HM2H2 Invalid rounding arg 4 for hm2h

View File

@@ -274,6 +274,8 @@ STATIC NAMETYPE modes[] = {
{"scientific", MODE_EXP},
{"sci", MODE_EXP},
{"exp", MODE_EXP},
{"engineering", MODE_ENG},
{"eng", MODE_ENG},
{"hexadecimal", MODE_HEX},
{"hex", MODE_HEX},
{"octal", MODE_OCTAL},

13
const.c
View File

@@ -44,16 +44,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*/
}
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;
}
@@ -123,6 +123,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;

View File

@@ -1,7 +1,9 @@
#!/usr/local/src/bin/calc/calc -q -s -f
#!/usr/local/src/bin/calc/calc -q -f
/*
* 4dsphere - determine if 6 points lie on the surface of a sphere in R^4
*
* Copyright (C) 2001,2014,2019,2021 Landon Curt Noll
*
* usage:
* 4dsphere x0 y0 z0 w0 x1 y1 z1 w1 ... x5 y5 z5 w5
*
@@ -10,8 +12,6 @@
* ... ...
* x5 y5 z5 w5 point 5 in R^4
*
* Copyright (C) 2001,2014,2019 Landon Curt Noll
*
* Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License
* as published by the Free Software Foundation.

View File

@@ -3,6 +3,14 @@
#
# Copyright (C) 1999-2006,2014,2017,2021 Landon Curt Noll
#
# SRC: cscript/Makefile
#
# 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.
@@ -30,7 +38,7 @@
# The shell used by this Makefile
#
# On some systems, /bin/sh is a rather reduced shell with
# deprecated behavor.
# deprecated behavior.
#
# If your system has a up to date, bash shell, then
# you may wish to use:
@@ -38,7 +46,7 @@
# SHELL= /bin/bash
#
# On some systems such as macOS, the bash shell is very
# far behind to the point wehre is cannot be depended on.
# 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:
#
@@ -54,6 +62,36 @@ SHELL= /bin/sh
# a default here just in case you want to build from this directory.
####
# 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
# 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
@@ -83,11 +121,11 @@ TOP_MAKE_FILE= Makefile
# INCDIR= /usr/include
#
#INCDIR= /usr/local/include
#INCDIR= ${PREFIX}/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
# where to install calc realted things
# where to install calc related things
#
# ${BINDIR} where to install calc binary files
# ${LIBDIR} where calc link library (*.a) files are installed
@@ -109,15 +147,15 @@ INCDIR= /usr/include
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= /usr/local/bin
#BINDIR= ${PREFIX}/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= /usr/local/lib
#LIBDIR= ${PREFIX}/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= /usr/local/lib/calc
#CALC_SHAREDIR= ${PREFIX}/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
@@ -331,7 +369,7 @@ detaillist:
# Home grown make dependency rules. Your system make not support
# or have the needed tools. You can ignore this section.
#
# We will form a skelaton tree of *.c files containing only #include "foo.h"
# We will form a skeleton tree of *.c files containing only #include "foo.h"
# lines and .h files containing the same lines surrounded by multiple include
# prevention lines. This allows us to build a static depend list that will
# satisfy all possible cpp symbol definition combinations.

View File

@@ -1,15 +1,15 @@
#!/usr/local/src/bin/calc/calc -q -s -f
#!/usr/local/src/bin/calc/calc -q -f
/*
* fproduct - write the big Endian product of terms to a file
*
* Copyright (C) 2001,2014,2019,2021 Landon Curt Noll
*
* usage:
* fproduct filename term [term ...]
*
* filename where to write the product, use - for stdout
* term ... terms to multiply
*
* Copyright (C) 2001,2014,2019 Landon Curt Noll
*
* Calc is open software; you can redistribute it and/or modify it under
* the terms of the version 2.1 of the GNU Lesser General Public License
* as published by the Free Software Foundation.

View File

@@ -1,8 +1,8 @@
#!/usr/local/src/bin/calc/calc -q -s -f
#!/usr/local/src/bin/calc/calc -q -f
/*
* mersenne - print the value of a mersenne number
*
* Copyright (C) 1999-2007,2014,2019 Landon Curt Noll
* Copyright (C) 1999-2007,2014,2019,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

@@ -1,4 +1,4 @@
#!/usr/local/src/bin/calc/calc -q -s -f
#!/usr/local/src/bin/calc/calc -q -f
/*
* piforever - print digits of pi forever (or as long as your mem/CPU allow)
*

View File

@@ -1,8 +1,8 @@
#!/usr/local/src/bin/calc/calc -q -s -f
#!/usr/local/src/bin/calc/calc -q -f
/*
* plus - add two or more arguments together
*
* Copyright (C) 1999-2007,2014,2019 Landon Curt Noll
* Copyright (C) 1999-2007,2014,2019,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
@@ -47,7 +47,7 @@ if (argc < 2) {
* Since args are strings, we must eval them before using them numerically.
*/
sum = 0;
for (i=1; i < argv(); ++i) {
for (i=1; i < argc; ++i) {
sum += eval(argv(i));
}
print sum;

View File

@@ -1,14 +1,22 @@
#!/usr/local/src/bin/calc/calc -q -s -f
#!/usr/local/src/bin/calc/calc -q -f
/*
* powerterm - print the argument as a sum of powers of integers
*
* Copyright (C) 2001,2014,2019,2021 Landon Curt Noll
*
* usage:
* powerterm [base_limit] value
*
* base_limit largest base we will consider (def: 10000)
* value value to convert into sums of powers of integers
*
* Copyright (C) 2001,2014,2019 Landon Curt Noll
* Example:
*
* powerterm 5 1000000
*
* prints:
*
* 4^10 - 3^10 + 5^6 - 4^6 - 4^5 - 2^5
*
* Calc is open software; you can redistribute it and/or modify it under
* the powerterm of the version 2.1 of the GNU Lesser General Public License

View File

@@ -1,8 +1,8 @@
#!/usr/local/src/bin/calc/calc -q -s -f
#!/usr/local/src/bin/calc/calc -q -f
/*
* simple - an example of a simple calc shell script
*
* Copyright (C) 1999-2007,2014,2019 Landon Curt Noll
* Copyright (C) 1999-2007,2014,2019,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

@@ -1,8 +1,8 @@
#!/usr/local/src/bin/calc/calc -q -s -f
#!/usr/local/src/bin/calc/calc -q -p -f
/*
* sqaure - print the squares of input values
*
* Copyright (C) 2000-2007,2014,2019 Ernest Bowen
* Copyright (C) 2000-2007,2014,2019,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
@@ -48,6 +48,8 @@
* 1522756
* ln(2)
* ~.48045301391820142467
* 2i
* -4
* config("mode","frac"), bernoulli(10)
* 25/4356
* config("mode", "hex"), 0xff

View File

@@ -4,6 +4,14 @@
#
# Copyright (C) 1999-2006,2014,2017-2018,2021 Landon Curt Noll
#
# SRC: Makefile via make -f Makefile.ship custom/Makefile
#
# 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.
@@ -27,11 +35,30 @@
# 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 behavor.
# deprecated behavior.
#
# If your system has a up to date, bash shell, then
# you may wish to use:
@@ -39,7 +66,7 @@
# SHELL= /bin/bash
#
# On some systems such as macOS, the bash shell is very
# far behind to the point wehre is cannot be depended on.
# 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:
#
@@ -50,6 +77,37 @@ SHELL= /bin/sh
#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
@@ -57,7 +115,7 @@ SHELL= /bin/sh
# 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).
@@ -87,6 +145,13 @@ CCBAN= -UUNBAN
#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 -=-=-=-=-=-=-=-=-#
##############################################################################
@@ -204,7 +269,7 @@ V=@:
# INCDIR= /usr/include
#
#INCDIR= /usr/local/include
#INCDIR= ${PREFIX}/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
@@ -230,15 +295,15 @@ INCDIR= /usr/include
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= /usr/local/bin
#BINDIR= ${PREFIX}/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= /usr/local/lib
#LIBDIR= ${PREFIX}/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= /usr/local/lib/calc
#CALC_SHAREDIR= ${PREFIX}/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
@@ -431,7 +496,7 @@ EXT=
# The default calc versions
#
VERSION= 2.12.9.1
VERSION= 2.14.0.6
# Names of shared libraries with versions
#
@@ -517,7 +582,16 @@ ILDFLAGS= ${COMMON_LDFLAGS}
LDFLAGS= ${LD_DEBUG} ${ILDFLAGS}
#endif /* end of skip for non-Gnu makefiles */
##################################################
# NOTE: End of section from custom/Makefile.head #
##################################################
# start of host target cut - Do not remove this line
###########################################################
# NOTE: Start of section from the middle of Makefile.ship #
###########################################################
##############################################################################
#-=-=-=-=-=- host target section - targets that override defaults -=-=-=-=-=-#
##############################################################################
@@ -600,7 +674,7 @@ ifeq ($(target),Linux)
BLD_TYPE= calc-dynamic-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:/lib:/usr/lib:${LIBDIR}:/usr/local/lib
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}"
@@ -627,10 +701,8 @@ LIBCUSTCALC_STATIC=
# This facility requires a Gnu Makefile, or a make command
# that understands the += make operand.
#
#if 0 /* start of skip for non-Gnu makefiles */
COMMON_CFLAGS+= ${COMMON_ADD}
COMMON_LDFLAGS+= ${COMMON_ADD}
#endif /* end of skip for non-Gnu makefiles */
#
CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
@@ -645,16 +717,16 @@ CC= ${PURIFY} ${LCC} ${CCWERR}
#
endif
##############################
# Apple OS X / Darwin target #
##############################
###############################
# Apple macOS / Darwin target #
###############################
ifeq ($(target),Darwin)
#
BLD_TYPE= calc-dynamic-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:${LIBDIR}:/usr/local/lib
DEFAULT_LIB_INSTALL_PATH= ${PWD}:${LIBDIR}:${PREFIX}/lib
LD_SHARE= ${DARWIN_ARCH}
#SET_INSTALL_NAME= no
SET_INSTALL_NAME= yes
@@ -695,10 +767,8 @@ LIBCUSTCALC_STATIC=
# This facility requires a Gnu Makefile, or a make command
# that understands the += make operand.
#
#if 0 /* start of skip for non-Gnu makefiles */
COMMON_CFLAGS+= ${COMMON_ADD}
COMMON_LDFLAGS+= ${COMMON_ADD}
#endif /* end of skip for non-Gnu makefiles */
#
CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
@@ -738,7 +808,7 @@ ifeq ($(target),FreeBSD)
BLD_TYPE= calc-dynamic-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:/lib:/usr/lib:${LIBDIR}:/usr/local/lib
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}"
@@ -765,10 +835,8 @@ LIBCUSTCALC_STATIC=
# This facility requires a Gnu Makefile, or a make command
# that understands the += make operand.
#
#if 0 /* start of skip for non-Gnu makefiles */
COMMON_CFLAGS+= ${COMMON_ADD}
COMMON_LDFLAGS+= ${COMMON_ADD}
#endif /* end of skip for non-Gnu makefiles */
#
CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
@@ -800,7 +868,7 @@ ifeq ($(target),OpenBSD)
BLD_TYPE= calc-dynamic-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:/lib:/usr/lib:${LIBDIR}:/usr/local/lib
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}"
@@ -827,10 +895,8 @@ LIBCUSTCALC_STATIC=
# This facility requires a Gnu Makefile, or a make command
# that understands the += make operand.
#
#if 0 /* start of skip for non-Gnu makefiles */
COMMON_CFLAGS+= ${COMMON_ADD}
COMMON_LDFLAGS+= ${COMMON_ADD}
#endif /* end of skip for non-Gnu makefiles */
#
CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
@@ -856,7 +922,7 @@ ifeq ($(target),SunOS)
BLD_TYPE= calc-dynamic-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:/lib:/usr/lib:${LIBDIR}:/usr/local/lib
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}"
@@ -883,10 +949,8 @@ LD_STATIC=
# This facility requires a Gnu Makefile, or a make command
# that understands the += make operand.
#
#if 0 /* start of skip for non-Gnu makefiles */
COMMON_CFLAGS+= ${COMMON_ADD}
COMMON_LDFLAGS+= ${COMMON_ADD}
#endif /* end of skip for non-Gnu makefiles */
#
CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
@@ -910,7 +974,7 @@ ifeq ($(target),Cygwin)
BLD_TYPE= calc-static-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:/lib:/usr/lib:${LIBDIR}:/usr/local/lib
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}"
@@ -937,10 +1001,8 @@ LD_STATIC=
# This facility requires a Gnu Makefile, or a make command
# that understands the += make operand.
#
#if 0 /* start of skip for non-Gnu makefiles */
COMMON_CFLAGS+= ${COMMON_ADD}
COMMON_LDFLAGS+= ${COMMON_ADD}
#endif /* end of skip for non-Gnu makefiles */
#
CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
@@ -968,7 +1030,7 @@ ifeq ($(target),simple)
BLD_TYPE= calc-static-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:/lib:/usr/lib:${LIBDIR}:/usr/local/lib
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}"
@@ -1022,12 +1084,12 @@ CALCPATH= .;./cal;~/.cal;${T}${CALC_SHAREDIR};${T}${CUSTOMCALDIR}
else
CALCPATH= .;./cal;~/.cal;${T}${CALC_SHAREDIR}
endif
CALCRC= ${CALC_SHAREDIR}/startup;~/.calcrc;./.calcinit
CALCRC= ./.calcinit;~/.calcrc;${CALC_SHAREDIR}/startup
#
BLD_TYPE= calc-static-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:/lib:/usr/lib:${LIBDIR}:/usr/local/lib
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}"
@@ -1067,7 +1129,7 @@ ifeq ($(target),)
BLD_TYPE= calc-static-only
#
CC_SHARE= -fPIC
DEFAULT_LIB_INSTALL_PATH= ${PWD}:/lib:/usr/lib:${LIBDIR}:/usr/local/lib
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}"
@@ -1094,10 +1156,8 @@ LD_STATIC=
# This facility requires a Gnu Makefile, or a make command
# that understands the += make operand.
#
#if 0 /* start of skip for non-Gnu makefiles */
COMMON_CFLAGS+= ${COMMON_ADD}
COMMON_LDFLAGS+= ${COMMON_ADD}
#endif /* end of skip for non-Gnu makefiles */
#
CCWARN= -Wall
WNO_IMPLICT= -Wno-implicit
@@ -1142,7 +1202,27 @@ LDFLAGS= ${LD_DEBUG} ${ILDFLAGS}
#######################################################################
#-=-=-=-=-=- end of target section - only make rules below -=-=-=-=-=-#
#######################################################################
#########################################################
# NOTE: End of section from the middle of Makefile.ship #
#########################################################
# end of host target cut - Do not remove this line
#
# Copyright (C) 1999-2006,2014,2017-2018,2021 Landon Curt Noll
#
# SRC: Makefile via make -f Makefile.ship custom/Makefile
#
# 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.
####################################################
# NOTE: Start of section from custom/Makefile.tail #
####################################################
##############################################################################
#-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#
##############################################################################
@@ -1293,7 +1373,10 @@ 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} > $@
${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 '"\\" >> $@
@@ -1894,3 +1977,7 @@ 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

@@ -4,6 +4,14 @@
#
# 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.
@@ -27,11 +35,30 @@
# 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 behavor.
# deprecated behavior.
#
# If your system has a up to date, bash shell, then
# you may wish to use:
@@ -39,7 +66,7 @@
# SHELL= /bin/bash
#
# On some systems such as macOS, the bash shell is very
# far behind to the point wehre is cannot be depended on.
# 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:
#
@@ -50,6 +77,37 @@ SHELL= /bin/sh
#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
@@ -57,7 +115,7 @@ SHELL= /bin/sh
# 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).
@@ -87,6 +145,13 @@ CCBAN= -UUNBAN
#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 -=-=-=-=-=-=-=-=-#
##############################################################################
@@ -204,7 +269,7 @@ V=@:
# INCDIR= /usr/include
#
#INCDIR= /usr/local/include
#INCDIR= ${PREFIX}/include
#INCDIR= /dev/env/DJDIR/include
INCDIR= /usr/include
@@ -230,15 +295,15 @@ INCDIR= /usr/include
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= /usr/local/bin
#BINDIR= ${PREFIX}/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= /usr/local/lib
#LIBDIR= ${PREFIX}/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= /usr/local/lib/calc
#CALC_SHAREDIR= ${PREFIX}/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
@@ -431,7 +496,7 @@ EXT=
# The default calc versions
#
VERSION= 2.12.9.1
VERSION= 2.14.0.6
# Names of shared libraries with versions
#
@@ -517,3 +582,7 @@ 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,3 +1,18 @@
#
# Copyright (C) 1999-2006,2014,2017-2018,2021 Landon Curt Noll
#
# SRC: custom/Makefile.tail
#
# 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.
####################################################
# NOTE: Start of section from custom/Makefile.tail #
####################################################
##############################################################################
#-=-=-=-=-=-=-=-=- Be careful if you change something below -=-=-=-=-=-=-=-=-#
##############################################################################
@@ -148,7 +163,10 @@ 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} > $@
${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 '"\\" >> $@
@@ -749,3 +767,7 @@ custtbl.o: ../str.h
custtbl.o: ../value.h
custtbl.o: ../zmath.h
custtbl.o: custtbl.c
##################################################
# NOTE: End of section from custom/Makefile.tail #
##################################################

3
file.c
View File

@@ -1048,6 +1048,9 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals)
case 'e':
newmode = MODE_EXP;
break;
case 'n':
newmode = MODE_ENG;
break;
case 'g':
newmode = MODE_REAL_AUTO;
break;

1342
func.c

File diff suppressed because it is too large Load Diff

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

3
help.c
View File

@@ -83,6 +83,9 @@ STATIC struct help_alias {
{"show", "command"},
{"stdlib", "resource"},
{"question", "questions"},
{"dm2d", "dms2d"},
{"gm2g", "gms2g"},
{"hm2d", "hms2d"},
{NULL, NULL}
};

View File

@@ -4,6 +4,14 @@
#
# Copyright (C) 1999-2006,2017,2021 Landon Curt Noll
#
# SRC: help/Makefile
#
# 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.
@@ -31,7 +39,7 @@
# The shell used by this Makefile
#
# On some systems, /bin/sh is a rather reduced shell with
# deprecated behavor.
# deprecated behavior.
#
# If your system has a up to date, bash shell, then
# you may wish to use:
@@ -39,7 +47,7 @@
# SHELL= /bin/bash
#
# On some systems such as macOS, the bash shell is very
# far behind to the point wehre is cannot be depended on.
# 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:
#
@@ -55,6 +63,36 @@ SHELL= /bin/sh
# a default here just in case you want to build from this directory.
####
# 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
# 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
@@ -110,15 +148,15 @@ INCDIR= /usr/include
# LIBDIR= /usr/lib
# CALC_SHAREDIR= /usr/share/calc
#
#BINDIR= /usr/local/bin
#BINDIR= ${PREFIX}/bin
#BINDIR= /dev/env/DJDIR/bin
BINDIR= /usr/bin
#LIBDIR= /usr/local/lib
#LIBDIR= ${PREFIX}/lib
#LIBDIR= /dev/env/DJDIR/lib
LIBDIR= /usr/lib
#CALC_SHAREDIR= /usr/local/lib/calc
#CALC_SHAREDIR= ${PREFIX}/lib/calc
#CALC_SHAREDIR= /dev/env/DJDIR/share/calc
CALC_SHAREDIR= /usr/share/calc
@@ -318,7 +356,7 @@ BLT_HELP_FILES= ${BLT_HELP_FILES_3} ${BLT_HELP_FILES_5} \
#
# Please use:
#
# make detail_help_list
# make clobber >/dev/null && make detail_help_list
#
# to keep this list in nice sorted order.
#
@@ -326,14 +364,15 @@ 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 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 gcd gcdrem gd getenv hash head highbit \
hmean hnrmod hypot ilog ilog10 ilog2 im indices inputlevel insert int \
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 \
@@ -343,11 +382,11 @@ DETAIL_HELP= abs access acos acosh acot acoth acsc acsch address agd \
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 questions \
quo quomod 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 \
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 \
@@ -692,7 +731,7 @@ distlist: ${DISTLIST}
if [ X"$$i" != X"/dev/null" ]; then \
echo help/$$i; \
fi; \
done | LANG=C ${SORT}
done | fgrep -v '.bak' | LANG=C ${SORT}
distdir:
${Q} echo help

View File

@@ -11,14 +11,33 @@ TYPES
DESCRIPTION
Without args, this builtin returns the number of calc command line
strings available.
strings available, including the program or script name.
If the numeric arg is supplied, then the corresponding command line
string is return, if it exists. Otherwise a nul() value is returned.
In keeping with the argc/argv convention of C, argv(0) will refer
to the 1st argv string, and argv(argv()-1) will refer to the last.
This differs from the way the param() builtin works.
to the name of the program. If the -f filename argument is used,
then argv(0) will refer to the filename. In the case of a #! script,
assuming the calc is located in /usr/local/bin/calc, the first
line of a calc script would be:
#!/usr/local/bin/calc -f
...
then argv(0) will refer to the filename of the script.
As it is common to use -q in a calc script, and using that same
/usr/local/bin/calc location:
#!/usr/local/bin/calc -q -f
...
and again, argv(0) will refer to the filename of the script.
The 1st argument to calc will be argv(1), and argv(argv()-1)
will refer to the last. This differs from the way the param()
builtin works.
By default, calc will evaluate all of its command line arguments.
However, if calc is invoked with -s, all non-dashed options will
@@ -27,22 +46,26 @@ DESCRIPTION
calc -i 2+2
will cause calc to print 4 and enter interactive mode. In this case
argv() will return 0.
argv() will return 1.
On the other hand:
calc -i -s 2+2
will cause calc to interactive mode. The argv() builtin will return 1
and argv(0) will return the string "2+2".
will cause calc to interactive mode. The argv() builtin will return 2
and argv(1) will return the string "2+2".
EXAMPLE
$ calc -s a bb ccc
; argc = argv();
; for (i = 0; i < argc; i++) print "argv[": i : '] = "': argv(i) : '"';
argv[0] = "a"
argv[1] = "bb"
argv[2] = "ccc"
; print "argc =", argc;
argc = 4
; print 'argv[0] = "': argv(0) : '"';
argv[0] = "calc"
; for (i = 1; i < argc; i++) print "argv[": i : '] = "': argv(i) : '"';
argv[1] = "a"
argv[2] = "bb"
argv[3] = "ccc"
LIMITS
0 <= n < 2^31
@@ -53,7 +76,7 @@ LINK LIBRARY
SEE ALSO
param, system, usage
## Copyright (C) 1999-2006 Landon Curt Noll
## Copyright (C) 1999-2006,2021 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License

View File

@@ -44,6 +44,9 @@ DESCRIPTION
"sci"
"exp"
1000 "engineering" base 10 notation with exponent
"eng" multiple of 3
For convenience, any non-integer value is assumed to mean base 10
fractions and any integer >= 2^64 is assumed to mean base 10
scientific notation.
@@ -76,7 +79,7 @@ LINK LIBRARY
int math_setmode(int newmode)
NOTE: newmode must be one of MODE_DEFAULT, MODE_FRAC, MODE_INT,
MODE_REAL, MODE_EXP, MODE_HEX, MODE_OCTAL, MODE_BINARY
MODE_REAL, MODE_EXP, MODE_ENG, MODE_HEX, MODE_OCTAL, MODE_BINARY
SEE ALSO
base2, config, str

View File

@@ -50,6 +50,9 @@ DESCRIPTION
"sci"
"exp"
1000 "engineering" base 10 notation with exponent
"eng" multiple of 3
0 "off" disable double base output
For convenience, any non-integer non-zero value is assumed to mean
@@ -87,7 +90,7 @@ LINK LIBRARY
int math_setmode2(int newmode)
NOTE: newmode must be one of MODE_DEFAULT, MODE_FRAC, MODE_INT,
MODE_REAL, MODE_EXP, MODE_HEX, MODE_OCTAL, MODE_BINARY,
MODE_REAL, MODE_EXP, MODE_ENG, MODE_HEX, MODE_OCTAL, MODE_BINARY,
MODE2_OFF
SEE ALSO

View File

@@ -165,8 +165,8 @@ DESCRIPTION
config("display", int)
The "display" parameter specifies the maximum number of digits after
the decimal point to be printed in real or exponential mode in
normal unformatted printing (print, strprint, fprint) or in
the decimal point to be printed in real, exponential or engineering
mode in normal unformatted printing (print, strprint, fprint) or in
formatted printing (printf, strprintf, fprintf) when precision is not
specified. The initial value for oldstd is 20, for newstd 10.
The parameter may be changed to the value d by either
@@ -234,6 +234,9 @@ DESCRIPTION
"sci"
"exp"
"engineering" base 10 notation with exponent base(10e6)
"eng" multiple of 3
Where multiple strings are given, the first string listed is what
config("mode") will return.

117
help/d2dm Normal file
View File

@@ -0,0 +1,117 @@
NAME
d2dm - convert degrees into degrees, and minutes
SYNOPSIS
d2dm(degs, d, m [,rnd])
TYPES
degs real
d null-or-real-valued lvalue with assign-to permission
m null-or-real-valued lvalue with assign-to permission
rnd nonnegative integer, defaults to config("mod")
return mod(degs, 360, rnd)
DESCRIPTION
Convert degs degrees into d degrees, and m minutes.
The return value is a normalized number of degrees, and is equivalent
to the following:
return_value = mod(degs, 360, rnd);
The argument rnd, if not given, defaults to config("mod").
For more information on the effects of rnd, see "help mod".
Depending on the rounding mode, the return could be a real value
in the interval [0, 360) or a real value in the interval (-360, 0].
For the default round mode, the return value is in the interval [0, 360).
The d argument will be an integer number of degrees.
The value d will be set as if the following were used:
d = int(return_value);
For some rounding modes, d will be an integer in the interval [0, 360).
For other rounding modes, d will be an integer in the interval (-360, 0].
For the default round mode, d is in the interval [0, 360).
The m argument will be a real number of minutes.
The value m will be set as if the following were used:
tmp = return_value - d;
m = tmp * 60;
free(tmp);
For some rounding modes, m will be a real value in the interval [0, 60).
For other rounding modes, m will be a real value in the interval (-60, 0].
For the default round mode, m will be in the interval [0, 60).
The following shows relationship between the return value and the resulting
d, and m values:
return_value == d + m/60;
EXAMPLE
/* if args are undefined, pre-declare them or assign them as args */
; global d, m;
; print d2dm(12.3456,d,m), d, m;
12.3456 12 20.736
; print d2dm(1234.5678,d,m), d, m;
154.5678 154 34.068
; print d2dm(-1234.5678,d,m), d, m;
205.4322 205 25.932
; print d2dm(654.321,deg=,min=), deg, min;
294.321 294 19.26
; print d2dm(-654.321,deg=,min=), deg, min;
65.679 65 40.74
; print d2dm(360.321,deg=,min=), deg, min;
0.321 0 19.26
/* certain non-default rounding modes can return negative values */
; print d2dm(654.321,deg=,min=,1), deg, min;
-65.679 -65 -40.74
; print d2dm(-654.321,deg=,min=,1), deg, min;
-294.321 -294 -19.26
; print d2dm(360.321,deg=,min=,1), deg, min;
-359.679 -359 -40.74
LIMITS
none
LINK LIBRARY
none
SEE ALSO
config, d2dms, dm2d, dms2d, g2gm, g2gms, gm2g, gms2g,
h2hm, h2hms, hm2d, hms2d, mod
## 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/09/25 17:24: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/

132
help/d2dms Normal file
View File

@@ -0,0 +1,132 @@
NAME
d2dms - convert degrees into degrees, minutes, and seconds
SYNOPSIS
d2dms(degs, d, m, s [,rnd])
TYPES
degs real
d null-or-real-valued lvalue with assign-to permission
m null-or-real-valued lvalue with assign-to permission
s null-or-real-valued lvalue with assign-to permission
rnd nonnegative integer, defaults to config("mod")
return mod(degs, 360, rnd)
DESCRIPTION
Convert degs degrees into d degrees, m minutes, and s seconds.
The return value is a normalized number of degrees, and is equivalent
to the following:
return_value = mod(degs, 360, rnd);
The argument rnd, if not given, defaults to config("mod").
For more information on the effects of rnd, see "help mod".
Depending on the rounding mode, the return could be a real value
in the interval [0, 360) or a real value in the interval (-360, 0].
For the default round mode, the return value is in the interval [0, 360).
The d argument will be an integer number of degrees.
The value d will be set as if the following were used:
d = int(return_value);
For some rounding modes, d will be an integer in the interval [0, 360).
For other rounding modes, d will be an integer in the interval (-360, 0].
For the default round mode, d is in the interval [0, 360).
The m argument will be an integer number of minutes.
The value m will be set as if the following were used:
tmp = return_value - d;
tmp_m = tmp * 60;
free(tmp);
m = int(tmp_m);
For some rounding modes, m will be an integer in the interval [0, 60).
For other rounding modes, m will be an integer in the interval (-60, 0].
For the default round mode, m will be in the interval [0, 60).
The s argument will be a real number of seconds.
The value s will be set as if the following were used:
tmp = tmp_m - m;
free(tmp_m);
s = tmp * 60;
free(tmp);
For some rounding modes, s will be a real value in the interval [0, 60).
For other rounding modes, s will be a real value in the interval (-60, 0].
For the default round mode, s will be in the interval [0, 60).
The following shows relationship between the return value and the resulting
d, m, and s values:
return_value == d + m/60 + s/3600;
EXAMPLE
/* if args are undefined, pre-declare them or assign them as args */
; global d, m, s;
; print d2dms(12.3456,d,m,s), d, m, s;
12.3456 12 20 44.16
; print d2dms(1234.5678,d,m,s), d, m, s;
154.5678 154 34 4.08
; print d2dms(-1234.5678,d,m,s), d, m, s;
205.4322 205 25 55.92
; print d2dms(654.321,deg=,min=,sec=), deg, min, sec;
294.321, 294, 19, 15.6
; print d2dms(-654.321,deg=,min=,sec=), deg, min, sec;
65.679 65 40 44.4
; print d2dms(360.321,deg=,min=,sec=), deg, min, sec;
0.321 0 19 15.6
/* certain non-default rounding modes can return negative values */
; print d2dms(654.321,deg=,min=,sec=,1), deg, min, sec;
-65.679 -65 -40 -44.4
; print d2dms(-654.321,deg=,min=,sec=,1), deg, min, sec;
-294.321 -294 -19 -15.6
; print d2dms(360.321,deg=,min=,sec=,1), deg, min, sec;
-359.679 -359 -40 -44.4
LIMITS
none
LINK LIBRARY
none
SEE ALSO
config, d2dm, dm2d, dms2d, g2gm, g2gms, gm2g, gms2g,
h2hm, h2hms, hm2d, hms2d, mod
## 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/09/25 17:24: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/

55
help/d2g Normal file
View File

@@ -0,0 +1,55 @@
NAME
d2g - convert degrees to gradians
SYNOPSIS
d2g(x [,eps])
TYPES
x number (real or complex)
eps nonzero real, defaults to epsilon()
return number
DESCRIPTION
Given x degrees, return the equivalent number of gradians.
The eps argument is ignored.
EXAMPLE
; print d2g(45), d2g(180), d2g(30)
50 200 ~33.33333333333333333333
; print d2g(3i+2)
~2.22222222222222222222+~3.33333333333333333333i
LIMITS
none
LINK LIBRARY
none
SEE ALSO
d2r, r2d, g2r, r2g, g2d,
sin, cos, tan, sec, csc, cot, epsilon
## 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/09/07 12:04:28
## 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/

59
help/d2r Normal file
View File

@@ -0,0 +1,59 @@
NAME
d2r - convert degrees to radians
SYNOPSIS
d2r(x [,eps])
TYPES
x number (real or complex)
eps nonzero real, defaults to epsilon()
return number
DESCRIPTION
Given x degrees, return the equivalent number of radians.
The eps controls the precision of the calculated internal
constant pi / 180.
EXAMPLE
; print d2r(45), d2r(180), d2r(30)
~0.78539816339744830962 3.14159265358979323846 ~0.52359877559829887308
; print d2r(3i+2)
~0.03490658503988659154+~0.05235987755982988731i
; print sin(d2r(30)), cos(d2r(60)), tan(d2r(45))
0.5 0.5 1
LIMITS
eps > 0
LINK LIBRARY
NUMBER *qpidiv180(NUMBER *eps)
SEE ALSO
r2d, g2r, r2g, d2g, g2d,
sin, cos, tan, sec, csc, cot, epsilon
## 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/09/07 12:04:28
## 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/

84
help/dms2d Normal file
View File

@@ -0,0 +1,84 @@
NAME
dm2d, dms2d - convert degrees, minutes, and seconds to degrees
SYNOPSIS
dm2d(d, m [,rnd])
dms2d(d, m, s [,rnd])
TYPES
d real
m real
s real (defauls to 0)
rnd nonnegative integer, defaults to config("mod")
return degrees
DESCRIPTION
Convert degrees, m minutes, and s seconds returning degrees.
The return value in degrees, is quivalent to the following:
mod(d + m/60 + s/3600, 360, rnd);
Depending on the rounding mode, the return could be a real value
in the interval [0, 360) or a real value in the interval (-360, 0].
For the default round mode, the return value is in the interval [0, 360).
A missing rnd defaults to config("mod").
For more information on the effects of rnd, see "help mod".
The dm2d(d, m, rnd) builtin is an alias for dms2d(d, m, 0, rnd).
EXAMPLE
; print dm2d(203, 325.5594);
208.42599
; print dm2d(3601, -25.5594);
0.57401
; print dm2d(-923, -25.5594);
156.57401
; print dms2d(12, 20, 44.16);
12.3456
; print dms2d(123.456, -345.68, 4.08);
117.6958
; print dms2d(-65, -40, -44.4);
294.321
; print dm2d(203, 325.5594, 1);
-151.57401
; print dms2d(12, 20, 44.16, 1);
-347.6544
LIMITS
none
LINK LIBRARY
none
SEE ALSO
config, d2dm, d2dms, dm2d, dms2d, g2gm, g2gms, gm2g, gms2g,
h2hm, h2hms, hm2d, hms2d, mod
## 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/09/25 17:24: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/

55
help/g2d Normal file
View File

@@ -0,0 +1,55 @@
NAME
g2d - convert gradians to degrees
SYNOPSIS
g2d(x [,eps])
TYPES
x number (real or complex)
eps nonzero real, defaults to epsilon()
return number
DESCRIPTION
Given x gradians, return the equivalent number of degrees.
The eps argument is ignored.
EXAMPLE
; print g2d(50), g2d(200), g2d(30)
45 180 27
; print g2d(3i+2)
1.8+2.7i
LIMITS
none
LINK LIBRARY
none
SEE ALSO
d2r, r2d, g2r, r2g, d2g,
sin, cos, tan, sec, csc, cot, epsilon
## 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/09/07 12:04:28
## 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/

117
help/g2gm Normal file
View File

@@ -0,0 +1,117 @@
NAME
g2gm - convert gradians into gradians, and minutes
SYNOPSIS
g2gm(grads, g, m [,rnd])
TYPES
grads real
g null-or-real-valued lvalue with assign-to permission
m null-or-real-valued lvalue with assign-to permission
rnd nonnegative integer, defaults to config("mod")
return mod(grads, 400, rnd)
DESCRIPTION
Convert grads gradians into g gradians, and m minutes.
The return value is a normalized number of gradians, and is equivalent
to the following:
return_value = mod(grads, 400, rnd);
The argument rnd, if not given, defaults to config("mod").
For more information on the effects of rnd, see "help mod".
Depending on the rounding mode, the return could be a real value
in the interval [0, 400) or a real value in the interval (-400, 0].
For the default round mode, the return value is in the interval [0, 400).
The g argument will be an integer number of gradians.
The value g will be set as if the following were used:
g = int(return_value);
For some rounding modes, g will be an integer in the interval [0, 400).
For other rounding modes, g will be an integer in the interval (-400, 0].
For the default round mode, g is in the interval [0, 400).
The m argument will be a real number of minutes.
The value m will be set as if the following were used:
tmp = return_value - g;
m = tmp * 60;
free(tmp);
For some rounding modes, m will be a real value in the interval [0, 60).
For other rounding modes, m will be a real value in the interval (-60, 0].
For the default round mode, m will be in the interval [0, 60).
The following shows relationship between the return value and the resulting
g, and m values:
return_value == g + m/60;
EXAMPLE
/* if args are undefined, pre-declare them or assign them as args */
; global g, m;
; print g2gm(12.3456,g,m), g, m;
12.3456 12 20.736
; print g2gm(1234.5678,g,m), g, m;
34.5678 34 34.068
; print g2gm(-1234.5678,g,m), g, m;
365.4322 365 25.932
; print g2gm(654.321,grad=,min=), grad, min;
254.321 254 19.26
; print g2gm(-654.321,grad=,min=), grad, min;
145.679 145 40.74
; print g2gm(400.321,grad=,min=), grad, min;
0.321 0 19.26
/* certain non-default rounding modes can return negative values */
; print g2gm(654.321,grad=,min=,1), grad, min;
-145.679 -145 -40.74
; print g2gm(-654.321,grad=,min=,1), grad, min;
-254.321 -254 -19.26
; print g2gm(400.321,grad=,min=,1), grad, min;
-399.679 -399 -40.74
LIMITS
none
LINK LIBRARY
none
SEE ALSO
config, d2dm, d2dms, dm2d, dms2d, g2gms, gm2g, gms2g,
h2hm, h2hms, hm2d, hms2d, mod
## 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/09/25 17:24: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/

132
help/g2gms Normal file
View File

@@ -0,0 +1,132 @@
NAME
g2gms - convert gradians into gradians, minutes, and seconds
SYNOPSIS
g2gms(grads, g, m, s [,rnd])
TYPES
grads real
g null-or-real-valued lvalue with assign-to permission
m null-or-real-valued lvalue with assign-to permission
s null-or-real-valued lvalue with assign-to permission
rnd nonnegative integer, defaults to config("mod")
return mod(grads, 400, rnd)
DESCRIPTION
Convert grads gradians into g gradians, m minutes, and s seconds.
The return value is a normalized number of gradians, and is equivalent
to the following:
return_value = mod(grads, 400, rnd);
The argument rnd, if not given, defaults to config("mod").
For more information on the effects of rnd, see "help mod".
Depending on the rounding mode, the return could be a real value
in the interval [0, 400) or a real value in the interval (-400, 0].
For the default round mode, the return value is in the interval [0, 400).
The g argument will be an integer number of gradians.
The value g will be set as if the following were used:
g = int(return_value);
For some rounding modes, g will be an integer in the interval [0, 400).
For other rounding modes, g will be an integer in the interval (-400, 0].
For the default round mode, g is in the interval [0, 400).
The m argument will be an integer number of minutes.
The value m will be set as if the following were used:
tmp = return_value - g;
tmp_m = tmp * 60;
free(tmp);
m = int(tmp_m);
For some rounding modes, m will be an integer in the interval [0, 60).
For other rounding modes, m will be an integer in the interval (-60, 0].
For the default round mode, m will be in the interval [0, 60).
The s argument will be a real number of seconds.
The value s will be set as if the following were used:
tmp = tmp_m - m;
free(tmp_m);
s = tmp * 60;
free(tmp);
For some rounding modes, s will be a real value in the interval [0, 60).
For other rounding modes, s will be a real value in the interval (-60, 0].
For the default round mode, s will be in the interval [0, 60).
The following shows relationship between the return value and the resulting
g, m, and s values:
return_value == g + m/60 + s/3600;
EXAMPLE
/* if args are undefined, pre-declare them or assign them as args */
; global g, m, s;
; print g2gms(12.3456,g,m,s), g, m, s;
12.3456 12 20 44.16
; print g2gms(1234.5678,g,m,s), g, m, s;
34.5678 34 34 4.08
; print g2gms(-1234.5678,g,m,s), g, m, s;
365.4322 365 25 55.92
; print g2gms(654.321,grad=,min=,sec=), grad, min, sec;
254.321 254 19 15.6
; print g2gms(-654.321,grad=,min=,sec=), grad, min, sec;
145.679 145 40 44.4
; print g2gms(400.321,grad=,min=,sec=), grad, min, sec;
0.321 0 19 15.6
/* certain non-default rounding modes can return negative values */
; print g2gms(654.321,grad=,min=,sec=,1), grad, min, sec;
-145.679 -145 -40 -44.4
; print g2gms(-654.321,grad=,min=,sec=,1), grad, min, sec;
-254.321 -254 -19 -15.6
; print g2gms(400.321,grad=,min=,sec=,1), grad, min, sec;
-399.679 -399 -40 -44.4
LIMITS
none
LINK LIBRARY
none
SEE ALSO
config, d2dm, d2dms, dm2d, dms2d, g2gm, gm2g, gms2g,
h2hm, h2hms, hm2d, hms2d, mod
## 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/09/25 17:24: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/

59
help/g2r Normal file
View File

@@ -0,0 +1,59 @@
NAME
g2r - convert gradians to radians
SYNOPSIS
g2r(x [,eps])
TYPES
x number (real or complex)
eps nonzero real, defaults to epsilon()
return number
DESCRIPTION
Given x gradians, return the equivalent number of radians.
The eps controls the precision of the calculated internal
constant pi / 200.
EXAMPLE
; print g2r(50), g2r(200), g2r(50)
~0.78539816339744830962 3.14159265358979323846 ~0.78539816339744830962
; print g2r(3i+2)
~0.03141592653589793238+~0.04712388980384689858i
; print sin(g2r(100/3)), cos(g2r(200/3)), tan(g2r(50))
0.5 0.5 1
LIMITS
eps > 0
LINK LIBRARY
NUMBER *qpidiv200(NUMBER *eps)
SEE ALSO
d2r, r2d, r2g, d2g, g2d,
sin, cos, tan, sec, csc, cot, epsilon
## 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/09/07 12:04:28
## 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/

84
help/gms2g Normal file
View File

@@ -0,0 +1,84 @@
NAME
gm2g, gms2g - convert gradians, minutes, and seconds to gradians
SYNOPSIS
gm2g(d, m [,rnd])
gms2g(d, m, s [,rnd])
TYPES
d real
m real
s real (defauls to 0)
rnd nonnegative integer, defaults to config("mod")
return gradians
DESCRIPTION
Convert gradians, m minutes, and s seconds returning gradians.
The return value in gradians, is quivalent to the following:
mod(d + m/60 + s/4000, 400, rnd);
Depending on the rounding mode, the return could be a real value
in the interval [0, 400) or a real value in the interval (-400, 0].
For the default round mode, the return value is in the interval [0, 400).
A missing rnd defaults to config("mod").
For more information on the effects of rnd, see "help mod".
The gm2g(d, m, rnd) builtin is an alias for gms2g(d, m, 0, rnd).
EXAMPLE
; print gm2g(203, 325.5594);
208.42599
; print gm2g(4001, -25.5594);
0.57401
; print gm2g(-923, -25.5594);
276.57401
; print gms2g(12, 20, 44.16);
12.3456
; print gms2g(123.456, -345.68, 4.08);
117.6958
; print gms2g(-65, -40, -44.4);
334.321
; print gm2g(203, 325.5594, 1);
-191.57401
; print gms2g(12, 20, 44.16, 1);
-387.6544
LIMITS
none
LINK LIBRARY
none
SEE ALSO
config, d2dm, d2dms, dm2d, dms2d, g2gm, g2gms, gm2g, gms2g,
h2hm, h2hms, hm2d, hms2d, mod
## 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/09/25 17:24: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/

117
help/h2hm Normal file
View File

@@ -0,0 +1,117 @@
NAME
h2hm - convert hours into hours, and minutes
SYNOPSIS
h2hm(hours, h, m [,rnd])
TYPES
hours real
h null-or-real-valued lvalue with assign-to permission
m null-or-real-valued lvalue with assign-to permission
rnd nonnegative integer, defaults to config("mod")
return mod(hours, 24, rnd)
DESCRIPTION
Convert hours hours into h hours, and m minutes.
The return value is a normalized number of hours, and is equivalent
to the following:
return_value = mod(hours, 24, rnd);
The argument rnd, if not given, defaults to config("mod").
For more information on the effects of rnd, see "help mod".
Depending on the rounding mode, the return could be a real value
in the interval [0, 24) or a real value in the interval (-24, 0].
For the default round mode, the return value is in the interval [0, 24).
The h argument will be an integer number of hours.
The value h will be set as if the following were used:
h = int(return_value);
For some rounding modes, h will be an integer in the interval [0, 24).
For other rounding modes, h will be an integer in the interval (-24, 0].
For the default round mode, h is in the interval [0, 24).
The m argument will be a real number of minutes.
The value m will be set as if the following were used:
tmp = return_value - h;
m = tmp * 60;
free(tmp);
For some rounding modes, m will be a real value in the interval [0, 60).
For other rounding modes, m will be a real value in the interval (-60, 0].
For the default round mode, m will be in the interval [0, 60).
The following shows relationship between the return value and the resulting
h, and m values:
return_value == h + m/60;
EXAMPLE
/* if args are undefined, pre-declare them or assign them as args */
; global h, m;
; print h2hm(12.3456,h,m), h, m;
12.3456 12 20.736
; print h2hm(1234.5678,h,m), h, m;
10.5678 10 34.068
; print h2hm(-1234.5678,h,m), h, m;
13.4322 13 25.932
; print h2hm(654.321,hour=,min=), hour, min;
6.321 6 19.26
; print h2hm(-654.321,hour=,min=), hour, min;
17.679 17 40.74
; print h2hm(24.321,hour=,min=), hour, min;
0.321 0 19.26
/* certain non-default rounding modes can return negative values */
; print h2hm(654.321,hour=,min=,1), hour, min;
-17.679 -17 -40.74
; print h2hm(-654.321,hour=,min=,1), hour, min;
-6.321 -6 -19.26
; print h2hm(24.321,hour=,min=,1), hour, min;
-23.679 -23 -40.7
LIMITS
none
LINK LIBRARY
none
SEE ALSO
config, d2dm, d2dms, dm2d, dms2d, g2gm, g2gms, gm2g, gms2g,
h2hms, hm2d, hms2d, mod
## 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/09/25 17:24: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/

132
help/h2hms Normal file
View File

@@ -0,0 +1,132 @@
NAME
h2hms - convert hours into hours, minutes, and seconds
SYNOPSIS
h2hms(hours, h, m, s [,rnd])
TYPES
hours real
h null-or-real-valued lvalue with assign-to permission
m null-or-real-valued lvalue with assign-to permission
s null-or-real-valued lvalue with assign-to permission
rnd nonnegative integer, defaults to config("mod")
return mod(hours, 24, rnd)
DESCRIPTION
Convert hours hours into h hours, m minutes, and s seconds.
The return value is a normalized number of hours, and is equivalent
to the following:
return_value = mod(hours, 24, rnd);
The argument rnd, if not given, defaults to config("mod").
For more information on the effects of rnd, see "help mod".
Depending on the rounding mode, the return could be a real value
in the interval [0, 24) or a real value in the interval (-24, 0].
For the default round mode, the return value is in the interval [0, 24).
The h argument will be an integer number of hours.
The value h will be set as if the following were used:
h = int(return_value);
For some rounding modes, h will be an integer in the interval [0, 24).
For other rounding modes, h will be an integer in the interval (-24, 0].
For the default round mode, h is in the interval [0, 24).
The m argument will be an integer number of minutes.
The value m will be set as if the following were used:
tmp = return_value - h;
tmp_m = tmp * 60;
free(tmp);
m = int(tmp_m);
For some rounding modes, m will be an integer in the interval [0, 60).
For other rounding modes, m will be an integer in the interval (-60, 0].
For the default round mode, m will be in the interval [0, 60).
The s argument will be a real number of seconds.
The value s will be set as if the following were used:
tmp = tmp_m - m;
free(tmp_m);
s = tmp * 60;
free(tmp);
For some rounding modes, s will be a real value in the interval [0, 60).
For other rounding modes, s will be a real value in the interval (-60, 0].
For the default round mode, s will be in the interval [0, 60).
The following shows relationship between the return value and the resulting
h, m, and s values:
return_value == h + m/60 + s/3600;
EXAMPLE
/* if args are undefined, pre-declare them or assign them as args */
; global h, m, s;
; print h2hms(12.3456,h,m,s), h, m, s;
12.3456 12 20 44.16
; print h2hms(1234.5678,h,m,s), h, m, s;
10.5678 10 34 4.08
; print h2hms(-1234.5678,h,m,s), h, m, s;
13.4322 13 25 55.92
; print h2hms(654.321,hour=,min=,sec=), hour, min, sec;
6.321 6 19 15.6
; print h2hms(-654.321,hour=,min=,sec=), hour, min, sec;
17.679 17 40 44.4
; print h2hms(24.321,hour=,min=,sec=), hour, min, sec;
0.321 0 19 15.6
/* certain non-default rounding modes can return negative values */
; print h2hms(654.321,hour=,min=,sec=,1), hour, min, sec;
-17.679 -17 -40 -44.4
; print h2hms(-654.321,hour=,min=,sec=,1), hour, min, sec;
-6.321 -6 -19 -15.6
; print h2hms(24.321,hour=,min=,sec=,1), hour, min, sec;
-23.679 -23 -40 -44.4
LIMITS
none
LINK LIBRARY
none
SEE ALSO
config, d2dm, d2dms, dm2d, dms2d, g2gm, g2gms, gm2g, gms2g,
h2hm, hm2d, hms2d, mod
## 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/09/25 17:24: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/

84
help/hms2h Normal file
View File

@@ -0,0 +1,84 @@
NAME
hm2h, hms2h - convert hours, minutes, and seconds to hours
SYNOPSIS
hm2h(h, m [,rnd])
hms2h(h, m, s [,rnd])
TYPES
h real
m real
s real (defauls to 0)
rnd nonnegative integer, defaults to config("mod")
return hours
DESCRIPTION
Convert hours, m minutes, and s seconds returning hours.
The return value in hours, is quivalent to the following:
mod(h + m/60 + s/3600, 24, rnd);
Depending on the rounding mode, the return could be a real value
in the interval [0, 24) or a real value in the interval (-24, 0].
For the default round mode, the return value is in the interval [0, 24).
A missing rnd defaults to config("mod").
For more information on the effects of rnd, see "help mod".
The hm2h(h, m, rnd) builtin is an alias for hms2h(h, m, 0, rnd).
EXAMPLE
; print hm2h(203, 325.5594);
16.42599
; print hm2h(241, -25.5594);
0.57401
; print hm2h(-923, -25.5594);
12.57401
; print hms2h(12, 20, 44.16);
12.3456
; print hms2h(123.456, -345.68, 4.08);
21.6958
; print hms2h(-65, -40, -44.4);
6.321
; print hm2h(203, 325.5594, 1);
-7.57401
; print hms2h(12, 20, 44.16, 1);
-11.6544
LIMITS
none
LINK LIBRARY
none
SEE ALSO
config, d2dm, d2dms, dm2d, dms2d, g2gm, g2gms, gm2g, gms2g,
h2hm, h2hms, hm2d, hms2d, mod
## 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/09/25 17:24: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/

View File

@@ -2,7 +2,7 @@ NAME
mod - compute the remainder for an integer quotient
SYNOPSIS
mod(x, y, rnd)
mod(x, y [,rnd])
x % y
TYPES

View File

@@ -2,7 +2,7 @@ NAME
quo - compute integer quotient of a value by a real number
SYNOPSIS
quo(x, y, rnd) or x // y
quo(x, y [,rnd]) or x // y
TYPES
If x is a matrix or list, the returned value is a matrix or list v of

57
help/r2d Normal file
View File

@@ -0,0 +1,57 @@
NAME
r2d - convert radians to degrees
SYNOPSIS
r2d(x [,eps])
TYPES
x number (real or complex)
eps nonzero real, defaults to epsilon()
return number
DESCRIPTION
Given x radians, return the equivalent number of degrees.
The eps controls the precision of the calculated internal
constant pi / 180.
EXAMPLE
; pi = pi(1e-20)
; print r2d(pi), r2d(pi/3), r2d(2*pi)
180 60 360
; print r2d(pi+4i), r2d(pi/3 + 1i*pi), r2d(pi/5 + 5i*pi)
180+~229.18311805232928350739i 60+180, 36+900i
LIMITS
eps > 0
LINK LIBRARY
NUMBER *qpidiv180(NUMBER *eps)
SEE ALSO
d2r, g2r, r2g, d2g, g2d,
sin, cos, tan, sec, csc, cot, epsilon
## 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/09/07 12:04:28
## 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/

57
help/r2g Normal file
View File

@@ -0,0 +1,57 @@
NAME
r2g - convert radians to gradians
SYNOPSIS
r2g(x [,eps])
TYPES
x number (real or complex)
eps nonzero real, defaults to epsilon()
return number
DESCRIPTION
Given x radians, return the equivalent number of gradians.
The eps controls the precision of the calculated internal
constant pi / 200.
EXAMPLE
; pi = pi()
; print r2g(pi), r2g(pi/3), r2g(2*pi)
200 ~66.66666666666666666667 400
; print r2g(pi+4i), r2g(pi/4 + 1i*pi), r2g(pi/5 + 5i*pi)
200+~254.64790894703253723043i 50+200i 40+1000i
LIMITS
eps > 0
LINK LIBRARY
NUMBER *qpidiv200(NUMBER *eps)
SEE ALSO
d2r, r2d, g2r, d2g, g2d,
sin, cos, tan, sec, csc, cot, epsilon
## 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/09/07 12:04:28
## 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

@@ -123,7 +123,7 @@ Calc shell scripts
calc "-q -s" $* << +
global i, n, s;
n = argv();
for (i = 0; i < n; i++)
for (i = 1; i < n; i++)
s += eval(argv(i));
print "sum =", s;
+
@@ -133,20 +133,24 @@ Calc shell scripts
./addall2 2 3 4
the $* in this script expands to 2 3 4, and because of the "-s"
in the options, calc starts with argv(0) = "2", argv(1) = "3",
argv(2)= "4". As there is only one calc process involved and
in the options, calc starts with argv(1) = "2", argv(2) = "3",
argv(3)= "4". As there is only one calc process involved and
the eval() function accepts as argument any string that
represents the body of a calc function, the strings argv(0),
argv(1), ... could evaluate to any value types for which the
represents the body of a calc function, the strings argv(1),
argv(2), ... could evaluate to any value types for which the
additions to be performed are defined, and variables defined in
one argv() can be used in later arguments.
In case you are wondering, argv(0) returns the program
or calc script name. In the case of the above example,
argv(0) = "./addall2".
For systems that support interpreter files, essentially the
same thing may be done more efficiently by using calc as an
interpreter. Assuming the full path for calc is
/usr/local/bin/calc, one could use the file addall3 with contents
#!/usr/bin/calc -q -s -f
#!/usr/bin/calc -q -f
global i, n, s;
n = argv();
for (i = 1; i < n; i++)
@@ -161,9 +165,9 @@ Calc shell scripts
After the command:
addall3 2 3 4
./addall3 2 3 4
the arguments calc receives are argv(0) = "addall3", argv(1) =
the arguments calc receives are argv(0) = "./addall3", argv(1) =
"2", argv(3) = "3", argv(4) = "4".
Another kind of script that can be useful is sqrts1:

View File

@@ -26,6 +26,8 @@ EXAMPLE
strcmp("abc", "abb") == 1
strcmp("abc", "abc") == 0
strcmp("abc", "abd") == -1
strcmp("desk", "Shabisky") == 1
strcmp("Shabisky", "desk") == -1
strcmp("abc\0", "abc") == 1
strcmp("a\0b", "a\0c") == -1
@@ -39,7 +41,7 @@ SEE ALSO
strcat, strcpy, strerror, strlen, strncmp, strncpy, strpos,
strprintf, strscan, strscanf, substr
## 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

View File

@@ -228,7 +228,7 @@ Unexpected
1<<8/2
evalues to 128, not 16, because <<8 is performed before the /2.
evaluates to 128, not 16, because <<8 is performed before the /2.
&A[0] and A are different things in calc
@@ -529,6 +529,34 @@ Unexpected
; help fclose
trig functions use only radians
===============================
Some might be surprised to discover that all of the trigonometric in calc:
sin, cos, tan, sec, csc, cot
asin, acos, atan, asec, acsc, acot
work in only radians.
Calc as builtin functions to convert between degrees, radians and gradians:
d2r(deg) - given degrees returns radians
g2r(grad) - given gradians returns radians
r2d(rad) - given radians returns degrees
g2d(grad) - given gradians returns degrees
r2g(rad) - given radians returns gradians
d2g(deg) - given degrees returns gradians
For example, if you want to take the sin of 30 degrees, convert
the 30 degrees into radians and pass the result to sin():
; print sin(d2r(30))
0.5
## Copyright (C) 1999-2007,2014,2017,2021 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -119,6 +119,7 @@ char *program = "calc"; /* our name */
char *base_name = "calc"; /* basename of our name */
char cmdbuf[MAXCMD+1+1+1]; /* command line expression + "\n\0" + guard */
run run_state = RUN_ZERO; /* calc startup run state */
char *script_name = NULL; /* program name or -f filename arg or NULL */
/*
@@ -614,6 +615,14 @@ libcalc_call_me_last(void)
*/
random_libcalc_cleanup();
/*
* free script_name
*/
if (script_name != NULL) {
free(script_name);
script_name = NULL;
}
/*
* restore all changed descriptor states
*/

View File

@@ -1,5 +1,5 @@
/*
* math_error - a simple libcalc math error routine
* lib_calc - calc link library initialization and shutdown routines
*
* Copyright (C) 1999-2007,2014,2021 Landon Curt Noll
*

31
qio.c
View File

@@ -247,6 +247,37 @@ qprintnum(NUMBER *q, int outmode, LEN outdigits)
PRINTF1("e%ld", exp);
break;
case MODE_ENG:
if (qiszero(q)) {
PUTCHAR('0');
return;
}
tmpval = *q;
tmpval.num.sign = 0;
exp = qilog10(&tmpval);
if (exp == 0) { /* in range to output as real */
qprintnum(q, MODE_REAL, outdigits);
return;
}
tmpval.num = _one_;
tmpval.den = _one_;
if (exp > 0) {
exp -= exp % 3;
ztenpow(exp, &tmpval.den);
} else {
long remainder = exp % 3;
if (remainder)
exp -= remainder + 3;
ztenpow(-exp, &tmpval.num);
}
q = qmul(q, &tmpval);
zfree(tmpval.num);
zfree(tmpval.den);
qprintnum(q, MODE_REAL, outdigits);
qfree(q);
if (exp) PRINTF1("e%ld", exp);
break;
case MODE_REAL_AUTO:
{
const int P = conf->outdigits ? conf->outdigits : 1;

18
qmath.c
View File

@@ -44,9 +44,21 @@ NUMBER _qnegone_ = { { _oneval_, 1, 1 }, { _oneval_, 1, 0 }, 1, NULL };
NUMBER _qonehalf_ = { { _oneval_, 1, 0 }, { _twoval_, 1, 0 }, 1, NULL };
NUMBER _qneghalf_ = { { _oneval_, 1, 1 }, { _twoval_, 1, 0 }, 1, NULL };
NUMBER _qonesqbase_ = { { _oneval_, 1, 0 }, { _sqbaseval_, 2, 0 }, 1, NULL };
NUMBER _qtendivnine_ = { { _tenval_, 1, 0 }, { _nineval_, 1, 0 }, 1, NULL };
NUMBER _qninedivten_ = { { _nineval_, 1, 0 }, { _tenval_, 1, 0 }, 1, NULL };
NUMBER _qthreesixty = { { _threesixtyval_, 1, 0 },
{ _oneval_, 1, 0 }, 1, NULL };
NUMBER _qfourhundred = { { _fourhundredval_, 1, 0 },
{ _oneval_, 1, 0 }, 1, NULL };
NUMBER _qtwentyfour = { { _twentyfourval_, 1, 0 },
{ _oneval_, 1, 0 }, 1, NULL };
NUMBER * initnumbs[INITCONSTCOUNT] = {&_qzero_, &_qone_, &_qtwo_, &_qthree_,
&_qfour_, &_qten_, &_qnegone_, &_qonehalf_, &_qneghalf_};
NUMBER * initnumbs[] = {&_qzero_, &_qone_, &_qtwo_, &_qthree_,
&_qfour_, &_qten_, &_qnegone_, &_qonehalf_, &_qneghalf_,
&_qonesqbase_, &_qtendivnine_, &_qninedivten_,
&_qthreesixty, &_qfourhundred, &_qtwentyfour,
NULL /* must be last */
};
/*
@@ -1478,7 +1490,7 @@ shownumbers(void)
printf("Index Links Digits Value\n");
printf("----- ----- ------ -----\n");
for (i = 0, k = 0; i < INITCONSTCOUNT; i++) {
for (i = 0, k = 0; initnumbs[i] != NULL; i++) {
count++;
vp = initnumbs[i];
printf("%6ld %4ld ", k++, vp->links);

View File

@@ -1,7 +1,7 @@
/*
* qmath - declarations for extended precision rational arithmetic
*
* Copyright (C) 1999-2007,2014 David I. Bell
* Copyright (C) 1999-2007,2014,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
@@ -35,8 +35,6 @@
#endif
#define INITCONSTCOUNT 9 /* number of initnumbs[] pre-defined constants */
/*
* Rational arithmetic definitions.
*/
@@ -213,6 +211,8 @@ E_FUNC NUMBER *qacsch(NUMBER *q, NUMBER *epsilon);
E_FUNC NUMBER *qacoth(NUMBER *q, NUMBER *epsilon);
E_FUNC NUMBER *qlegtoleg(NUMBER *q, NUMBER *epsilon, BOOL wantneg);
E_FUNC NUMBER *qpi(NUMBER *epsilon);
E_FUNC NUMBER *qpidiv180(NUMBER *epsilon);
E_FUNC NUMBER *qpidiv200(NUMBER *epsilon);
E_FUNC NUMBER *qcatalan(NUMBER *);
E_FUNC NUMBER *qbern(ZVALUE z);
E_FUNC void qfreebern(void);
@@ -273,6 +273,8 @@ static inline NUMBER* qlink(NUMBER* q) { if(q) { (q)->links++; } return q; }
*/
EXTERN NUMBER _qzero_, _qone_, _qnegone_, _qonehalf_, _qneghalf_, _qonesqbase_;
EXTERN NUMBER _qtwo_, _qthree_, _qfour_, _qten_;
EXTERN NUMBER _qtendivnine_, _qninedivten_;
EXTERN NUMBER _qthreesixty, _qfourhundred, _qtwentyfour;
EXTERN NUMBER * initnumbs[];

147
qtrans.c
View File

@@ -47,7 +47,40 @@ NUMBER _qlge_ = { { _qlgenum_, 1, 0 }, { _qlgeden_, 1, 0 }, 1, NULL };
STATIC NUMBER *ln_10 = NULL;
STATIC NUMBER *ln_10_epsilon = NULL;
STATIC NUMBER *pivalue[2];
/*
* cache pi
*
* pivalue[LAST_PI_EPSILON] - last epsilon used to calculate pi
* pivalue[LAST_PI_VALUE] - last calculated pi
* given pivalue[LAST_PI_EPSILON] epsilon
* pivalue[LAST_PI_DIV_180_EPSILON] - last epsilon used to calculate pi/180
* pivalue[LAST_PI_DIV_180_VALUE] - last calculated pi/180 given
* pivalue[LAST_PI_DIV_180_EPSILON] epsilon
* pivalue[LAST_PI_DIV_200_EPSILON] - last epsilon used to calculate pi/200
* pivalue[LAST_PI_DIV_200_VALUE] - last calculated pi/200 given
* pivalue[LAST_PI_DIV_200_EPSILON] epsilon
*/
enum pi_cache {
LAST_PI_EPSILON = 0,
LAST_PI_VALUE,
LAST_PI_DIV_180_EPSILON,
LAST_PI_DIV_180_VALUE,
LAST_PI_DIV_200_EPSILON,
LAST_PI_DIV_200_VALUE,
PI_CACHE_LEN /* must be last */
};
STATIC NUMBER *pivalue[PI_CACHE_LEN] = {
NULL, /* LAST_PI_EPSILON */
NULL, /* LAST_PI_VALUE */
NULL, /* LAST_PI_DIV_180_EPSILON */
NULL, /* LAST_PI_DIV_180_VALUE */
NULL, /* LAST_PI_DIV_200_EPSILON */
NULL, /* LAST_PI_DIV_200_VALUE */
};
/*
* other static function decls
*/
STATIC NUMBER *qexprel(NUMBER *q, long bitnum);
/*
@@ -725,16 +758,25 @@ qpi(NUMBER *epsilon)
long bits; /* needed number of bits of precision */
long t;
/* firewall */
if (qiszero(epsilon)) {
math_error("zero epsilon value for pi");
/*NOTREACHED*/
}
if (epsilon == pivalue[0])
return qlink(pivalue[1]);
if (pivalue[0]) {
qfree(pivalue[0]);
qfree(pivalue[1]);
/* use pi cache if epsilon marches, else flush if needed */
if (pivalue[LAST_PI_EPSILON] != NULL &&
pivalue[LAST_PI_VALUE] != NULL &&
epsilon == pivalue[LAST_PI_EPSILON]) {
return qlink(pivalue[LAST_PI_VALUE]);
}
if (pivalue[LAST_PI_EPSILON] != NULL) {
qfree(pivalue[LAST_PI_EPSILON]);
}
if (pivalue[LAST_PI_VALUE] != NULL) {
qfree(pivalue[LAST_PI_VALUE]);
}
bits = -qilog2(epsilon) + 4;
if (bits < 4)
bits = 4;
@@ -768,11 +810,100 @@ qpi(NUMBER *epsilon)
zfree(sum);
r = qmappr(t1, epsilon, 24L);
qfree(t1);
pivalue[0] = qlink(epsilon);
pivalue[1] = qlink(r);
pivalue[LAST_PI_EPSILON] = qlink(epsilon);
pivalue[LAST_PI_VALUE] = qlink(r);
return r;
}
/*
* qpidiv180 - calcucalte pi / 180
*
* This function returns pi/180 as used to covert between radians and degrees.
*/
NUMBER *
qpidiv180(NUMBER *epsilon)
{
NUMBER *pi, *pidiv180;
/* firewall */
if (qiszero(epsilon)) {
math_error("zero epsilon value for qpidiv180");
/*NOTREACHED*/
}
/* use pi/180 cache if epsilon marches, else flush if needed */
if (pivalue[LAST_PI_DIV_180_EPSILON] != NULL &&
pivalue[LAST_PI_DIV_180_VALUE] != NULL &&
epsilon == pivalue[LAST_PI_DIV_180_EPSILON]) {
return qlink(pivalue[LAST_PI_DIV_180_VALUE]);
}
if (pivalue[LAST_PI_DIV_180_EPSILON] != NULL) {
qfree(pivalue[LAST_PI_DIV_180_EPSILON]);
}
if (pivalue[LAST_PI_DIV_180_VALUE] != NULL) {
qfree(pivalue[LAST_PI_DIV_180_VALUE]);
}
/* let qpi() returned cached pi or calculate new as needed */
pi = qpi(epsilon);
/* calculate pi/180 */
pidiv180 = qdivi(pi, 180);
/* cache epsilon and pi/180 */
pivalue[LAST_PI_DIV_180_EPSILON] = qlink(epsilon);
pivalue[LAST_PI_DIV_180_VALUE] = qlink(pidiv180);
/* return pi/180 */
return pidiv180;
}
/*
* qpidiv200 - calcucalte pi / 200
*
* This function returns pi/200 as used to covert between radians and gradians.
*/
NUMBER *
qpidiv200(NUMBER *epsilon)
{
NUMBER *pi, *pidiv200;
/* firewall */
if (qiszero(epsilon)) {
math_error("zero epsilon value for qpidiv200");
/*NOTREACHED*/
}
/* use pi/200 cache if epsilon marches, else flush if needed */
if (pivalue[LAST_PI_DIV_200_EPSILON] != NULL &&
pivalue[LAST_PI_DIV_200_VALUE] != NULL &&
epsilon == pivalue[LAST_PI_DIV_200_EPSILON]) {
return qlink(pivalue[LAST_PI_DIV_200_VALUE]);
}
if (pivalue[LAST_PI_DIV_200_EPSILON] != NULL) {
qfree(pivalue[LAST_PI_DIV_200_EPSILON]);
}
if (pivalue[LAST_PI_DIV_200_VALUE] != NULL) {
qfree(pivalue[LAST_PI_DIV_200_VALUE]);
}
/* let qpi() returned cached pi or calculate new as needed */
pi = qpi(epsilon);
/* calculate pi/200 */
pidiv200 = qdivi(pi, 200);
/* cache epsilon and pi/200 */
pivalue[LAST_PI_DIV_200_EPSILON] = qlink(epsilon);
pivalue[LAST_PI_DIV_200_VALUE] = qlink(pidiv200);
/* return pi/200 */
return pidiv200;
}
/*
* Calculate the exponential function to the nearest or next to nearest
* multiple of the positive number epsilon.

View File

@@ -52,9 +52,9 @@ static char *program;
#define MAJOR_VER 2 /* major library version */
#define MINOR_VER 12 /* minor library version */
#define MAJOR_PATCH 9 /* major software version level */
#define MINOR_PATCH 1 /* minor software version level */
#define MINOR_VER 14 /* minor library version */
#define MAJOR_PATCH 0 /* major software version level */
#define MINOR_PATCH 6 /* minor software version level */
/*

View File

@@ -49,11 +49,12 @@ NROFF_ARG=
MANMAKE=
MANMODE=
CALCPATH=./cal
CALCRC='/lib/calc/startup:~/.calcrc:./.calcinit'
CALCRC='./.calcinit:~/.calcrc:/lib/calc/startup'
USE_READLINE=-DUSE_READLINE
READLINE_LIB=
READLINE_INCLUDE=
CALCPAGER=less.exe
CCBAN=-DUNBAN
EXT=.exe

View File

@@ -1034,7 +1034,7 @@ zgcd(ZVALUE z1, ZVALUE z2, ZVALUE *res)
}
needw = FALSE;
}
g = *a0 * w;
g = (FULL) (*a0 * w);
if (h < BASEB) {
g &= (1 << h) - 1;
} else {
@@ -1044,7 +1044,7 @@ zgcd(ZVALUE z1, ZVALUE z2, ZVALUE *res)
g = 1;
}
} else {
g = (HALF) *a0 * w;
g = (FULL) (*a0 * w);
}
a = a0;
b = b0;

View File

@@ -58,6 +58,9 @@ HALF _twentyval_[] = { 20 };
HALF _sqbaseval_[] = { 0, 1 };
HALF _pow4baseval_[] = { 0, 0, 1 };
HALF _pow8baseval_[] = { 0, 0, 0, 0, 1 };
HALF _threesixtyval_[] = { 360 };
HALF _fourhundredval_[] = { 400 };
HALF _twentyfourval_[] = { 24 };
ZVALUE zconst[] = {
{ _zeroval_, 1, 0}, { _oneval_, 1, 0}, { _twoval_, 1, 0},
@@ -66,7 +69,9 @@ ZVALUE zconst[] = {
{ _nineval_, 1, 0}, { _tenval_, 1, 0}, { _elevenval_, 1, 0},
{ _twelveval_, 1, 0}, { _thirteenval_, 1, 0}, { _fourteenval_, 1, 0},
{ _fifteenval_, 1, 0}, { _sixteenval_, 1, 0}, { _seventeenval_, 1, 0},
{ _eightteenval_, 1, 0}, { _nineteenval_, 1, 0}, { _twentyval_, 1, 0}
{ _eightteenval_, 1, 0}, { _nineteenval_, 1, 0}, { _twentyval_, 1, 0},
{ _threesixtyval_, 1, 0}, { _fourhundredval_, 1, 0},
{ _twentyfourval_, 1, 0}
};
ZVALUE _zero_ = { _zeroval_, 1, 0};

View File

@@ -594,7 +594,8 @@ E_FUNC void zredcpower(REDC *rp, ZVALUE z1, ZVALUE z2, ZVALUE *res);
#define MODE_OCTAL 6
#define MODE_BINARY 7
#define MODE_REAL_AUTO 8
#define MODE_MAX 8
#define MODE_ENG 9
#define MODE_MAX 9
#define MODE2_OFF (MODE_MAX+1)
/* XXX - perhaps we need the MODE_REAL_AUTO vs MODE_REAL as a config mode? */
@@ -647,6 +648,7 @@ EXTERN HALF _tenval_[], _elevenval_[], _twelveval_[], _thirteenval_[];
EXTERN HALF _fourteenval_[], _fifteenval_[];
EXTERN HALF _sqbaseval_[];
EXTERN HALF _fourthbaseval_[];
EXTERN HALF _threesixtyval_[], _fourhundredval_[], _twentyfourval_[];
EXTERN ZVALUE zconst[]; /* ZVALUE integers from 0 thru 15 */